Daoyu_Sofiane Yao_Belouka / mbed-rtos

Dependents:   Mecatro_Gyro_Programme_Codeur_HC06

Committer:
daoyu_sofiane
Date:
Fri Apr 16 09:25:33 2021 +0000
Revision:
0:a8ed743bc1e1
Projet Gyropode

Who changed what in which revision?

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