Stanislav Silnitskiy / rtos
Committer:
mailgate_user
Date:
Sun Jun 24 19:47:00 2012 +0000
Revision:
0:ea15e955433d
N threads cut down to 4, stack size cut down to 1024

Who changed what in which revision?

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