Avion Radio IUT / Mbed 2 deprecated MecatroPWM

Dependencies:   mbed

Committer:
qmaker
Date:
Thu Mar 11 08:00:49 2021 +0000
Revision:
0:0d257bbf5c05
mpu6050 corrige

Who changed what in which revision?

UserRevisionLine numberNew contents of line
qmaker 0:0d257bbf5c05 1 /*----------------------------------------------------------------------------
qmaker 0:0d257bbf5c05 2 * RL-ARM - RTX
qmaker 0:0d257bbf5c05 3 *----------------------------------------------------------------------------
qmaker 0:0d257bbf5c05 4 * Name: RTX_CM_LIB.H
qmaker 0:0d257bbf5c05 5 * Purpose: RTX Kernel System Configuration
qmaker 0:0d257bbf5c05 6 * Rev.: V4.60
qmaker 0:0d257bbf5c05 7 *----------------------------------------------------------------------------
qmaker 0:0d257bbf5c05 8 *
qmaker 0:0d257bbf5c05 9 * Copyright (c) 1999-2009 KEIL, 2009-2015 ARM Germany GmbH
qmaker 0:0d257bbf5c05 10 * All rights reserved.
qmaker 0:0d257bbf5c05 11 * Redistribution and use in source and binary forms, with or without
qmaker 0:0d257bbf5c05 12 * modification, are permitted provided that the following conditions are met:
qmaker 0:0d257bbf5c05 13 * - Redistributions of source code must retain the above copyright
qmaker 0:0d257bbf5c05 14 * notice, this list of conditions and the following disclaimer.
qmaker 0:0d257bbf5c05 15 * - Redistributions in binary form must reproduce the above copyright
qmaker 0:0d257bbf5c05 16 * notice, this list of conditions and the following disclaimer in the
qmaker 0:0d257bbf5c05 17 * documentation and/or other materials provided with the distribution.
qmaker 0:0d257bbf5c05 18 * - Neither the name of ARM nor the names of its contributors may be used
qmaker 0:0d257bbf5c05 19 * to endorse or promote products derived from this software without
qmaker 0:0d257bbf5c05 20 * specific prior written permission.
qmaker 0:0d257bbf5c05 21 *
qmaker 0:0d257bbf5c05 22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
qmaker 0:0d257bbf5c05 23 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
qmaker 0:0d257bbf5c05 24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
qmaker 0:0d257bbf5c05 25 * ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
qmaker 0:0d257bbf5c05 26 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
qmaker 0:0d257bbf5c05 27 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
qmaker 0:0d257bbf5c05 28 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
qmaker 0:0d257bbf5c05 29 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
qmaker 0:0d257bbf5c05 30 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
qmaker 0:0d257bbf5c05 31 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
qmaker 0:0d257bbf5c05 32 * POSSIBILITY OF SUCH DAMAGE.
qmaker 0:0d257bbf5c05 33 *---------------------------------------------------------------------------*/
qmaker 0:0d257bbf5c05 34 #include "mbed_error.h"
qmaker 0:0d257bbf5c05 35
qmaker 0:0d257bbf5c05 36 #if defined (__CC_ARM)
qmaker 0:0d257bbf5c05 37 #pragma O3
qmaker 0:0d257bbf5c05 38 #define __USED __attribute__((used))
qmaker 0:0d257bbf5c05 39 #elif defined (__GNUC__)
qmaker 0:0d257bbf5c05 40 #pragma GCC optimize ("O3")
qmaker 0:0d257bbf5c05 41 #define __USED __attribute__((used))
qmaker 0:0d257bbf5c05 42 #elif defined (__ICCARM__)
qmaker 0:0d257bbf5c05 43 #define __USED __root
qmaker 0:0d257bbf5c05 44 #endif
qmaker 0:0d257bbf5c05 45
qmaker 0:0d257bbf5c05 46
qmaker 0:0d257bbf5c05 47 /*----------------------------------------------------------------------------
qmaker 0:0d257bbf5c05 48 * Definitions
qmaker 0:0d257bbf5c05 49 *---------------------------------------------------------------------------*/
qmaker 0:0d257bbf5c05 50
qmaker 0:0d257bbf5c05 51 #define _declare_box(pool,size,cnt) uint32_t pool[(((size)+3)/4)*(cnt) + 3]
qmaker 0:0d257bbf5c05 52 #define _declare_box8(pool,size,cnt) uint64_t pool[(((size)+7)/8)*(cnt) + 2]
qmaker 0:0d257bbf5c05 53
qmaker 0:0d257bbf5c05 54 #define OS_TCB_SIZE 48
qmaker 0:0d257bbf5c05 55 #define OS_TMR_SIZE 8
qmaker 0:0d257bbf5c05 56
qmaker 0:0d257bbf5c05 57 #if defined (__CC_ARM) && !defined (__MICROLIB)
qmaker 0:0d257bbf5c05 58
qmaker 0:0d257bbf5c05 59 typedef void *OS_ID;
qmaker 0:0d257bbf5c05 60 typedef uint32_t OS_TID;
qmaker 0:0d257bbf5c05 61 typedef uint32_t OS_MUT[3];
qmaker 0:0d257bbf5c05 62 typedef uint32_t OS_RESULT;
qmaker 0:0d257bbf5c05 63
qmaker 0:0d257bbf5c05 64 #define runtask_id() rt_tsk_self()
qmaker 0:0d257bbf5c05 65 #define mutex_init(m) rt_mut_init(m)
qmaker 0:0d257bbf5c05 66 #define mutex_wait(m) os_mut_wait(m,0xFFFF)
qmaker 0:0d257bbf5c05 67 #define mutex_rel(m) os_mut_release(m)
qmaker 0:0d257bbf5c05 68
qmaker 0:0d257bbf5c05 69 extern OS_TID rt_tsk_self (void);
qmaker 0:0d257bbf5c05 70 extern void rt_mut_init (OS_ID mutex);
qmaker 0:0d257bbf5c05 71 extern OS_RESULT rt_mut_release (OS_ID mutex);
qmaker 0:0d257bbf5c05 72 extern OS_RESULT rt_mut_wait (OS_ID mutex, uint16_t timeout);
qmaker 0:0d257bbf5c05 73
qmaker 0:0d257bbf5c05 74 #define os_mut_wait(mutex,timeout) _os_mut_wait((uint32_t)rt_mut_wait,mutex,timeout)
qmaker 0:0d257bbf5c05 75 #define os_mut_release(mutex) _os_mut_release((uint32_t)rt_mut_release,mutex)
qmaker 0:0d257bbf5c05 76
qmaker 0:0d257bbf5c05 77 OS_RESULT _os_mut_release (uint32_t p, OS_ID mutex) __svc_indirect(0);
qmaker 0:0d257bbf5c05 78 OS_RESULT _os_mut_wait (uint32_t p, OS_ID mutex, uint16_t timeout) __svc_indirect(0);
qmaker 0:0d257bbf5c05 79
qmaker 0:0d257bbf5c05 80 #endif
qmaker 0:0d257bbf5c05 81
qmaker 0:0d257bbf5c05 82
qmaker 0:0d257bbf5c05 83 /*----------------------------------------------------------------------------
qmaker 0:0d257bbf5c05 84 * Global Variables
qmaker 0:0d257bbf5c05 85 *---------------------------------------------------------------------------*/
qmaker 0:0d257bbf5c05 86
qmaker 0:0d257bbf5c05 87 #if (OS_TIMERS != 0)
qmaker 0:0d257bbf5c05 88 #define OS_TASK_CNT (OS_TASKCNT + 1)
qmaker 0:0d257bbf5c05 89 #else
qmaker 0:0d257bbf5c05 90 #define OS_TASK_CNT OS_TASKCNT
qmaker 0:0d257bbf5c05 91 #endif
qmaker 0:0d257bbf5c05 92
qmaker 0:0d257bbf5c05 93 uint16_t const os_maxtaskrun = OS_TASK_CNT;
qmaker 0:0d257bbf5c05 94 uint32_t const os_rrobin = (OS_ROBIN << 16) | OS_ROBINTOUT;
qmaker 0:0d257bbf5c05 95 uint32_t const os_trv = OS_TRV;
qmaker 0:0d257bbf5c05 96 uint8_t const os_flags = OS_RUNPRIV;
qmaker 0:0d257bbf5c05 97
qmaker 0:0d257bbf5c05 98 /* Export following defines to uVision debugger. */
qmaker 0:0d257bbf5c05 99 __USED uint32_t const os_clockrate = OS_TICK;
qmaker 0:0d257bbf5c05 100 __USED uint32_t const os_timernum = 0;
qmaker 0:0d257bbf5c05 101
qmaker 0:0d257bbf5c05 102 /* Stack for the os_idle_demon */
qmaker 0:0d257bbf5c05 103 unsigned int idle_task_stack[OS_IDLESTKSIZE];
qmaker 0:0d257bbf5c05 104 unsigned short const idle_task_stack_size = OS_IDLESTKSIZE;
qmaker 0:0d257bbf5c05 105
qmaker 0:0d257bbf5c05 106 #ifndef OS_FIFOSZ
qmaker 0:0d257bbf5c05 107 #define OS_FIFOSZ 16
qmaker 0:0d257bbf5c05 108 #endif
qmaker 0:0d257bbf5c05 109
qmaker 0:0d257bbf5c05 110 /* Fifo Queue buffer for ISR requests.*/
qmaker 0:0d257bbf5c05 111 uint32_t os_fifo[OS_FIFOSZ*2+1];
qmaker 0:0d257bbf5c05 112 uint8_t const os_fifo_size = OS_FIFOSZ;
qmaker 0:0d257bbf5c05 113
qmaker 0:0d257bbf5c05 114 /* An array of Active task pointers. */
qmaker 0:0d257bbf5c05 115 void *os_active_TCB[OS_TASK_CNT];
qmaker 0:0d257bbf5c05 116
qmaker 0:0d257bbf5c05 117 /* User Timers Resources */
qmaker 0:0d257bbf5c05 118 #if (OS_TIMERS != 0)
qmaker 0:0d257bbf5c05 119 extern void osTimerThread (void const *argument);
qmaker 0:0d257bbf5c05 120 osThreadDef(osTimerThread, (osPriority)(OS_TIMERPRIO-3), 4*OS_TIMERSTKSZ);
qmaker 0:0d257bbf5c05 121 osThreadId osThreadId_osTimerThread;
qmaker 0:0d257bbf5c05 122 osMessageQDef(osTimerMessageQ, OS_TIMERCBQS, void *);
qmaker 0:0d257bbf5c05 123 osMessageQId osMessageQId_osTimerMessageQ;
qmaker 0:0d257bbf5c05 124 #else
qmaker 0:0d257bbf5c05 125 osThreadDef_t os_thread_def_osTimerThread = { NULL };
qmaker 0:0d257bbf5c05 126 osThreadId osThreadId_osTimerThread;
qmaker 0:0d257bbf5c05 127 osMessageQDef(osTimerMessageQ, 0, void *);
qmaker 0:0d257bbf5c05 128 osMessageQId osMessageQId_osTimerMessageQ;
qmaker 0:0d257bbf5c05 129 #endif
qmaker 0:0d257bbf5c05 130
qmaker 0:0d257bbf5c05 131
qmaker 0:0d257bbf5c05 132 /*----------------------------------------------------------------------------
qmaker 0:0d257bbf5c05 133 * RTX Optimizations (empty functions)
qmaker 0:0d257bbf5c05 134 *---------------------------------------------------------------------------*/
qmaker 0:0d257bbf5c05 135
qmaker 0:0d257bbf5c05 136 #if OS_ROBIN == 0
qmaker 0:0d257bbf5c05 137 void rt_init_robin (void) {;}
qmaker 0:0d257bbf5c05 138 void rt_chk_robin (void) {;}
qmaker 0:0d257bbf5c05 139 #endif
qmaker 0:0d257bbf5c05 140
qmaker 0:0d257bbf5c05 141 #if OS_STKCHECK == 0
qmaker 0:0d257bbf5c05 142 void rt_stk_check (void) {;}
qmaker 0:0d257bbf5c05 143 #endif
qmaker 0:0d257bbf5c05 144
qmaker 0:0d257bbf5c05 145
qmaker 0:0d257bbf5c05 146 /*----------------------------------------------------------------------------
qmaker 0:0d257bbf5c05 147 * Standard Library multithreading interface
qmaker 0:0d257bbf5c05 148 *---------------------------------------------------------------------------*/
qmaker 0:0d257bbf5c05 149
qmaker 0:0d257bbf5c05 150 #if defined (__CC_ARM) && !defined (__MICROLIB)
qmaker 0:0d257bbf5c05 151 static OS_MUT std_libmutex[OS_MUTEXCNT];
qmaker 0:0d257bbf5c05 152 static uint32_t nr_mutex;
qmaker 0:0d257bbf5c05 153
qmaker 0:0d257bbf5c05 154 /*--------------------------- _mutex_initialize -----------------------------*/
qmaker 0:0d257bbf5c05 155
qmaker 0:0d257bbf5c05 156 int _mutex_initialize (OS_ID *mutex) {
qmaker 0:0d257bbf5c05 157 /* Allocate and initialize a system mutex. */
qmaker 0:0d257bbf5c05 158
qmaker 0:0d257bbf5c05 159 if (nr_mutex >= OS_MUTEXCNT) {
qmaker 0:0d257bbf5c05 160 /* If you are here, you need to increase the number OS_MUTEXCNT. */
qmaker 0:0d257bbf5c05 161 error("Not enough stdlib mutexes\n");
qmaker 0:0d257bbf5c05 162 }
qmaker 0:0d257bbf5c05 163 *mutex = &std_libmutex[nr_mutex++];
qmaker 0:0d257bbf5c05 164 mutex_init (*mutex);
qmaker 0:0d257bbf5c05 165 return (1);
qmaker 0:0d257bbf5c05 166 }
qmaker 0:0d257bbf5c05 167
qmaker 0:0d257bbf5c05 168
qmaker 0:0d257bbf5c05 169 /*--------------------------- _mutex_acquire --------------------------------*/
qmaker 0:0d257bbf5c05 170
qmaker 0:0d257bbf5c05 171 __attribute__((used)) void _mutex_acquire (OS_ID *mutex) {
qmaker 0:0d257bbf5c05 172 /* Acquire a system mutex, lock stdlib resources. */
qmaker 0:0d257bbf5c05 173 if (runtask_id ()) {
qmaker 0:0d257bbf5c05 174 /* RTX running, acquire a mutex. */
qmaker 0:0d257bbf5c05 175 mutex_wait (*mutex);
qmaker 0:0d257bbf5c05 176 }
qmaker 0:0d257bbf5c05 177 }
qmaker 0:0d257bbf5c05 178
qmaker 0:0d257bbf5c05 179
qmaker 0:0d257bbf5c05 180 /*--------------------------- _mutex_release --------------------------------*/
qmaker 0:0d257bbf5c05 181
qmaker 0:0d257bbf5c05 182 __attribute__((used)) void _mutex_release (OS_ID *mutex) {
qmaker 0:0d257bbf5c05 183 /* Release a system mutex, unlock stdlib resources. */
qmaker 0:0d257bbf5c05 184 if (runtask_id ()) {
qmaker 0:0d257bbf5c05 185 /* RTX running, release a mutex. */
qmaker 0:0d257bbf5c05 186 mutex_rel (*mutex);
qmaker 0:0d257bbf5c05 187 }
qmaker 0:0d257bbf5c05 188 }
qmaker 0:0d257bbf5c05 189
qmaker 0:0d257bbf5c05 190 #endif
qmaker 0:0d257bbf5c05 191
qmaker 0:0d257bbf5c05 192
qmaker 0:0d257bbf5c05 193 /*----------------------------------------------------------------------------
qmaker 0:0d257bbf5c05 194 * RTX Startup
qmaker 0:0d257bbf5c05 195 *---------------------------------------------------------------------------*/
qmaker 0:0d257bbf5c05 196
qmaker 0:0d257bbf5c05 197 /* Main Thread definition */
qmaker 0:0d257bbf5c05 198 extern void pre_main (void);
qmaker 0:0d257bbf5c05 199 osThreadDef_t os_thread_def_main = {(os_pthread)pre_main, osPriorityNormal, 0, NULL};
qmaker 0:0d257bbf5c05 200
qmaker 0:0d257bbf5c05 201 #ifndef INITIAL_SP
qmaker 0:0d257bbf5c05 202 #error "no target defined"
qmaker 0:0d257bbf5c05 203 #endif
qmaker 0:0d257bbf5c05 204
qmaker 0:0d257bbf5c05 205 #ifdef __CC_ARM
qmaker 0:0d257bbf5c05 206 extern unsigned char Image$$RW_IRAM1$$ZI$$Limit[];
qmaker 0:0d257bbf5c05 207 #define HEAP_START (Image$$RW_IRAM1$$ZI$$Limit)
qmaker 0:0d257bbf5c05 208 #elif defined(__GNUC__)
qmaker 0:0d257bbf5c05 209 extern unsigned char __end__[];
qmaker 0:0d257bbf5c05 210 #define HEAP_START (__end__)
qmaker 0:0d257bbf5c05 211 #elif defined(__ICCARM__)
qmaker 0:0d257bbf5c05 212 #pragma section="HEAP"
qmaker 0:0d257bbf5c05 213 #define HEAP_START (void *)__section_begin("HEAP")
qmaker 0:0d257bbf5c05 214 #endif
qmaker 0:0d257bbf5c05 215
qmaker 0:0d257bbf5c05 216 void set_main_stack(void) {
qmaker 0:0d257bbf5c05 217 // That is the bottom of the main stack block: no collision detection
qmaker 0:0d257bbf5c05 218 os_thread_def_main.stack_pointer = HEAP_START;
qmaker 0:0d257bbf5c05 219
qmaker 0:0d257bbf5c05 220 // Leave OS_SCHEDULERSTKSIZE words for the scheduler and interrupts
qmaker 0:0d257bbf5c05 221 os_thread_def_main.stacksize = (INITIAL_SP - (unsigned int)HEAP_START) - (OS_SCHEDULERSTKSIZE * 4);
qmaker 0:0d257bbf5c05 222 }
qmaker 0:0d257bbf5c05 223
qmaker 0:0d257bbf5c05 224 #if defined (__CC_ARM)
qmaker 0:0d257bbf5c05 225 #ifdef __MICROLIB
qmaker 0:0d257bbf5c05 226
qmaker 0:0d257bbf5c05 227 int main(void);
qmaker 0:0d257bbf5c05 228 void _main_init (void) __attribute__((section(".ARM.Collect$$$$000000FF")));
qmaker 0:0d257bbf5c05 229 void $Super$$__cpp_initialize__aeabi_(void);
qmaker 0:0d257bbf5c05 230
qmaker 0:0d257bbf5c05 231 void _main_init (void) {
qmaker 0:0d257bbf5c05 232 osKernelInitialize();
qmaker 0:0d257bbf5c05 233 set_main_stack();
qmaker 0:0d257bbf5c05 234 osThreadCreate(&os_thread_def_main, NULL);
qmaker 0:0d257bbf5c05 235 osKernelStart();
qmaker 0:0d257bbf5c05 236 for (;;);
qmaker 0:0d257bbf5c05 237 }
qmaker 0:0d257bbf5c05 238
qmaker 0:0d257bbf5c05 239 void $Sub$$__cpp_initialize__aeabi_(void)
qmaker 0:0d257bbf5c05 240 {
qmaker 0:0d257bbf5c05 241 // this should invoke C++ initializers prior _main_init, we keep this empty and
qmaker 0:0d257bbf5c05 242 // invoke them after _main_init (=starts RTX kernel)
qmaker 0:0d257bbf5c05 243 }
qmaker 0:0d257bbf5c05 244
qmaker 0:0d257bbf5c05 245 void pre_main()
qmaker 0:0d257bbf5c05 246 {
qmaker 0:0d257bbf5c05 247 $Super$$__cpp_initialize__aeabi_();
qmaker 0:0d257bbf5c05 248 main();
qmaker 0:0d257bbf5c05 249 }
qmaker 0:0d257bbf5c05 250
qmaker 0:0d257bbf5c05 251 #else
qmaker 0:0d257bbf5c05 252
qmaker 0:0d257bbf5c05 253 void * armcc_heap_base;
qmaker 0:0d257bbf5c05 254 void * armcc_heap_top;
qmaker 0:0d257bbf5c05 255
qmaker 0:0d257bbf5c05 256 __asm void pre_main (void)
qmaker 0:0d257bbf5c05 257 {
qmaker 0:0d257bbf5c05 258 IMPORT __rt_lib_init
qmaker 0:0d257bbf5c05 259 IMPORT main
qmaker 0:0d257bbf5c05 260 IMPORT armcc_heap_base
qmaker 0:0d257bbf5c05 261 IMPORT armcc_heap_top
qmaker 0:0d257bbf5c05 262
qmaker 0:0d257bbf5c05 263 LDR R0,=armcc_heap_base
qmaker 0:0d257bbf5c05 264 LDR R1,=armcc_heap_top
qmaker 0:0d257bbf5c05 265 LDR R0,[R0]
qmaker 0:0d257bbf5c05 266 LDR R1,[R1]
qmaker 0:0d257bbf5c05 267 /* Save link register (keep 8 byte alignment with dummy R4) */
qmaker 0:0d257bbf5c05 268 PUSH {R4, LR}
qmaker 0:0d257bbf5c05 269 BL __rt_lib_init
qmaker 0:0d257bbf5c05 270 BL main
qmaker 0:0d257bbf5c05 271 /* Return to the thread destroy function.
qmaker 0:0d257bbf5c05 272 */
qmaker 0:0d257bbf5c05 273 POP {R4, PC}
qmaker 0:0d257bbf5c05 274 ALIGN
qmaker 0:0d257bbf5c05 275 }
qmaker 0:0d257bbf5c05 276
qmaker 0:0d257bbf5c05 277 /* The single memory model is checking for stack collision at run time, verifing
qmaker 0:0d257bbf5c05 278 that the heap pointer is underneath the stack pointer.
qmaker 0:0d257bbf5c05 279
qmaker 0:0d257bbf5c05 280 With the RTOS there is not only one stack above the heap, there are multiple
qmaker 0:0d257bbf5c05 281 stacks and some of them are underneath the heap pointer.
qmaker 0:0d257bbf5c05 282 */
qmaker 0:0d257bbf5c05 283 #pragma import(__use_two_region_memory)
qmaker 0:0d257bbf5c05 284
qmaker 0:0d257bbf5c05 285 __asm void __rt_entry (void) {
qmaker 0:0d257bbf5c05 286
qmaker 0:0d257bbf5c05 287 IMPORT __user_setup_stackheap
qmaker 0:0d257bbf5c05 288 IMPORT armcc_heap_base
qmaker 0:0d257bbf5c05 289 IMPORT armcc_heap_top
qmaker 0:0d257bbf5c05 290 IMPORT os_thread_def_main
qmaker 0:0d257bbf5c05 291 IMPORT osKernelInitialize
qmaker 0:0d257bbf5c05 292 IMPORT set_main_stack
qmaker 0:0d257bbf5c05 293 IMPORT osKernelStart
qmaker 0:0d257bbf5c05 294 IMPORT osThreadCreate
qmaker 0:0d257bbf5c05 295
qmaker 0:0d257bbf5c05 296 /* __user_setup_stackheap returns:
qmaker 0:0d257bbf5c05 297 * - Heap base in r0 (if the program uses the heap).
qmaker 0:0d257bbf5c05 298 * - Stack base in sp.
qmaker 0:0d257bbf5c05 299 * - Heap limit in r2 (if the program uses the heap and uses two-region memory).
qmaker 0:0d257bbf5c05 300 *
qmaker 0:0d257bbf5c05 301 * More info can be found in:
qmaker 0:0d257bbf5c05 302 * ARM Compiler ARM C and C++ Libraries and Floating-Point Support User Guide
qmaker 0:0d257bbf5c05 303 */
qmaker 0:0d257bbf5c05 304 BL __user_setup_stackheap
qmaker 0:0d257bbf5c05 305 LDR R3,=armcc_heap_base
qmaker 0:0d257bbf5c05 306 LDR R4,=armcc_heap_top
qmaker 0:0d257bbf5c05 307 STR R0,[R3]
qmaker 0:0d257bbf5c05 308 STR R2,[R4]
qmaker 0:0d257bbf5c05 309 BL osKernelInitialize
qmaker 0:0d257bbf5c05 310 BL set_main_stack
qmaker 0:0d257bbf5c05 311 LDR R0,=os_thread_def_main
qmaker 0:0d257bbf5c05 312 MOVS R1,#0
qmaker 0:0d257bbf5c05 313 BL osThreadCreate
qmaker 0:0d257bbf5c05 314 BL osKernelStart
qmaker 0:0d257bbf5c05 315 /* osKernelStart should not return */
qmaker 0:0d257bbf5c05 316 B .
qmaker 0:0d257bbf5c05 317
qmaker 0:0d257bbf5c05 318 ALIGN
qmaker 0:0d257bbf5c05 319 }
qmaker 0:0d257bbf5c05 320
qmaker 0:0d257bbf5c05 321 #endif
qmaker 0:0d257bbf5c05 322
qmaker 0:0d257bbf5c05 323 #elif defined (__GNUC__)
qmaker 0:0d257bbf5c05 324
qmaker 0:0d257bbf5c05 325 extern int atexit(void (*func)(void));
qmaker 0:0d257bbf5c05 326 extern void __libc_fini_array(void);
qmaker 0:0d257bbf5c05 327 extern void __libc_init_array (void);
qmaker 0:0d257bbf5c05 328 extern int main(int argc, char **argv);
qmaker 0:0d257bbf5c05 329
qmaker 0:0d257bbf5c05 330 void pre_main(void) {
qmaker 0:0d257bbf5c05 331 atexit(__libc_fini_array);
qmaker 0:0d257bbf5c05 332 __libc_init_array();
qmaker 0:0d257bbf5c05 333 main(0, NULL);
qmaker 0:0d257bbf5c05 334 }
qmaker 0:0d257bbf5c05 335
qmaker 0:0d257bbf5c05 336 __attribute__((naked)) void software_init_hook_rtos (void) {
qmaker 0:0d257bbf5c05 337 __asm (
qmaker 0:0d257bbf5c05 338 ".syntax unified\n"
qmaker 0:0d257bbf5c05 339 ".thumb\n"
qmaker 0:0d257bbf5c05 340 "bl osKernelInitialize\n"
qmaker 0:0d257bbf5c05 341 "bl set_main_stack\n"
qmaker 0:0d257bbf5c05 342 "ldr r0,=os_thread_def_main\n"
qmaker 0:0d257bbf5c05 343 "movs r1,#0\n"
qmaker 0:0d257bbf5c05 344 "bl osThreadCreate\n"
qmaker 0:0d257bbf5c05 345 "bl osKernelStart\n"
qmaker 0:0d257bbf5c05 346 /* osKernelStart should not return */
qmaker 0:0d257bbf5c05 347 "B .\n"
qmaker 0:0d257bbf5c05 348 );
qmaker 0:0d257bbf5c05 349 }
qmaker 0:0d257bbf5c05 350
qmaker 0:0d257bbf5c05 351 #elif defined (__ICCARM__)
qmaker 0:0d257bbf5c05 352
qmaker 0:0d257bbf5c05 353 extern void* __vector_table;
qmaker 0:0d257bbf5c05 354 extern int __low_level_init(void);
qmaker 0:0d257bbf5c05 355 extern void __iar_data_init3(void);
qmaker 0:0d257bbf5c05 356 extern __weak void __iar_init_core( void );
qmaker 0:0d257bbf5c05 357 extern __weak void __iar_init_vfp( void );
qmaker 0:0d257bbf5c05 358 extern void __iar_dynamic_initialization(void);
qmaker 0:0d257bbf5c05 359 extern void mbed_sdk_init(void);
qmaker 0:0d257bbf5c05 360 extern void exit(int arg);
qmaker 0:0d257bbf5c05 361
qmaker 0:0d257bbf5c05 362 static uint8_t low_level_init_needed;
qmaker 0:0d257bbf5c05 363
qmaker 0:0d257bbf5c05 364 void pre_main(void) {
qmaker 0:0d257bbf5c05 365 if (low_level_init_needed) {
qmaker 0:0d257bbf5c05 366 __iar_dynamic_initialization();
qmaker 0:0d257bbf5c05 367 }
qmaker 0:0d257bbf5c05 368 main();
qmaker 0:0d257bbf5c05 369 }
qmaker 0:0d257bbf5c05 370
qmaker 0:0d257bbf5c05 371 #pragma required=__vector_table
qmaker 0:0d257bbf5c05 372 void __iar_program_start( void )
qmaker 0:0d257bbf5c05 373 {
qmaker 0:0d257bbf5c05 374 __iar_init_core();
qmaker 0:0d257bbf5c05 375 __iar_init_vfp();
qmaker 0:0d257bbf5c05 376
qmaker 0:0d257bbf5c05 377 uint8_t low_level_init_needed_local;
qmaker 0:0d257bbf5c05 378
qmaker 0:0d257bbf5c05 379 low_level_init_needed_local = __low_level_init();
qmaker 0:0d257bbf5c05 380 if (low_level_init_needed_local) {
qmaker 0:0d257bbf5c05 381 __iar_data_init3();
qmaker 0:0d257bbf5c05 382 mbed_sdk_init();
qmaker 0:0d257bbf5c05 383 }
qmaker 0:0d257bbf5c05 384 /* Store in a global variable after RAM has been initialized */
qmaker 0:0d257bbf5c05 385 low_level_init_needed = low_level_init_needed_local;
qmaker 0:0d257bbf5c05 386 osKernelInitialize();
qmaker 0:0d257bbf5c05 387 set_main_stack();
qmaker 0:0d257bbf5c05 388 osThreadCreate(&os_thread_def_main, NULL);
qmaker 0:0d257bbf5c05 389 osKernelStart();
qmaker 0:0d257bbf5c05 390 /* osKernelStart should not return */
qmaker 0:0d257bbf5c05 391 while (1);
qmaker 0:0d257bbf5c05 392 }
qmaker 0:0d257bbf5c05 393
qmaker 0:0d257bbf5c05 394 #endif
qmaker 0:0d257bbf5c05 395
qmaker 0:0d257bbf5c05 396
qmaker 0:0d257bbf5c05 397 /*----------------------------------------------------------------------------
qmaker 0:0d257bbf5c05 398 * end of file
qmaker 0:0d257bbf5c05 399 *---------------------------------------------------------------------------*/
qmaker 0:0d257bbf5c05 400
qmaker 0:0d257bbf5c05 401