Department of Electrical Eng University of Moratuwa / Mbed 2 deprecated Theekshana_AI_data

Dependencies:   mbed

Committer:
eembed
Date:
Fri Aug 30 11:55:47 2019 +0000
Revision:
3:a921792d9913
Parent:
0:5459cdde6298
commit before edit; ~JKD;

Who changed what in which revision?

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