Dave Lu / Mbed 2 deprecated FYDP

Dependencies:   mbed

Fork of FYDP_Final2 by Dave Lu

Committer:
tntmarket
Date:
Wed Mar 25 11:44:05 2015 +0000
Revision:
8:3d5a84b897be
Parent:
mbed/mbed-rtos/rtx/RTX_CM_lib.h@0:21019d94ad33
lift folders

Who changed what in which revision?

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