Committer:
PA
Date:
Thu Jun 21 14:04:44 2012 +0000
Revision:
0:7ae810ca8a42

        

Who changed what in which revision?

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