ProjetoBB

Dependencies:   F7_Ethernet WebSocketClient mbed mcp3008

Fork of Nucleo_F746ZG_Ethernet by Dieter Graef

Committer:
DieterGraef
Date:
Sat Jun 18 10:49:12 2016 +0000
Revision:
0:f9b6112278fe
Ethernet for the NUCLEO STM32F746 Board Testprogram uses DHCP and NTP to set the clock

Who changed what in which revision?

UserRevisionLine numberNew contents of line
DieterGraef 0:f9b6112278fe 1 /*----------------------------------------------------------------------------
DieterGraef 0:f9b6112278fe 2 * CMSIS-RTOS - RTX
DieterGraef 0:f9b6112278fe 3 *----------------------------------------------------------------------------
DieterGraef 0:f9b6112278fe 4 * Name: RTX_CM_LIB.H
DieterGraef 0:f9b6112278fe 5 * Purpose: RTX Kernel System Configuration
DieterGraef 0:f9b6112278fe 6 * Rev.: V4.79
DieterGraef 0:f9b6112278fe 7 *----------------------------------------------------------------------------
DieterGraef 0:f9b6112278fe 8 *
DieterGraef 0:f9b6112278fe 9 * Copyright (c) 1999-2009 KEIL, 2009-2015 ARM Germany GmbH
DieterGraef 0:f9b6112278fe 10 * All rights reserved.
DieterGraef 0:f9b6112278fe 11 * Redistribution and use in source and binary forms, with or without
DieterGraef 0:f9b6112278fe 12 * modification, are permitted provided that the following conditions are met:
DieterGraef 0:f9b6112278fe 13 * - Redistributions of source code must retain the above copyright
DieterGraef 0:f9b6112278fe 14 * notice, this list of conditions and the following disclaimer.
DieterGraef 0:f9b6112278fe 15 * - Redistributions in binary form must reproduce the above copyright
DieterGraef 0:f9b6112278fe 16 * notice, this list of conditions and the following disclaimer in the
DieterGraef 0:f9b6112278fe 17 * documentation and/or other materials provided with the distribution.
DieterGraef 0:f9b6112278fe 18 * - Neither the name of ARM nor the names of its contributors may be used
DieterGraef 0:f9b6112278fe 19 * to endorse or promote products derived from this software without
DieterGraef 0:f9b6112278fe 20 * specific prior written permission.
DieterGraef 0:f9b6112278fe 21 *
DieterGraef 0:f9b6112278fe 22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
DieterGraef 0:f9b6112278fe 23 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
DieterGraef 0:f9b6112278fe 24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
DieterGraef 0:f9b6112278fe 25 * ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
DieterGraef 0:f9b6112278fe 26 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
DieterGraef 0:f9b6112278fe 27 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
DieterGraef 0:f9b6112278fe 28 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
DieterGraef 0:f9b6112278fe 29 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
DieterGraef 0:f9b6112278fe 30 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
DieterGraef 0:f9b6112278fe 31 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
DieterGraef 0:f9b6112278fe 32 * POSSIBILITY OF SUCH DAMAGE.
DieterGraef 0:f9b6112278fe 33 *---------------------------------------------------------------------------*/
DieterGraef 0:f9b6112278fe 34 #include "mbed_error.h"
DieterGraef 0:f9b6112278fe 35
DieterGraef 0:f9b6112278fe 36 #if defined (__CC_ARM)
DieterGraef 0:f9b6112278fe 37 #pragma O3
DieterGraef 0:f9b6112278fe 38 #define __USED __attribute__((used))
DieterGraef 0:f9b6112278fe 39 #elif defined (__GNUC__)
DieterGraef 0:f9b6112278fe 40 #pragma GCC optimize ("O3")
DieterGraef 0:f9b6112278fe 41 #define __USED __attribute__((used))
DieterGraef 0:f9b6112278fe 42 #elif defined (__ICCARM__)
DieterGraef 0:f9b6112278fe 43 #define __USED __root
DieterGraef 0:f9b6112278fe 44 #endif
DieterGraef 0:f9b6112278fe 45
DieterGraef 0:f9b6112278fe 46
DieterGraef 0:f9b6112278fe 47 /*----------------------------------------------------------------------------
DieterGraef 0:f9b6112278fe 48 * Definitions
DieterGraef 0:f9b6112278fe 49 *---------------------------------------------------------------------------*/
DieterGraef 0:f9b6112278fe 50
DieterGraef 0:f9b6112278fe 51 #define _declare_box(pool,size,cnt) uint32_t pool[(((size)+3)/4)*(cnt) + 3]
DieterGraef 0:f9b6112278fe 52 #define _declare_box8(pool,size,cnt) uint64_t pool[(((size)+7)/8)*(cnt) + 2]
DieterGraef 0:f9b6112278fe 53
DieterGraef 0:f9b6112278fe 54 #define OS_TCB_SIZE 52
DieterGraef 0:f9b6112278fe 55 #define OS_TMR_SIZE 8
DieterGraef 0:f9b6112278fe 56
DieterGraef 0:f9b6112278fe 57 #if defined (__CC_ARM) && !defined (__MICROLIB)
DieterGraef 0:f9b6112278fe 58
DieterGraef 0:f9b6112278fe 59 typedef void *OS_ID;
DieterGraef 0:f9b6112278fe 60 typedef uint32_t OS_TID;
DieterGraef 0:f9b6112278fe 61 typedef uint32_t OS_MUT[4];
DieterGraef 0:f9b6112278fe 62 typedef uint32_t OS_RESULT;
DieterGraef 0:f9b6112278fe 63
DieterGraef 0:f9b6112278fe 64 #define runtask_id() rt_tsk_self()
DieterGraef 0:f9b6112278fe 65 #define mutex_init(m) rt_mut_init(m)
DieterGraef 0:f9b6112278fe 66 #define mutex_wait(m) os_mut_wait(m,0xFFFFU)
DieterGraef 0:f9b6112278fe 67 #define mutex_rel(m) os_mut_release(m)
DieterGraef 0:f9b6112278fe 68
DieterGraef 0:f9b6112278fe 69 extern uint8_t os_running;
DieterGraef 0:f9b6112278fe 70 extern OS_TID rt_tsk_self (void);
DieterGraef 0:f9b6112278fe 71 extern void rt_mut_init (OS_ID mutex);
DieterGraef 0:f9b6112278fe 72 extern OS_RESULT rt_mut_release (OS_ID mutex);
DieterGraef 0:f9b6112278fe 73 extern OS_RESULT rt_mut_wait (OS_ID mutex, uint16_t timeout);
DieterGraef 0:f9b6112278fe 74
DieterGraef 0:f9b6112278fe 75 #define os_mut_wait(mutex,timeout) _os_mut_wait((uint32_t)rt_mut_wait,mutex,timeout)
DieterGraef 0:f9b6112278fe 76 #define os_mut_release(mutex) _os_mut_release((uint32_t)rt_mut_release,mutex)
DieterGraef 0:f9b6112278fe 77
DieterGraef 0:f9b6112278fe 78 OS_RESULT _os_mut_release (uint32_t p, OS_ID mutex) __svc_indirect(0);
DieterGraef 0:f9b6112278fe 79 OS_RESULT _os_mut_wait (uint32_t p, OS_ID mutex, uint16_t timeout) __svc_indirect(0);
DieterGraef 0:f9b6112278fe 80
DieterGraef 0:f9b6112278fe 81 #endif
DieterGraef 0:f9b6112278fe 82
DieterGraef 0:f9b6112278fe 83
DieterGraef 0:f9b6112278fe 84 /*----------------------------------------------------------------------------
DieterGraef 0:f9b6112278fe 85 * Global Variables
DieterGraef 0:f9b6112278fe 86 *---------------------------------------------------------------------------*/
DieterGraef 0:f9b6112278fe 87
DieterGraef 0:f9b6112278fe 88 #if (OS_TASKCNT == 0)
DieterGraef 0:f9b6112278fe 89 #error "Invalid number of concurrent running threads!"
DieterGraef 0:f9b6112278fe 90 #endif
DieterGraef 0:f9b6112278fe 91
DieterGraef 0:f9b6112278fe 92 #if (OS_PRIVCNT >= OS_TASKCNT)
DieterGraef 0:f9b6112278fe 93 #error "Too many threads with user-provided stack size!"
DieterGraef 0:f9b6112278fe 94 #endif
DieterGraef 0:f9b6112278fe 95
DieterGraef 0:f9b6112278fe 96 #if (OS_TIMERS != 0)
DieterGraef 0:f9b6112278fe 97 #define OS_TASK_CNT (OS_TASKCNT + 1)
DieterGraef 0:f9b6112278fe 98 #ifndef __MBED_CMSIS_RTOS_CM
DieterGraef 0:f9b6112278fe 99 #define OS_PRIV_CNT (OS_PRIVCNT + 2)
DieterGraef 0:f9b6112278fe 100 #define OS_STACK_SZ (4*(OS_PRIVSTKSIZE+OS_MAINSTKSIZE+OS_TIMERSTKSZ))
DieterGraef 0:f9b6112278fe 101 #endif
DieterGraef 0:f9b6112278fe 102 #else
DieterGraef 0:f9b6112278fe 103 #define OS_TASK_CNT OS_TASKCNT
DieterGraef 0:f9b6112278fe 104 #ifndef __MBED_CMSIS_RTOS_CM
DieterGraef 0:f9b6112278fe 105 #define OS_PRIV_CNT (OS_PRIVCNT + 1)
DieterGraef 0:f9b6112278fe 106 #define OS_STACK_SZ (4*(OS_PRIVSTKSIZE+OS_MAINSTKSIZE))
DieterGraef 0:f9b6112278fe 107 #endif
DieterGraef 0:f9b6112278fe 108 #endif
DieterGraef 0:f9b6112278fe 109
DieterGraef 0:f9b6112278fe 110 #ifndef OS_STKINIT
DieterGraef 0:f9b6112278fe 111 #define OS_STKINIT 0
DieterGraef 0:f9b6112278fe 112 #endif
DieterGraef 0:f9b6112278fe 113
DieterGraef 0:f9b6112278fe 114 uint16_t const os_maxtaskrun = OS_TASK_CNT;
DieterGraef 0:f9b6112278fe 115 #ifdef __MBED_CMSIS_RTOS_CM
DieterGraef 0:f9b6112278fe 116 uint32_t const os_stackinfo = (OS_STKINIT<<28) | (OS_STKCHECK<<24) | (OS_IDLESTKSIZE*4);
DieterGraef 0:f9b6112278fe 117 #else
DieterGraef 0:f9b6112278fe 118 uint32_t const os_stackinfo = (OS_STKINIT<<28) | (OS_STKCHECK<<24) | (OS_PRIV_CNT<<16) | (OS_STKSIZE*4);
DieterGraef 0:f9b6112278fe 119 #endif
DieterGraef 0:f9b6112278fe 120 uint32_t const os_rrobin = (OS_ROBIN << 16) | OS_ROBINTOUT;
DieterGraef 0:f9b6112278fe 121 uint32_t const os_tickfreq = OS_CLOCK;
DieterGraef 0:f9b6112278fe 122 uint16_t const os_tickus_i = OS_CLOCK/1000000;
DieterGraef 0:f9b6112278fe 123 uint16_t const os_tickus_f = (((uint64_t)(OS_CLOCK-1000000*(OS_CLOCK/1000000)))<<16)/1000000;
DieterGraef 0:f9b6112278fe 124 uint32_t const os_trv = OS_TRV;
DieterGraef 0:f9b6112278fe 125 uint8_t const os_flags = OS_RUNPRIV;
DieterGraef 0:f9b6112278fe 126
DieterGraef 0:f9b6112278fe 127 /* Export following defines to uVision debugger. */
DieterGraef 0:f9b6112278fe 128 __USED uint32_t const CMSIS_RTOS_API_Version = osCMSIS;
DieterGraef 0:f9b6112278fe 129 __USED uint32_t const CMSIS_RTOS_RTX_Version = osCMSIS_RTX;
DieterGraef 0:f9b6112278fe 130 __USED uint32_t const os_clockrate = OS_TICK;
DieterGraef 0:f9b6112278fe 131 __USED uint32_t const os_timernum = 0U;
DieterGraef 0:f9b6112278fe 132
DieterGraef 0:f9b6112278fe 133 /* Memory pool for TCB allocation */
DieterGraef 0:f9b6112278fe 134 _declare_box (mp_tcb, OS_TCB_SIZE, OS_TASK_CNT);
DieterGraef 0:f9b6112278fe 135 uint16_t const mp_tcb_size = sizeof(mp_tcb);
DieterGraef 0:f9b6112278fe 136
DieterGraef 0:f9b6112278fe 137 #ifdef __MBED_CMSIS_RTOS_CM
DieterGraef 0:f9b6112278fe 138 /* Memory pool for os_idle_demon stack allocation. */
DieterGraef 0:f9b6112278fe 139 _declare_box8 (mp_stk, OS_IDLESTKSIZE*4, 1);
DieterGraef 0:f9b6112278fe 140 uint32_t const mp_stk_size = sizeof(mp_stk);
DieterGraef 0:f9b6112278fe 141 #else
DieterGraef 0:f9b6112278fe 142 /* Memory pool for System stack allocation (+os_idle_demon). */
DieterGraef 0:f9b6112278fe 143 _declare_box8 (mp_stk, OS_STKSIZE*4, OS_TASK_CNT-OS_PRIV_CNT+1);
DieterGraef 0:f9b6112278fe 144 uint32_t const mp_stk_size = sizeof(mp_stk);
DieterGraef 0:f9b6112278fe 145
DieterGraef 0:f9b6112278fe 146 /* Memory pool for user specified stack allocation (+main, +timer) */
DieterGraef 0:f9b6112278fe 147 uint64_t os_stack_mem[2+OS_PRIV_CNT+(OS_STACK_SZ/8)];
DieterGraef 0:f9b6112278fe 148 uint32_t const os_stack_sz = sizeof(os_stack_mem);
DieterGraef 0:f9b6112278fe 149 #endif
DieterGraef 0:f9b6112278fe 150
DieterGraef 0:f9b6112278fe 151 #ifndef OS_FIFOSZ
DieterGraef 0:f9b6112278fe 152 #define OS_FIFOSZ 16
DieterGraef 0:f9b6112278fe 153 #endif
DieterGraef 0:f9b6112278fe 154
DieterGraef 0:f9b6112278fe 155 /* Fifo Queue buffer for ISR requests.*/
DieterGraef 0:f9b6112278fe 156 uint32_t os_fifo[OS_FIFOSZ*2+1];
DieterGraef 0:f9b6112278fe 157 uint8_t const os_fifo_size = OS_FIFOSZ;
DieterGraef 0:f9b6112278fe 158
DieterGraef 0:f9b6112278fe 159 /* An array of Active task pointers. */
DieterGraef 0:f9b6112278fe 160 void *os_active_TCB[OS_TASK_CNT];
DieterGraef 0:f9b6112278fe 161
DieterGraef 0:f9b6112278fe 162 /* User Timers Resources */
DieterGraef 0:f9b6112278fe 163 #if (OS_TIMERS != 0)
DieterGraef 0:f9b6112278fe 164 extern void osTimerThread (void const *argument);
DieterGraef 0:f9b6112278fe 165 #ifdef __MBED_CMSIS_RTOS_CM
DieterGraef 0:f9b6112278fe 166 osThreadDef(osTimerThread, (osPriority)(OS_TIMERPRIO-3), 4*OS_TIMERSTKSZ);
DieterGraef 0:f9b6112278fe 167 #else
DieterGraef 0:f9b6112278fe 168 osThreadDef(osTimerThread, (osPriority)(OS_TIMERPRIO-3), 1, 4*OS_TIMERSTKSZ);
DieterGraef 0:f9b6112278fe 169 #endif
DieterGraef 0:f9b6112278fe 170 osThreadId osThreadId_osTimerThread;
DieterGraef 0:f9b6112278fe 171 osMessageQDef(osTimerMessageQ, OS_TIMERCBQS, void *);
DieterGraef 0:f9b6112278fe 172 osMessageQId osMessageQId_osTimerMessageQ;
DieterGraef 0:f9b6112278fe 173 #else
DieterGraef 0:f9b6112278fe 174 osThreadDef_t os_thread_def_osTimerThread = { NULL };
DieterGraef 0:f9b6112278fe 175 osThreadId osThreadId_osTimerThread;
DieterGraef 0:f9b6112278fe 176 osMessageQDef(osTimerMessageQ, 0U, void *);
DieterGraef 0:f9b6112278fe 177 osMessageQId osMessageQId_osTimerMessageQ;
DieterGraef 0:f9b6112278fe 178 #endif
DieterGraef 0:f9b6112278fe 179
DieterGraef 0:f9b6112278fe 180 /* Legacy RTX User Timers not used */
DieterGraef 0:f9b6112278fe 181 uint32_t os_tmr = 0U;
DieterGraef 0:f9b6112278fe 182 uint32_t const *m_tmr = NULL;
DieterGraef 0:f9b6112278fe 183 uint16_t const mp_tmr_size = 0U;
DieterGraef 0:f9b6112278fe 184
DieterGraef 0:f9b6112278fe 185 #if defined (__CC_ARM) && !defined (__MICROLIB)
DieterGraef 0:f9b6112278fe 186 /* A memory space for arm standard library. */
DieterGraef 0:f9b6112278fe 187 static uint32_t std_libspace[OS_TASK_CNT][96/4];
DieterGraef 0:f9b6112278fe 188 static OS_MUT std_libmutex[OS_MUTEXCNT];
DieterGraef 0:f9b6112278fe 189 static uint32_t nr_mutex;
DieterGraef 0:f9b6112278fe 190 extern void *__libspace_start;
DieterGraef 0:f9b6112278fe 191 #endif
DieterGraef 0:f9b6112278fe 192
DieterGraef 0:f9b6112278fe 193
DieterGraef 0:f9b6112278fe 194 /*----------------------------------------------------------------------------
DieterGraef 0:f9b6112278fe 195 * RTX Optimizations (empty functions)
DieterGraef 0:f9b6112278fe 196 *---------------------------------------------------------------------------*/
DieterGraef 0:f9b6112278fe 197
DieterGraef 0:f9b6112278fe 198 #if OS_ROBIN == 0
DieterGraef 0:f9b6112278fe 199 void rt_init_robin (void) {;}
DieterGraef 0:f9b6112278fe 200 void rt_chk_robin (void) {;}
DieterGraef 0:f9b6112278fe 201 #endif
DieterGraef 0:f9b6112278fe 202
DieterGraef 0:f9b6112278fe 203 #if OS_STKCHECK == 0
DieterGraef 0:f9b6112278fe 204 void rt_stk_check (void) {;}
DieterGraef 0:f9b6112278fe 205 #endif
DieterGraef 0:f9b6112278fe 206
DieterGraef 0:f9b6112278fe 207
DieterGraef 0:f9b6112278fe 208 /*----------------------------------------------------------------------------
DieterGraef 0:f9b6112278fe 209 * Standard Library multithreading interface
DieterGraef 0:f9b6112278fe 210 *---------------------------------------------------------------------------*/
DieterGraef 0:f9b6112278fe 211
DieterGraef 0:f9b6112278fe 212 #if defined (__CC_ARM) && !defined (__MICROLIB)
DieterGraef 0:f9b6112278fe 213
DieterGraef 0:f9b6112278fe 214 /*--------------------------- __user_perthread_libspace ---------------------*/
DieterGraef 0:f9b6112278fe 215
DieterGraef 0:f9b6112278fe 216 void *__user_perthread_libspace (void) {
DieterGraef 0:f9b6112278fe 217 /* Provide a separate libspace for each task. */
DieterGraef 0:f9b6112278fe 218 uint32_t idx;
DieterGraef 0:f9b6112278fe 219
DieterGraef 0:f9b6112278fe 220 idx = (os_running != 0U) ? runtask_id () : 0U;
DieterGraef 0:f9b6112278fe 221 if (idx == 0U) {
DieterGraef 0:f9b6112278fe 222 /* RTX not running yet. */
DieterGraef 0:f9b6112278fe 223 return (&__libspace_start);
DieterGraef 0:f9b6112278fe 224 }
DieterGraef 0:f9b6112278fe 225 return ((void *)&std_libspace[idx-1]);
DieterGraef 0:f9b6112278fe 226 }
DieterGraef 0:f9b6112278fe 227
DieterGraef 0:f9b6112278fe 228 /*--------------------------- _mutex_initialize -----------------------------*/
DieterGraef 0:f9b6112278fe 229
DieterGraef 0:f9b6112278fe 230 int _mutex_initialize (OS_ID *mutex) {
DieterGraef 0:f9b6112278fe 231 /* Allocate and initialize a system mutex. */
DieterGraef 0:f9b6112278fe 232
DieterGraef 0:f9b6112278fe 233 if (nr_mutex >= OS_MUTEXCNT) {
DieterGraef 0:f9b6112278fe 234 /* If you are here, you need to increase the number OS_MUTEXCNT. */
DieterGraef 0:f9b6112278fe 235 error("Not enough stdlib mutexes\n");
DieterGraef 0:f9b6112278fe 236 }
DieterGraef 0:f9b6112278fe 237 *mutex = &std_libmutex[nr_mutex++];
DieterGraef 0:f9b6112278fe 238 mutex_init (*mutex);
DieterGraef 0:f9b6112278fe 239 return (1);
DieterGraef 0:f9b6112278fe 240 }
DieterGraef 0:f9b6112278fe 241
DieterGraef 0:f9b6112278fe 242
DieterGraef 0:f9b6112278fe 243 /*--------------------------- _mutex_acquire --------------------------------*/
DieterGraef 0:f9b6112278fe 244
DieterGraef 0:f9b6112278fe 245 __attribute__((used)) void _mutex_acquire (OS_ID *mutex) {
DieterGraef 0:f9b6112278fe 246 /* Acquire a system mutex, lock stdlib resources. */
DieterGraef 0:f9b6112278fe 247 if (os_running) {
DieterGraef 0:f9b6112278fe 248 /* RTX running, acquire a mutex. */
DieterGraef 0:f9b6112278fe 249 mutex_wait (*mutex);
DieterGraef 0:f9b6112278fe 250 }
DieterGraef 0:f9b6112278fe 251 }
DieterGraef 0:f9b6112278fe 252
DieterGraef 0:f9b6112278fe 253
DieterGraef 0:f9b6112278fe 254 /*--------------------------- _mutex_release --------------------------------*/
DieterGraef 0:f9b6112278fe 255
DieterGraef 0:f9b6112278fe 256 __attribute__((used)) void _mutex_release (OS_ID *mutex) {
DieterGraef 0:f9b6112278fe 257 /* Release a system mutex, unlock stdlib resources. */
DieterGraef 0:f9b6112278fe 258 if (os_running) {
DieterGraef 0:f9b6112278fe 259 /* RTX running, release a mutex. */
DieterGraef 0:f9b6112278fe 260 mutex_rel (*mutex);
DieterGraef 0:f9b6112278fe 261 }
DieterGraef 0:f9b6112278fe 262 }
DieterGraef 0:f9b6112278fe 263
DieterGraef 0:f9b6112278fe 264 #endif
DieterGraef 0:f9b6112278fe 265
DieterGraef 0:f9b6112278fe 266
DieterGraef 0:f9b6112278fe 267 /*----------------------------------------------------------------------------
DieterGraef 0:f9b6112278fe 268 * RTX Startup
DieterGraef 0:f9b6112278fe 269 *---------------------------------------------------------------------------*/
DieterGraef 0:f9b6112278fe 270
DieterGraef 0:f9b6112278fe 271 /* Main Thread definition */
DieterGraef 0:f9b6112278fe 272 extern void pre_main (void);
DieterGraef 0:f9b6112278fe 273 osThreadDef_t os_thread_def_main = {(os_pthread)pre_main, osPriorityNormal, 1U, 0U, NULL};
DieterGraef 0:f9b6112278fe 274
DieterGraef 0:f9b6112278fe 275 // This define should be probably moved to the CMSIS layer
DieterGraef 0:f9b6112278fe 276 #if defined(TARGET_LPC1768)
DieterGraef 0:f9b6112278fe 277 #define INITIAL_SP (0x10008000UL)
DieterGraef 0:f9b6112278fe 278
DieterGraef 0:f9b6112278fe 279 #elif defined(TARGET_LPC11U24)
DieterGraef 0:f9b6112278fe 280 #define INITIAL_SP (0x10002000UL)
DieterGraef 0:f9b6112278fe 281
DieterGraef 0:f9b6112278fe 282 #elif defined(TARGET_LPC11U35_401) || defined(TARGET_LPC11U35_501) || defined(TARGET_LPCCAPPUCCINO)
DieterGraef 0:f9b6112278fe 283 #define INITIAL_SP (0x10002000UL)
DieterGraef 0:f9b6112278fe 284
DieterGraef 0:f9b6112278fe 285 #elif defined(TARGET_LPC1114)
DieterGraef 0:f9b6112278fe 286 #define INITIAL_SP (0x10001000UL)
DieterGraef 0:f9b6112278fe 287
DieterGraef 0:f9b6112278fe 288 #elif defined(TARGET_LPC812)
DieterGraef 0:f9b6112278fe 289 #define INITIAL_SP (0x10001000UL)
DieterGraef 0:f9b6112278fe 290
DieterGraef 0:f9b6112278fe 291 #elif defined(TARGET_LPC824) || defined(TARGET_SSCI824)
DieterGraef 0:f9b6112278fe 292 #define INITIAL_SP (0x10002000UL)
DieterGraef 0:f9b6112278fe 293
DieterGraef 0:f9b6112278fe 294 #elif defined(TARGET_KL25Z)
DieterGraef 0:f9b6112278fe 295 #define INITIAL_SP (0x20003000UL)
DieterGraef 0:f9b6112278fe 296
DieterGraef 0:f9b6112278fe 297 #elif defined(TARGET_KL26Z)
DieterGraef 0:f9b6112278fe 298 #define INITIAL_SP (0x20003000UL)
DieterGraef 0:f9b6112278fe 299
DieterGraef 0:f9b6112278fe 300 #elif defined(TARGET_KL27Z)
DieterGraef 0:f9b6112278fe 301 #define INITIAL_SP (0x20003000UL)
DieterGraef 0:f9b6112278fe 302
DieterGraef 0:f9b6112278fe 303 #elif defined(TARGET_K64F)
DieterGraef 0:f9b6112278fe 304 #define INITIAL_SP (0x20030000UL)
DieterGraef 0:f9b6112278fe 305
DieterGraef 0:f9b6112278fe 306 #elif defined(TARGET_K22F)
DieterGraef 0:f9b6112278fe 307 #define INITIAL_SP (0x20010000UL)
DieterGraef 0:f9b6112278fe 308
DieterGraef 0:f9b6112278fe 309 #elif defined(TARGET_KL46Z)
DieterGraef 0:f9b6112278fe 310 #define INITIAL_SP (0x20006000UL)
DieterGraef 0:f9b6112278fe 311
DieterGraef 0:f9b6112278fe 312 #elif defined(TARGET_KL43Z)
DieterGraef 0:f9b6112278fe 313 #define INITIAL_SP (0x20006000UL)
DieterGraef 0:f9b6112278fe 314
DieterGraef 0:f9b6112278fe 315 #elif defined(TARGET_KL05Z)
DieterGraef 0:f9b6112278fe 316 #define INITIAL_SP (0x20000C00UL)
DieterGraef 0:f9b6112278fe 317
DieterGraef 0:f9b6112278fe 318 #elif defined(TARGET_LPC4088) || defined(TARGET_LPC4088_DM)
DieterGraef 0:f9b6112278fe 319 #define INITIAL_SP (0x10010000UL)
DieterGraef 0:f9b6112278fe 320
DieterGraef 0:f9b6112278fe 321 #elif defined(TARGET_LPC4330)
DieterGraef 0:f9b6112278fe 322 #define INITIAL_SP (0x10008000UL)
DieterGraef 0:f9b6112278fe 323
DieterGraef 0:f9b6112278fe 324 #elif defined(TARGET_LPC4337)
DieterGraef 0:f9b6112278fe 325 #define INITIAL_SP (0x10008000UL)
DieterGraef 0:f9b6112278fe 326
DieterGraef 0:f9b6112278fe 327 #elif defined(TARGET_LPC1347)
DieterGraef 0:f9b6112278fe 328 #define INITIAL_SP (0x10002000UL)
DieterGraef 0:f9b6112278fe 329
DieterGraef 0:f9b6112278fe 330 #elif defined(TARGET_STM32F100RB) || defined(TARGET_STM32F051R8)
DieterGraef 0:f9b6112278fe 331 #define INITIAL_SP (0x20002000UL)
DieterGraef 0:f9b6112278fe 332
DieterGraef 0:f9b6112278fe 333 #elif defined(TARGET_DISCO_F303VC)
DieterGraef 0:f9b6112278fe 334 #define INITIAL_SP (0x2000A000UL)
DieterGraef 0:f9b6112278fe 335
DieterGraef 0:f9b6112278fe 336 #elif defined(TARGET_STM32F407) || defined(TARGET_F407VG)
DieterGraef 0:f9b6112278fe 337 #define INITIAL_SP (0x20020000UL)
DieterGraef 0:f9b6112278fe 338
DieterGraef 0:f9b6112278fe 339 #elif defined(TARGET_STM32F401RE)
DieterGraef 0:f9b6112278fe 340 #define INITIAL_SP (0x20018000UL)
DieterGraef 0:f9b6112278fe 341
DieterGraef 0:f9b6112278fe 342 #elif defined(TARGET_LPC1549)
DieterGraef 0:f9b6112278fe 343 #define INITIAL_SP (0x02009000UL)
DieterGraef 0:f9b6112278fe 344
DieterGraef 0:f9b6112278fe 345 #elif defined(TARGET_LPC11U68)
DieterGraef 0:f9b6112278fe 346 #define INITIAL_SP (0x10008000UL)
DieterGraef 0:f9b6112278fe 347
DieterGraef 0:f9b6112278fe 348 #elif defined(TARGET_STM32F411RE)
DieterGraef 0:f9b6112278fe 349 #define INITIAL_SP (0x20020000UL)
DieterGraef 0:f9b6112278fe 350
DieterGraef 0:f9b6112278fe 351 #elif defined(TARGET_STM32F410RB)
DieterGraef 0:f9b6112278fe 352 #define INITIAL_SP (0x20008000UL)
DieterGraef 0:f9b6112278fe 353
DieterGraef 0:f9b6112278fe 354 #elif defined(TARGET_STM32F103RB) || defined(TARGET_STM32L073RZ)
DieterGraef 0:f9b6112278fe 355 #define INITIAL_SP (0x20005000UL)
DieterGraef 0:f9b6112278fe 356
DieterGraef 0:f9b6112278fe 357 #elif defined(TARGET_STM32F302R8)
DieterGraef 0:f9b6112278fe 358 #define INITIAL_SP (0x20004000UL)
DieterGraef 0:f9b6112278fe 359
DieterGraef 0:f9b6112278fe 360 #elif defined(TARGET_STM32F334R8)
DieterGraef 0:f9b6112278fe 361 #define INITIAL_SP (0x20003000UL)
DieterGraef 0:f9b6112278fe 362
DieterGraef 0:f9b6112278fe 363 #elif defined(TARGET_STM32F334C8)
DieterGraef 0:f9b6112278fe 364 #define INITIAL_SP (0x20003000UL)
DieterGraef 0:f9b6112278fe 365
DieterGraef 0:f9b6112278fe 366 #elif defined(TARGET_STM32F405RG)
DieterGraef 0:f9b6112278fe 367 #define INITIAL_SP (0x20020000UL)
DieterGraef 0:f9b6112278fe 368
DieterGraef 0:f9b6112278fe 369 #elif defined(TARGET_STM32F429ZI)
DieterGraef 0:f9b6112278fe 370 #define INITIAL_SP (0x20030000UL)
DieterGraef 0:f9b6112278fe 371
DieterGraef 0:f9b6112278fe 372 #elif defined(TARGET_STM32L031K6) || defined(TARGET_STM32L053R8) || defined(TARGET_STM32L053C8)
DieterGraef 0:f9b6112278fe 373 #define INITIAL_SP (0x20002000UL)
DieterGraef 0:f9b6112278fe 374
DieterGraef 0:f9b6112278fe 375 #elif defined(TARGET_STM32F072RB)
DieterGraef 0:f9b6112278fe 376 #define INITIAL_SP (0x20004000UL)
DieterGraef 0:f9b6112278fe 377
DieterGraef 0:f9b6112278fe 378 #elif defined(TARGET_STM32F091RC)
DieterGraef 0:f9b6112278fe 379 #define INITIAL_SP (0x20008000UL)
DieterGraef 0:f9b6112278fe 380
DieterGraef 0:f9b6112278fe 381 #elif defined(TARGET_STM32F401VC)
DieterGraef 0:f9b6112278fe 382 #define INITIAL_SP (0x20010000UL)
DieterGraef 0:f9b6112278fe 383
DieterGraef 0:f9b6112278fe 384 #elif defined(TARGET_STM32F303RE)
DieterGraef 0:f9b6112278fe 385 #define INITIAL_SP (0x20010000UL)
DieterGraef 0:f9b6112278fe 386
DieterGraef 0:f9b6112278fe 387 #elif defined(TARGET_STM32F303K8)
DieterGraef 0:f9b6112278fe 388 #define INITIAL_SP (0x20003000UL)
DieterGraef 0:f9b6112278fe 389
DieterGraef 0:f9b6112278fe 390 #elif (defined(TARGET_STM32F746NG) || defined(TARGET_STM32F746ZG))
DieterGraef 0:f9b6112278fe 391 #define INITIAL_SP (0x20050000UL)
DieterGraef 0:f9b6112278fe 392
DieterGraef 0:f9b6112278fe 393 #elif defined(TARGET_MAX32610) || defined(TARGET_MAX32600)
DieterGraef 0:f9b6112278fe 394 #define INITIAL_SP (0x20008000UL)
DieterGraef 0:f9b6112278fe 395
DieterGraef 0:f9b6112278fe 396 #elif defined(TARGET_TEENSY3_1)
DieterGraef 0:f9b6112278fe 397 #define INITIAL_SP (0x20008000UL)
DieterGraef 0:f9b6112278fe 398
DieterGraef 0:f9b6112278fe 399 #elif defined(TARGET_STM32L152RE)
DieterGraef 0:f9b6112278fe 400 #define INITIAL_SP (0x20014000UL)
DieterGraef 0:f9b6112278fe 401
DieterGraef 0:f9b6112278fe 402 #elif defined(TARGET_NZ32_SC151)
DieterGraef 0:f9b6112278fe 403 #define INITIAL_SP (0x20008000UL)
DieterGraef 0:f9b6112278fe 404
DieterGraef 0:f9b6112278fe 405 #elif (defined(TARGET_STM32F446RE) || defined(TARGET_STM32F446VE))
DieterGraef 0:f9b6112278fe 406 #define INITIAL_SP (0x20020000UL)
DieterGraef 0:f9b6112278fe 407
DieterGraef 0:f9b6112278fe 408 #elif defined(TARGET_STM32F070RB) || defined(TARGET_STM32F030R8)
DieterGraef 0:f9b6112278fe 409 #define INITIAL_SP (0x20002000UL)
DieterGraef 0:f9b6112278fe 410
DieterGraef 0:f9b6112278fe 411 #elif defined(TARGET_STM32L476VG)
DieterGraef 0:f9b6112278fe 412 #define INITIAL_SP (0x20018000UL)
DieterGraef 0:f9b6112278fe 413
DieterGraef 0:f9b6112278fe 414 #elif defined(TARGET_STM32L476RG)
DieterGraef 0:f9b6112278fe 415 #define INITIAL_SP (0x20018000UL)
DieterGraef 0:f9b6112278fe 416
DieterGraef 0:f9b6112278fe 417 #elif defined(TARGET_STM32F469NI)
DieterGraef 0:f9b6112278fe 418 #define INITIAL_SP (0x20050000UL)
DieterGraef 0:f9b6112278fe 419
DieterGraef 0:f9b6112278fe 420 #elif defined(TARGET_STM32L152RC)
DieterGraef 0:f9b6112278fe 421 #define INITIAL_SP (0x20008000UL)
DieterGraef 0:f9b6112278fe 422
DieterGraef 0:f9b6112278fe 423
DieterGraef 0:f9b6112278fe 424 #else
DieterGraef 0:f9b6112278fe 425 #error "no target defined"
DieterGraef 0:f9b6112278fe 426
DieterGraef 0:f9b6112278fe 427 #endif
DieterGraef 0:f9b6112278fe 428
DieterGraef 0:f9b6112278fe 429 #ifdef __CC_ARM
DieterGraef 0:f9b6112278fe 430 extern uint32_t Image$$RW_IRAM1$$ZI$$Limit[];
DieterGraef 0:f9b6112278fe 431 #define HEAP_START (Image$$RW_IRAM1$$ZI$$Limit)
DieterGraef 0:f9b6112278fe 432 #elif defined(__GNUC__)
DieterGraef 0:f9b6112278fe 433 extern uint32_t __end__[];
DieterGraef 0:f9b6112278fe 434 #define HEAP_START (__end__)
DieterGraef 0:f9b6112278fe 435 #elif defined(__ICCARM__)
DieterGraef 0:f9b6112278fe 436 #pragma section="HEAP"
DieterGraef 0:f9b6112278fe 437 #define HEAP_START (void *)__section_begin("HEAP")
DieterGraef 0:f9b6112278fe 438 #endif
DieterGraef 0:f9b6112278fe 439
DieterGraef 0:f9b6112278fe 440 void set_main_stack(void) {
DieterGraef 0:f9b6112278fe 441 // That is the bottom of the main stack block: no collision detection
DieterGraef 0:f9b6112278fe 442 os_thread_def_main.stack_pointer = HEAP_START;
DieterGraef 0:f9b6112278fe 443
DieterGraef 0:f9b6112278fe 444 // Leave OS_MAINSTKSIZE words for the scheduler and interrupts
DieterGraef 0:f9b6112278fe 445 os_thread_def_main.stacksize = (INITIAL_SP - (unsigned int)HEAP_START) - (OS_MAINSTKSIZE * 4);
DieterGraef 0:f9b6112278fe 446 }
DieterGraef 0:f9b6112278fe 447
DieterGraef 0:f9b6112278fe 448 #if defined (__CC_ARM)
DieterGraef 0:f9b6112278fe 449
DieterGraef 0:f9b6112278fe 450 #ifdef __MICROLIB
DieterGraef 0:f9b6112278fe 451
DieterGraef 0:f9b6112278fe 452 int main(void);
DieterGraef 0:f9b6112278fe 453 void _main_init (void) __attribute__((section(".ARM.Collect$$$$000000FF")));
DieterGraef 0:f9b6112278fe 454 void $Super$$__cpp_initialize__aeabi_(void);
DieterGraef 0:f9b6112278fe 455
DieterGraef 0:f9b6112278fe 456 void _main_init (void) {
DieterGraef 0:f9b6112278fe 457 osKernelInitialize();
DieterGraef 0:f9b6112278fe 458 #ifdef __MBED_CMSIS_RTOS_CM
DieterGraef 0:f9b6112278fe 459 set_main_stack();
DieterGraef 0:f9b6112278fe 460 #endif
DieterGraef 0:f9b6112278fe 461 osThreadCreate(&os_thread_def_main, NULL);
DieterGraef 0:f9b6112278fe 462 osKernelStart();
DieterGraef 0:f9b6112278fe 463 for (;;);
DieterGraef 0:f9b6112278fe 464 }
DieterGraef 0:f9b6112278fe 465
DieterGraef 0:f9b6112278fe 466 void $Sub$$__cpp_initialize__aeabi_(void)
DieterGraef 0:f9b6112278fe 467 {
DieterGraef 0:f9b6112278fe 468 // this should invoke C++ initializers prior _main_init, we keep this empty and
DieterGraef 0:f9b6112278fe 469 // invoke them after _main_init (=starts RTX kernel)
DieterGraef 0:f9b6112278fe 470 }
DieterGraef 0:f9b6112278fe 471
DieterGraef 0:f9b6112278fe 472 void pre_main()
DieterGraef 0:f9b6112278fe 473 {
DieterGraef 0:f9b6112278fe 474 $Super$$__cpp_initialize__aeabi_();
DieterGraef 0:f9b6112278fe 475 main();
DieterGraef 0:f9b6112278fe 476 }
DieterGraef 0:f9b6112278fe 477
DieterGraef 0:f9b6112278fe 478 #else
DieterGraef 0:f9b6112278fe 479
DieterGraef 0:f9b6112278fe 480 void * armcc_heap_base;
DieterGraef 0:f9b6112278fe 481 void * armcc_heap_top;
DieterGraef 0:f9b6112278fe 482
DieterGraef 0:f9b6112278fe 483 __asm void pre_main (void)
DieterGraef 0:f9b6112278fe 484 {
DieterGraef 0:f9b6112278fe 485 IMPORT __rt_lib_init
DieterGraef 0:f9b6112278fe 486 IMPORT main
DieterGraef 0:f9b6112278fe 487 IMPORT armcc_heap_base
DieterGraef 0:f9b6112278fe 488 IMPORT armcc_heap_top
DieterGraef 0:f9b6112278fe 489
DieterGraef 0:f9b6112278fe 490 LDR R0,=armcc_heap_base
DieterGraef 0:f9b6112278fe 491 LDR R1,=armcc_heap_top
DieterGraef 0:f9b6112278fe 492 LDR R0,[R0]
DieterGraef 0:f9b6112278fe 493 LDR R1,[R1]
DieterGraef 0:f9b6112278fe 494 /* Save link register (keep 8 byte alignment with dummy R4) */
DieterGraef 0:f9b6112278fe 495 PUSH {R4, LR}
DieterGraef 0:f9b6112278fe 496 BL __rt_lib_init
DieterGraef 0:f9b6112278fe 497 BL main
DieterGraef 0:f9b6112278fe 498 /* Return to the thread destroy function.
DieterGraef 0:f9b6112278fe 499 */
DieterGraef 0:f9b6112278fe 500 POP {R4, PC}
DieterGraef 0:f9b6112278fe 501 ALIGN
DieterGraef 0:f9b6112278fe 502 }
DieterGraef 0:f9b6112278fe 503
DieterGraef 0:f9b6112278fe 504 /* The single memory model is checking for stack collision at run time, verifing
DieterGraef 0:f9b6112278fe 505 that the heap pointer is underneath the stack pointer.
DieterGraef 0:f9b6112278fe 506
DieterGraef 0:f9b6112278fe 507 With the RTOS there is not only one stack above the heap, there are multiple
DieterGraef 0:f9b6112278fe 508 stacks and some of them are underneath the heap pointer.
DieterGraef 0:f9b6112278fe 509 */
DieterGraef 0:f9b6112278fe 510 #pragma import(__use_two_region_memory)
DieterGraef 0:f9b6112278fe 511
DieterGraef 0:f9b6112278fe 512 __asm void __rt_entry (void) {
DieterGraef 0:f9b6112278fe 513
DieterGraef 0:f9b6112278fe 514 IMPORT __user_setup_stackheap
DieterGraef 0:f9b6112278fe 515 IMPORT armcc_heap_base
DieterGraef 0:f9b6112278fe 516 IMPORT armcc_heap_top
DieterGraef 0:f9b6112278fe 517 IMPORT os_thread_def_main
DieterGraef 0:f9b6112278fe 518 IMPORT osKernelInitialize
DieterGraef 0:f9b6112278fe 519 #ifdef __MBED_CMSIS_RTOS_CM
DieterGraef 0:f9b6112278fe 520 IMPORT set_main_stack
DieterGraef 0:f9b6112278fe 521 #endif
DieterGraef 0:f9b6112278fe 522 IMPORT osKernelStart
DieterGraef 0:f9b6112278fe 523 IMPORT osThreadCreate
DieterGraef 0:f9b6112278fe 524
DieterGraef 0:f9b6112278fe 525 /* __user_setup_stackheap returns:
DieterGraef 0:f9b6112278fe 526 * - Heap base in r0 (if the program uses the heap).
DieterGraef 0:f9b6112278fe 527 * - Stack base in sp.
DieterGraef 0:f9b6112278fe 528 * - Heap limit in r2 (if the program uses the heap and uses two-region memory).
DieterGraef 0:f9b6112278fe 529 *
DieterGraef 0:f9b6112278fe 530 * More info can be found in:
DieterGraef 0:f9b6112278fe 531 * ARM Compiler ARM C and C++ Libraries and Floating-Point Support User Guide
DieterGraef 0:f9b6112278fe 532 */
DieterGraef 0:f9b6112278fe 533 BL __user_setup_stackheap
DieterGraef 0:f9b6112278fe 534 LDR R3,=armcc_heap_base
DieterGraef 0:f9b6112278fe 535 LDR R4,=armcc_heap_top
DieterGraef 0:f9b6112278fe 536 STR R0,[R3]
DieterGraef 0:f9b6112278fe 537 STR R2,[R4]
DieterGraef 0:f9b6112278fe 538 BL osKernelInitialize
DieterGraef 0:f9b6112278fe 539 #ifdef __MBED_CMSIS_RTOS_CM
DieterGraef 0:f9b6112278fe 540 BL set_main_stack
DieterGraef 0:f9b6112278fe 541 #endif
DieterGraef 0:f9b6112278fe 542 LDR R0,=os_thread_def_main
DieterGraef 0:f9b6112278fe 543 MOVS R1,#0
DieterGraef 0:f9b6112278fe 544 BL osThreadCreate
DieterGraef 0:f9b6112278fe 545 BL osKernelStart
DieterGraef 0:f9b6112278fe 546 /* osKernelStart should not return */
DieterGraef 0:f9b6112278fe 547 B .
DieterGraef 0:f9b6112278fe 548
DieterGraef 0:f9b6112278fe 549 ALIGN
DieterGraef 0:f9b6112278fe 550 }
DieterGraef 0:f9b6112278fe 551
DieterGraef 0:f9b6112278fe 552 #endif
DieterGraef 0:f9b6112278fe 553
DieterGraef 0:f9b6112278fe 554 #elif defined (__GNUC__)
DieterGraef 0:f9b6112278fe 555
DieterGraef 0:f9b6112278fe 556 extern void __libc_fini_array(void);
DieterGraef 0:f9b6112278fe 557 extern void __libc_init_array (void);
DieterGraef 0:f9b6112278fe 558 extern int main(int argc, char **argv);
DieterGraef 0:f9b6112278fe 559
DieterGraef 0:f9b6112278fe 560 void pre_main(void) {
DieterGraef 0:f9b6112278fe 561 atexit(__libc_fini_array);
DieterGraef 0:f9b6112278fe 562 __libc_init_array();
DieterGraef 0:f9b6112278fe 563 main(0, NULL);
DieterGraef 0:f9b6112278fe 564 }
DieterGraef 0:f9b6112278fe 565
DieterGraef 0:f9b6112278fe 566 __attribute__((naked)) void software_init_hook (void) {
DieterGraef 0:f9b6112278fe 567 __asm (
DieterGraef 0:f9b6112278fe 568 ".syntax unified\n"
DieterGraef 0:f9b6112278fe 569 ".thumb\n"
DieterGraef 0:f9b6112278fe 570 "bl osKernelInitialize\n"
DieterGraef 0:f9b6112278fe 571 #ifdef __MBED_CMSIS_RTOS_CM
DieterGraef 0:f9b6112278fe 572 "bl set_main_stack\n"
DieterGraef 0:f9b6112278fe 573 #endif
DieterGraef 0:f9b6112278fe 574 "ldr r0,=os_thread_def_main\n"
DieterGraef 0:f9b6112278fe 575 "movs r1,#0\n"
DieterGraef 0:f9b6112278fe 576 "bl osThreadCreate\n"
DieterGraef 0:f9b6112278fe 577 "bl osKernelStart\n"
DieterGraef 0:f9b6112278fe 578 /* osKernelStart should not return */
DieterGraef 0:f9b6112278fe 579 "B .\n"
DieterGraef 0:f9b6112278fe 580 );
DieterGraef 0:f9b6112278fe 581 }
DieterGraef 0:f9b6112278fe 582
DieterGraef 0:f9b6112278fe 583 #elif defined (__ICCARM__)
DieterGraef 0:f9b6112278fe 584
DieterGraef 0:f9b6112278fe 585 extern void* __vector_table;
DieterGraef 0:f9b6112278fe 586 extern int __low_level_init(void);
DieterGraef 0:f9b6112278fe 587 extern void __iar_data_init3(void);
DieterGraef 0:f9b6112278fe 588 extern __weak void __iar_init_core( void );
DieterGraef 0:f9b6112278fe 589 extern __weak void __iar_init_vfp( void );
DieterGraef 0:f9b6112278fe 590 extern void __iar_dynamic_initialization(void);
DieterGraef 0:f9b6112278fe 591 extern void mbed_sdk_init(void);
DieterGraef 0:f9b6112278fe 592 extern void exit(int arg);
DieterGraef 0:f9b6112278fe 593
DieterGraef 0:f9b6112278fe 594 static uint8_t low_level_init_needed;
DieterGraef 0:f9b6112278fe 595
DieterGraef 0:f9b6112278fe 596 void pre_main(void) {
DieterGraef 0:f9b6112278fe 597 if (low_level_init_needed) {
DieterGraef 0:f9b6112278fe 598 __iar_dynamic_initialization();
DieterGraef 0:f9b6112278fe 599 }
DieterGraef 0:f9b6112278fe 600 main();
DieterGraef 0:f9b6112278fe 601 }
DieterGraef 0:f9b6112278fe 602
DieterGraef 0:f9b6112278fe 603 #pragma required=__vector_table
DieterGraef 0:f9b6112278fe 604 void __iar_program_start( void )
DieterGraef 0:f9b6112278fe 605 {
DieterGraef 0:f9b6112278fe 606 #ifdef __MBED_CMSIS_RTOS_CM
DieterGraef 0:f9b6112278fe 607 __iar_init_core();
DieterGraef 0:f9b6112278fe 608 __iar_init_vfp();
DieterGraef 0:f9b6112278fe 609
DieterGraef 0:f9b6112278fe 610 uint8_t low_level_init_needed_local;
DieterGraef 0:f9b6112278fe 611
DieterGraef 0:f9b6112278fe 612 low_level_init_needed_local = __low_level_init();
DieterGraef 0:f9b6112278fe 613 if (low_level_init_needed_local) {
DieterGraef 0:f9b6112278fe 614 __iar_data_init3();
DieterGraef 0:f9b6112278fe 615 mbed_sdk_init();
DieterGraef 0:f9b6112278fe 616 }
DieterGraef 0:f9b6112278fe 617 /* Store in a global variable after RAM has been initialized */
DieterGraef 0:f9b6112278fe 618 low_level_init_needed = low_level_init_needed_local;
DieterGraef 0:f9b6112278fe 619 #endif
DieterGraef 0:f9b6112278fe 620 osKernelInitialize();
DieterGraef 0:f9b6112278fe 621 #ifdef __MBED_CMSIS_RTOS_CM
DieterGraef 0:f9b6112278fe 622 set_main_stack();
DieterGraef 0:f9b6112278fe 623 #endif
DieterGraef 0:f9b6112278fe 624 osThreadCreate(&os_thread_def_main, NULL);
DieterGraef 0:f9b6112278fe 625 osKernelStart();
DieterGraef 0:f9b6112278fe 626 /* osKernelStart should not return */
DieterGraef 0:f9b6112278fe 627 while (1);
DieterGraef 0:f9b6112278fe 628 }
DieterGraef 0:f9b6112278fe 629
DieterGraef 0:f9b6112278fe 630 #endif
DieterGraef 0:f9b6112278fe 631
DieterGraef 0:f9b6112278fe 632
DieterGraef 0:f9b6112278fe 633 /*----------------------------------------------------------------------------
DieterGraef 0:f9b6112278fe 634 * end of file
DieterGraef 0:f9b6112278fe 635 *---------------------------------------------------------------------------*/