Committer:
donatien
Date:
Thu May 31 15:46:30 2012 +0000
Revision:
0:e6ccf0b3d718

        

Who changed what in which revision?

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