OS2

Dependents:   GYRO_MPU6050 Bluetooth_Powered_Multimeter_Using_STM32F429_and_RTOS fyp

Committer:
guilhemMBED
Date:
Mon Feb 03 13:41:14 2020 +0000
Revision:
0:a7c449cd2d5a
previous version;

Who changed what in which revision?

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