Pierre Provent / USBHost

Dependents:   TEST_USB_Nucleo_F429ZI Essais_USB_Nucleo_F429ZI SID_V3_Nucleo_F429ZI SID_V4_Nucleo_F429ZI_copy

Committer:
pierreprovent
Date:
Fri Sep 25 10:17:49 2020 +0000
Revision:
0:77ca32e8e04e
Programme acquisition en enregistrement sur clef USB carte Nucleo F429ZI cours ELE118 Cnam

Who changed what in which revision?

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