Ethernetwebsoc

Dependencies:   C12832_lcd LM75B WebSocketClient mbed-rtos mbed Socket lwip-eth lwip-sys lwip

Committer:
GordonSin
Date:
Fri May 31 04:09:54 2013 +0000
Revision:
0:0ed2a7c7190c
31/5/2013;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
GordonSin 0:0ed2a7c7190c 1 /*----------------------------------------------------------------------------
GordonSin 0:0ed2a7c7190c 2 * RL-ARM - RTX
GordonSin 0:0ed2a7c7190c 3 *----------------------------------------------------------------------------
GordonSin 0:0ed2a7c7190c 4 * Name: RTX_CM_LIB.H
GordonSin 0:0ed2a7c7190c 5 * Purpose: RTX Kernel System Configuration
GordonSin 0:0ed2a7c7190c 6 * Rev.: V4.50
GordonSin 0:0ed2a7c7190c 7 *----------------------------------------------------------------------------
GordonSin 0:0ed2a7c7190c 8 *
GordonSin 0:0ed2a7c7190c 9 * Copyright (c) 1999-2009 KEIL, 2009-2012 ARM Germany GmbH
GordonSin 0:0ed2a7c7190c 10 * All rights reserved.
GordonSin 0:0ed2a7c7190c 11 * Redistribution and use in source and binary forms, with or without
GordonSin 0:0ed2a7c7190c 12 * modification, are permitted provided that the following conditions are met:
GordonSin 0:0ed2a7c7190c 13 * - Redistributions of source code must retain the above copyright
GordonSin 0:0ed2a7c7190c 14 * notice, this list of conditions and the following disclaimer.
GordonSin 0:0ed2a7c7190c 15 * - Redistributions in binary form must reproduce the above copyright
GordonSin 0:0ed2a7c7190c 16 * notice, this list of conditions and the following disclaimer in the
GordonSin 0:0ed2a7c7190c 17 * documentation and/or other materials provided with the distribution.
GordonSin 0:0ed2a7c7190c 18 * - Neither the name of ARM nor the names of its contributors may be used
GordonSin 0:0ed2a7c7190c 19 * to endorse or promote products derived from this software without
GordonSin 0:0ed2a7c7190c 20 * specific prior written permission.
GordonSin 0:0ed2a7c7190c 21 *
GordonSin 0:0ed2a7c7190c 22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
GordonSin 0:0ed2a7c7190c 23 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
GordonSin 0:0ed2a7c7190c 24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
GordonSin 0:0ed2a7c7190c 25 * ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
GordonSin 0:0ed2a7c7190c 26 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
GordonSin 0:0ed2a7c7190c 27 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
GordonSin 0:0ed2a7c7190c 28 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
GordonSin 0:0ed2a7c7190c 29 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
GordonSin 0:0ed2a7c7190c 30 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
GordonSin 0:0ed2a7c7190c 31 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
GordonSin 0:0ed2a7c7190c 32 * POSSIBILITY OF SUCH DAMAGE.
GordonSin 0:0ed2a7c7190c 33 *---------------------------------------------------------------------------*/
GordonSin 0:0ed2a7c7190c 34
GordonSin 0:0ed2a7c7190c 35 #if defined (__CC_ARM)
GordonSin 0:0ed2a7c7190c 36 #pragma O3
GordonSin 0:0ed2a7c7190c 37 #define __USED __attribute__((used))
GordonSin 0:0ed2a7c7190c 38 #elif defined (__GNUC__)
GordonSin 0:0ed2a7c7190c 39 #pragma GCC optimize ("O3")
GordonSin 0:0ed2a7c7190c 40 #define __USED __attribute__((used))
GordonSin 0:0ed2a7c7190c 41 #elif defined (__ICCARM__)
GordonSin 0:0ed2a7c7190c 42 #define __USED __root
GordonSin 0:0ed2a7c7190c 43 #endif
GordonSin 0:0ed2a7c7190c 44
GordonSin 0:0ed2a7c7190c 45
GordonSin 0:0ed2a7c7190c 46 /*----------------------------------------------------------------------------
GordonSin 0:0ed2a7c7190c 47 * Definitions
GordonSin 0:0ed2a7c7190c 48 *---------------------------------------------------------------------------*/
GordonSin 0:0ed2a7c7190c 49
GordonSin 0:0ed2a7c7190c 50 #define _declare_box(pool,size,cnt) uint32_t pool[(((size)+3)/4)*(cnt) + 3]
GordonSin 0:0ed2a7c7190c 51 #define _declare_box8(pool,size,cnt) uint64_t pool[(((size)+7)/8)*(cnt) + 2]
GordonSin 0:0ed2a7c7190c 52
GordonSin 0:0ed2a7c7190c 53 #define OS_TCB_SIZE 48
GordonSin 0:0ed2a7c7190c 54 #define OS_TMR_SIZE 8
GordonSin 0:0ed2a7c7190c 55
GordonSin 0:0ed2a7c7190c 56 #if defined (__CC_ARM) && !defined (__MICROLIB)
GordonSin 0:0ed2a7c7190c 57
GordonSin 0:0ed2a7c7190c 58 typedef void *OS_ID;
GordonSin 0:0ed2a7c7190c 59 typedef uint32_t OS_TID;
GordonSin 0:0ed2a7c7190c 60 typedef uint32_t OS_MUT[3];
GordonSin 0:0ed2a7c7190c 61 typedef uint32_t OS_RESULT;
GordonSin 0:0ed2a7c7190c 62
GordonSin 0:0ed2a7c7190c 63 #define runtask_id() rt_tsk_self()
GordonSin 0:0ed2a7c7190c 64 #define mutex_init(m) rt_mut_init(m)
GordonSin 0:0ed2a7c7190c 65 #define mutex_wait(m) os_mut_wait(m,0xFFFF)
GordonSin 0:0ed2a7c7190c 66 #define mutex_rel(m) os_mut_release(m)
GordonSin 0:0ed2a7c7190c 67
GordonSin 0:0ed2a7c7190c 68 extern OS_TID rt_tsk_self (void);
GordonSin 0:0ed2a7c7190c 69 extern void rt_mut_init (OS_ID mutex);
GordonSin 0:0ed2a7c7190c 70 extern OS_RESULT rt_mut_release (OS_ID mutex);
GordonSin 0:0ed2a7c7190c 71 extern OS_RESULT rt_mut_wait (OS_ID mutex, uint16_t timeout);
GordonSin 0:0ed2a7c7190c 72
GordonSin 0:0ed2a7c7190c 73 #define os_mut_wait(mutex,timeout) _os_mut_wait((uint32_t)rt_mut_wait,mutex,timeout)
GordonSin 0:0ed2a7c7190c 74 #define os_mut_release(mutex) _os_mut_release((uint32_t)rt_mut_release,mutex)
GordonSin 0:0ed2a7c7190c 75
GordonSin 0:0ed2a7c7190c 76 OS_RESULT _os_mut_release (uint32_t p, OS_ID mutex) __svc_indirect(0);
GordonSin 0:0ed2a7c7190c 77 OS_RESULT _os_mut_wait (uint32_t p, OS_ID mutex, uint16_t timeout) __svc_indirect(0);
GordonSin 0:0ed2a7c7190c 78
GordonSin 0:0ed2a7c7190c 79 #endif
GordonSin 0:0ed2a7c7190c 80
GordonSin 0:0ed2a7c7190c 81
GordonSin 0:0ed2a7c7190c 82 /*----------------------------------------------------------------------------
GordonSin 0:0ed2a7c7190c 83 * Global Variables
GordonSin 0:0ed2a7c7190c 84 *---------------------------------------------------------------------------*/
GordonSin 0:0ed2a7c7190c 85
GordonSin 0:0ed2a7c7190c 86 #if (OS_TIMERS != 0)
GordonSin 0:0ed2a7c7190c 87 #define OS_TASK_CNT (OS_TASKCNT + 1)
GordonSin 0:0ed2a7c7190c 88 #else
GordonSin 0:0ed2a7c7190c 89 #define OS_TASK_CNT OS_TASKCNT
GordonSin 0:0ed2a7c7190c 90 #endif
GordonSin 0:0ed2a7c7190c 91
GordonSin 0:0ed2a7c7190c 92 uint16_t const os_maxtaskrun = OS_TASK_CNT;
GordonSin 0:0ed2a7c7190c 93 uint32_t const os_rrobin = (OS_ROBIN << 16) | OS_ROBINTOUT;
GordonSin 0:0ed2a7c7190c 94 uint32_t const os_trv = OS_TRV;
GordonSin 0:0ed2a7c7190c 95 uint8_t const os_flags = OS_RUNPRIV;
GordonSin 0:0ed2a7c7190c 96
GordonSin 0:0ed2a7c7190c 97 /* Export following defines to uVision debugger. */
GordonSin 0:0ed2a7c7190c 98 __USED uint32_t const os_clockrate = OS_TICK;
GordonSin 0:0ed2a7c7190c 99 __USED uint32_t const os_timernum = 0;
GordonSin 0:0ed2a7c7190c 100
GordonSin 0:0ed2a7c7190c 101 /* Stack for the os_idle_demon */
GordonSin 0:0ed2a7c7190c 102 unsigned int idle_task_stack[OS_IDLESTKSIZE];
GordonSin 0:0ed2a7c7190c 103 unsigned short const idle_task_stack_size = OS_IDLESTKSIZE;
GordonSin 0:0ed2a7c7190c 104
GordonSin 0:0ed2a7c7190c 105 #ifndef OS_FIFOSZ
GordonSin 0:0ed2a7c7190c 106 #define OS_FIFOSZ 16
GordonSin 0:0ed2a7c7190c 107 #endif
GordonSin 0:0ed2a7c7190c 108
GordonSin 0:0ed2a7c7190c 109 /* Fifo Queue buffer for ISR requests.*/
GordonSin 0:0ed2a7c7190c 110 uint32_t os_fifo[OS_FIFOSZ*2+1];
GordonSin 0:0ed2a7c7190c 111 uint8_t const os_fifo_size = OS_FIFOSZ;
GordonSin 0:0ed2a7c7190c 112
GordonSin 0:0ed2a7c7190c 113 /* An array of Active task pointers. */
GordonSin 0:0ed2a7c7190c 114 void *os_active_TCB[OS_TASK_CNT];
GordonSin 0:0ed2a7c7190c 115
GordonSin 0:0ed2a7c7190c 116 /* User Timers Resources */
GordonSin 0:0ed2a7c7190c 117 #if (OS_TIMERS != 0)
GordonSin 0:0ed2a7c7190c 118 extern void osTimerThread (void const *argument);
GordonSin 0:0ed2a7c7190c 119 osThreadDef(osTimerThread, (osPriority)(OS_TIMERPRIO-3), 4*OS_TIMERSTKSZ);
GordonSin 0:0ed2a7c7190c 120 osThreadId osThreadId_osTimerThread;
GordonSin 0:0ed2a7c7190c 121 osMessageQDef(osTimerMessageQ, OS_TIMERCBQS, void *);
GordonSin 0:0ed2a7c7190c 122 osMessageQId osMessageQId_osTimerMessageQ;
GordonSin 0:0ed2a7c7190c 123 #else
GordonSin 0:0ed2a7c7190c 124 osThreadDef_t os_thread_def_osTimerThread = { NULL };
GordonSin 0:0ed2a7c7190c 125 osThreadId osThreadId_osTimerThread;
GordonSin 0:0ed2a7c7190c 126 osMessageQDef(osTimerMessageQ, 0, void *);
GordonSin 0:0ed2a7c7190c 127 osMessageQId osMessageQId_osTimerMessageQ;
GordonSin 0:0ed2a7c7190c 128 #endif
GordonSin 0:0ed2a7c7190c 129
GordonSin 0:0ed2a7c7190c 130
GordonSin 0:0ed2a7c7190c 131 /*----------------------------------------------------------------------------
GordonSin 0:0ed2a7c7190c 132 * RTX Optimizations (empty functions)
GordonSin 0:0ed2a7c7190c 133 *---------------------------------------------------------------------------*/
GordonSin 0:0ed2a7c7190c 134
GordonSin 0:0ed2a7c7190c 135 #if OS_ROBIN == 0
GordonSin 0:0ed2a7c7190c 136 void rt_init_robin (void) {;}
GordonSin 0:0ed2a7c7190c 137 void rt_chk_robin (void) {;}
GordonSin 0:0ed2a7c7190c 138 #endif
GordonSin 0:0ed2a7c7190c 139
GordonSin 0:0ed2a7c7190c 140 #if OS_STKCHECK == 0
GordonSin 0:0ed2a7c7190c 141 void rt_stk_check (void) {;}
GordonSin 0:0ed2a7c7190c 142 #endif
GordonSin 0:0ed2a7c7190c 143
GordonSin 0:0ed2a7c7190c 144
GordonSin 0:0ed2a7c7190c 145 /*----------------------------------------------------------------------------
GordonSin 0:0ed2a7c7190c 146 * Standard Library multithreading interface
GordonSin 0:0ed2a7c7190c 147 *---------------------------------------------------------------------------*/
GordonSin 0:0ed2a7c7190c 148
GordonSin 0:0ed2a7c7190c 149 #if defined (__CC_ARM) && !defined (__MICROLIB)
GordonSin 0:0ed2a7c7190c 150 static OS_MUT std_libmutex[OS_MUTEXCNT];
GordonSin 0:0ed2a7c7190c 151 static uint32_t nr_mutex;
GordonSin 0:0ed2a7c7190c 152
GordonSin 0:0ed2a7c7190c 153 /*--------------------------- _mutex_initialize -----------------------------*/
GordonSin 0:0ed2a7c7190c 154
GordonSin 0:0ed2a7c7190c 155 int _mutex_initialize (OS_ID *mutex) {
GordonSin 0:0ed2a7c7190c 156 /* Allocate and initialize a system mutex. */
GordonSin 0:0ed2a7c7190c 157
GordonSin 0:0ed2a7c7190c 158 if (nr_mutex >= OS_MUTEXCNT) {
GordonSin 0:0ed2a7c7190c 159 /* If you are here, you need to increase the number OS_MUTEXCNT. */
GordonSin 0:0ed2a7c7190c 160 for (;;);
GordonSin 0:0ed2a7c7190c 161 }
GordonSin 0:0ed2a7c7190c 162 *mutex = &std_libmutex[nr_mutex++];
GordonSin 0:0ed2a7c7190c 163 mutex_init (*mutex);
GordonSin 0:0ed2a7c7190c 164 return (1);
GordonSin 0:0ed2a7c7190c 165 }
GordonSin 0:0ed2a7c7190c 166
GordonSin 0:0ed2a7c7190c 167
GordonSin 0:0ed2a7c7190c 168 /*--------------------------- _mutex_acquire --------------------------------*/
GordonSin 0:0ed2a7c7190c 169
GordonSin 0:0ed2a7c7190c 170 __attribute__((used)) void _mutex_acquire (OS_ID *mutex) {
GordonSin 0:0ed2a7c7190c 171 /* Acquire a system mutex, lock stdlib resources. */
GordonSin 0:0ed2a7c7190c 172 if (runtask_id ()) {
GordonSin 0:0ed2a7c7190c 173 /* RTX running, acquire a mutex. */
GordonSin 0:0ed2a7c7190c 174 mutex_wait (*mutex);
GordonSin 0:0ed2a7c7190c 175 }
GordonSin 0:0ed2a7c7190c 176 }
GordonSin 0:0ed2a7c7190c 177
GordonSin 0:0ed2a7c7190c 178
GordonSin 0:0ed2a7c7190c 179 /*--------------------------- _mutex_release --------------------------------*/
GordonSin 0:0ed2a7c7190c 180
GordonSin 0:0ed2a7c7190c 181 __attribute__((used)) void _mutex_release (OS_ID *mutex) {
GordonSin 0:0ed2a7c7190c 182 /* Release a system mutex, unlock stdlib resources. */
GordonSin 0:0ed2a7c7190c 183 if (runtask_id ()) {
GordonSin 0:0ed2a7c7190c 184 /* RTX runnning, release a mutex. */
GordonSin 0:0ed2a7c7190c 185 mutex_rel (*mutex);
GordonSin 0:0ed2a7c7190c 186 }
GordonSin 0:0ed2a7c7190c 187 }
GordonSin 0:0ed2a7c7190c 188
GordonSin 0:0ed2a7c7190c 189 #endif
GordonSin 0:0ed2a7c7190c 190
GordonSin 0:0ed2a7c7190c 191
GordonSin 0:0ed2a7c7190c 192 /*----------------------------------------------------------------------------
GordonSin 0:0ed2a7c7190c 193 * RTX Startup
GordonSin 0:0ed2a7c7190c 194 *---------------------------------------------------------------------------*/
GordonSin 0:0ed2a7c7190c 195
GordonSin 0:0ed2a7c7190c 196 /* Main Thread definition */
GordonSin 0:0ed2a7c7190c 197 extern int main (void);
GordonSin 0:0ed2a7c7190c 198 osThreadDef_t os_thread_def_main = {(os_pthread)main, osPriorityNormal, 0, NULL};
GordonSin 0:0ed2a7c7190c 199
GordonSin 0:0ed2a7c7190c 200 #if defined (__CC_ARM)
GordonSin 0:0ed2a7c7190c 201
GordonSin 0:0ed2a7c7190c 202 // This define should be probably moved to the CMSIS layer
GordonSin 0:0ed2a7c7190c 203 #ifdef TARGET_LPC1768
GordonSin 0:0ed2a7c7190c 204 #define INITIAL_SP (0x10008000UL)
GordonSin 0:0ed2a7c7190c 205
GordonSin 0:0ed2a7c7190c 206 #elif TARGET_LPC11U24
GordonSin 0:0ed2a7c7190c 207 #define INITIAL_SP (0x10001000UL)
GordonSin 0:0ed2a7c7190c 208
GordonSin 0:0ed2a7c7190c 209 #endif
GordonSin 0:0ed2a7c7190c 210
GordonSin 0:0ed2a7c7190c 211 extern unsigned char Image$$RW_IRAM1$$ZI$$Limit[];
GordonSin 0:0ed2a7c7190c 212
GordonSin 0:0ed2a7c7190c 213 void set_main_stack(void) {
GordonSin 0:0ed2a7c7190c 214 // Leave OS_SCHEDULERSTKSIZE words for the scheduler and interrupts
GordonSin 0:0ed2a7c7190c 215 os_thread_def_main.stack_pointer = Image$$RW_IRAM1$$ZI$$Limit;
GordonSin 0:0ed2a7c7190c 216 os_thread_def_main.stacksize = (INITIAL_SP - (unsigned int)Image$$RW_IRAM1$$ZI$$Limit) - (OS_SCHEDULERSTKSIZE * 4);
GordonSin 0:0ed2a7c7190c 217 }
GordonSin 0:0ed2a7c7190c 218
GordonSin 0:0ed2a7c7190c 219 #ifdef __MICROLIB
GordonSin 0:0ed2a7c7190c 220 void _main_init (void) __attribute__((section(".ARM.Collect$$$$000000FF")));
GordonSin 0:0ed2a7c7190c 221 void _main_init (void) {
GordonSin 0:0ed2a7c7190c 222 osKernelInitialize();
GordonSin 0:0ed2a7c7190c 223 set_main_stack();
GordonSin 0:0ed2a7c7190c 224 osThreadCreate(&os_thread_def_main, NULL);
GordonSin 0:0ed2a7c7190c 225 osKernelStart();
GordonSin 0:0ed2a7c7190c 226 for (;;);
GordonSin 0:0ed2a7c7190c 227 }
GordonSin 0:0ed2a7c7190c 228 #else
GordonSin 0:0ed2a7c7190c 229
GordonSin 0:0ed2a7c7190c 230 /* The single memory model is checking for stack collision at run time, verifing
GordonSin 0:0ed2a7c7190c 231 that the heap pointer is underneath the stack pointer.
GordonSin 0:0ed2a7c7190c 232
GordonSin 0:0ed2a7c7190c 233 With the RTOS there is not only one stack above the heap, there are multiple
GordonSin 0:0ed2a7c7190c 234 stacks and some of them are underneath the heap pointer.
GordonSin 0:0ed2a7c7190c 235 */
GordonSin 0:0ed2a7c7190c 236 #pragma import(__use_two_region_memory)
GordonSin 0:0ed2a7c7190c 237
GordonSin 0:0ed2a7c7190c 238 __asm void __rt_entry (void) {
GordonSin 0:0ed2a7c7190c 239
GordonSin 0:0ed2a7c7190c 240 IMPORT __user_setup_stackheap
GordonSin 0:0ed2a7c7190c 241 IMPORT __rt_lib_init
GordonSin 0:0ed2a7c7190c 242 IMPORT os_thread_def_main
GordonSin 0:0ed2a7c7190c 243 IMPORT osKernelInitialize
GordonSin 0:0ed2a7c7190c 244 IMPORT set_main_stack
GordonSin 0:0ed2a7c7190c 245 IMPORT osKernelStart
GordonSin 0:0ed2a7c7190c 246 IMPORT osThreadCreate
GordonSin 0:0ed2a7c7190c 247 IMPORT exit
GordonSin 0:0ed2a7c7190c 248
GordonSin 0:0ed2a7c7190c 249 BL __user_setup_stackheap
GordonSin 0:0ed2a7c7190c 250 MOV R1,R2
GordonSin 0:0ed2a7c7190c 251 BL __rt_lib_init
GordonSin 0:0ed2a7c7190c 252 BL osKernelInitialize
GordonSin 0:0ed2a7c7190c 253 BL set_main_stack
GordonSin 0:0ed2a7c7190c 254 LDR R0,=os_thread_def_main
GordonSin 0:0ed2a7c7190c 255 MOVS R1,#0
GordonSin 0:0ed2a7c7190c 256 BL osThreadCreate
GordonSin 0:0ed2a7c7190c 257 BL osKernelStart
GordonSin 0:0ed2a7c7190c 258 BL exit
GordonSin 0:0ed2a7c7190c 259
GordonSin 0:0ed2a7c7190c 260 ALIGN
GordonSin 0:0ed2a7c7190c 261 }
GordonSin 0:0ed2a7c7190c 262 #endif
GordonSin 0:0ed2a7c7190c 263
GordonSin 0:0ed2a7c7190c 264 #elif defined (__GNUC__)
GordonSin 0:0ed2a7c7190c 265
GordonSin 0:0ed2a7c7190c 266 #ifdef __CS3__
GordonSin 0:0ed2a7c7190c 267
GordonSin 0:0ed2a7c7190c 268 /* CS3 start_c routine.
GordonSin 0:0ed2a7c7190c 269 *
GordonSin 0:0ed2a7c7190c 270 * Copyright (c) 2006, 2007 CodeSourcery Inc
GordonSin 0:0ed2a7c7190c 271 *
GordonSin 0:0ed2a7c7190c 272 * The authors hereby grant permission to use, copy, modify, distribute,
GordonSin 0:0ed2a7c7190c 273 * and license this software and its documentation for any purpose, provided
GordonSin 0:0ed2a7c7190c 274 * that existing copyright notices are retained in all copies and that this
GordonSin 0:0ed2a7c7190c 275 * notice is included verbatim in any distributions. No written agreement,
GordonSin 0:0ed2a7c7190c 276 * license, or royalty fee is required for any of the authorized uses.
GordonSin 0:0ed2a7c7190c 277 * Modifications to this software may be copyrighted by their authors
GordonSin 0:0ed2a7c7190c 278 * and need not follow the licensing terms described here, provided that
GordonSin 0:0ed2a7c7190c 279 * the new terms are clearly indicated on the first page of each file where
GordonSin 0:0ed2a7c7190c 280 * they apply.
GordonSin 0:0ed2a7c7190c 281 */
GordonSin 0:0ed2a7c7190c 282
GordonSin 0:0ed2a7c7190c 283 #include "cs3.h"
GordonSin 0:0ed2a7c7190c 284
GordonSin 0:0ed2a7c7190c 285 extern void __libc_init_array (void);
GordonSin 0:0ed2a7c7190c 286
GordonSin 0:0ed2a7c7190c 287 __attribute ((noreturn)) void __cs3_start_c (void){
GordonSin 0:0ed2a7c7190c 288 unsigned regions = __cs3_region_num;
GordonSin 0:0ed2a7c7190c 289 const struct __cs3_region *rptr = __cs3_regions;
GordonSin 0:0ed2a7c7190c 290
GordonSin 0:0ed2a7c7190c 291 /* Initialize memory */
GordonSin 0:0ed2a7c7190c 292 for (regions = __cs3_region_num, rptr = __cs3_regions; regions--; rptr++) {
GordonSin 0:0ed2a7c7190c 293 long long *src = (long long *)rptr->init;
GordonSin 0:0ed2a7c7190c 294 long long *dst = (long long *)rptr->data;
GordonSin 0:0ed2a7c7190c 295 unsigned limit = rptr->init_size;
GordonSin 0:0ed2a7c7190c 296 unsigned count;
GordonSin 0:0ed2a7c7190c 297
GordonSin 0:0ed2a7c7190c 298 if (src != dst)
GordonSin 0:0ed2a7c7190c 299 for (count = 0; count != limit; count += sizeof (long long))
GordonSin 0:0ed2a7c7190c 300 *dst++ = *src++;
GordonSin 0:0ed2a7c7190c 301 else
GordonSin 0:0ed2a7c7190c 302 dst = (long long *)((char *)dst + limit);
GordonSin 0:0ed2a7c7190c 303 limit = rptr->zero_size;
GordonSin 0:0ed2a7c7190c 304 for (count = 0; count != limit; count += sizeof (long long))
GordonSin 0:0ed2a7c7190c 305 *dst++ = 0;
GordonSin 0:0ed2a7c7190c 306 }
GordonSin 0:0ed2a7c7190c 307
GordonSin 0:0ed2a7c7190c 308 /* Run initializers. */
GordonSin 0:0ed2a7c7190c 309 __libc_init_array ();
GordonSin 0:0ed2a7c7190c 310
GordonSin 0:0ed2a7c7190c 311 osKernelInitialize();
GordonSin 0:0ed2a7c7190c 312 osThreadCreate(&os_thread_def_main, NULL);
GordonSin 0:0ed2a7c7190c 313 osKernelStart();
GordonSin 0:0ed2a7c7190c 314 for (;;);
GordonSin 0:0ed2a7c7190c 315 }
GordonSin 0:0ed2a7c7190c 316
GordonSin 0:0ed2a7c7190c 317 #else
GordonSin 0:0ed2a7c7190c 318
GordonSin 0:0ed2a7c7190c 319 __attribute__((naked)) void software_init_hook (void) {
GordonSin 0:0ed2a7c7190c 320 __asm (
GordonSin 0:0ed2a7c7190c 321 ".syntax unified\n"
GordonSin 0:0ed2a7c7190c 322 ".thumb\n"
GordonSin 0:0ed2a7c7190c 323 "movs r0,#0\n"
GordonSin 0:0ed2a7c7190c 324 "movs r1,#0\n"
GordonSin 0:0ed2a7c7190c 325 "mov r4,r0\n"
GordonSin 0:0ed2a7c7190c 326 "mov r5,r1\n"
GordonSin 0:0ed2a7c7190c 327 "ldr r0,= __libc_fini_array\n"
GordonSin 0:0ed2a7c7190c 328 "bl atexit\n"
GordonSin 0:0ed2a7c7190c 329 "bl __libc_init_array\n"
GordonSin 0:0ed2a7c7190c 330 "mov r0,r4\n"
GordonSin 0:0ed2a7c7190c 331 "mov r1,r5\n"
GordonSin 0:0ed2a7c7190c 332 "bl osKernelInitialize\n"
GordonSin 0:0ed2a7c7190c 333 "ldr r0,=os_thread_def_main\n"
GordonSin 0:0ed2a7c7190c 334 "movs r1,#0\n"
GordonSin 0:0ed2a7c7190c 335 "bl osThreadCreate\n"
GordonSin 0:0ed2a7c7190c 336 "bl osKernelStart\n"
GordonSin 0:0ed2a7c7190c 337 "bl exit\n"
GordonSin 0:0ed2a7c7190c 338 );
GordonSin 0:0ed2a7c7190c 339 }
GordonSin 0:0ed2a7c7190c 340
GordonSin 0:0ed2a7c7190c 341 #endif
GordonSin 0:0ed2a7c7190c 342
GordonSin 0:0ed2a7c7190c 343 #elif defined (__ICCARM__)
GordonSin 0:0ed2a7c7190c 344
GordonSin 0:0ed2a7c7190c 345 extern int __low_level_init(void);
GordonSin 0:0ed2a7c7190c 346 extern void __iar_data_init3(void);
GordonSin 0:0ed2a7c7190c 347 extern void exit(int arg);
GordonSin 0:0ed2a7c7190c 348
GordonSin 0:0ed2a7c7190c 349 __noreturn __stackless void __cmain(void) {
GordonSin 0:0ed2a7c7190c 350 int a;
GordonSin 0:0ed2a7c7190c 351
GordonSin 0:0ed2a7c7190c 352 if (__low_level_init() != 0) {
GordonSin 0:0ed2a7c7190c 353 __iar_data_init3();
GordonSin 0:0ed2a7c7190c 354 }
GordonSin 0:0ed2a7c7190c 355 osKernelInitialize();
GordonSin 0:0ed2a7c7190c 356 osThreadCreate(&os_thread_def_main, NULL);
GordonSin 0:0ed2a7c7190c 357 a = osKernelStart();
GordonSin 0:0ed2a7c7190c 358 exit(a);
GordonSin 0:0ed2a7c7190c 359 }
GordonSin 0:0ed2a7c7190c 360
GordonSin 0:0ed2a7c7190c 361 #endif
GordonSin 0:0ed2a7c7190c 362
GordonSin 0:0ed2a7c7190c 363
GordonSin 0:0ed2a7c7190c 364 /*----------------------------------------------------------------------------
GordonSin 0:0ed2a7c7190c 365 * end of file
GordonSin 0:0ed2a7c7190c 366 *---------------------------------------------------------------------------*/
GordonSin 0:0ed2a7c7190c 367