Initial publish

Dependencies:   mbed

Fork of el17dg by Dmitrijs Griskovs

Committer:
Noximilien
Date:
Tue May 07 15:22:35 2019 +0000
Revision:
40:e3bbda7444fa
Parent:
1:5aa2312d3e94
The Final, Submission Version. I have read and agreed to the academic integrity. SID:201160286

Who changed what in which revision?

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