RTOS configured for use with Networking libraries

Dependents:   EthernetHTTPClientTest

Committer:
donatien
Date:
Thu May 24 08:56:51 2012 +0000
Revision:
0:07f30e7c9897
[mbed] converted /VodafoneK3770Lib/rtos

Who changed what in which revision?

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