Alan Ffrench / Mbed 2 deprecated Experiment_2_5

Dependencies:   mbed

Committer:
alanffrench
Date:
Wed Jul 29 18:51:38 2020 +0000
Revision:
0:52468b19aa21
Threads

Who changed what in which revision?

UserRevisionLine numberNew contents of line
alanffrench 0:52468b19aa21 1 /*----------------------------------------------------------------------------
alanffrench 0:52468b19aa21 2 * RL-ARM - RTX
alanffrench 0:52468b19aa21 3 *----------------------------------------------------------------------------
alanffrench 0:52468b19aa21 4 * Name: RTX_CM_LIB.H
alanffrench 0:52468b19aa21 5 * Purpose: RTX Kernel System Configuration
alanffrench 0:52468b19aa21 6 * Rev.: V4.60
alanffrench 0:52468b19aa21 7 *----------------------------------------------------------------------------
alanffrench 0:52468b19aa21 8 *
alanffrench 0:52468b19aa21 9 * Copyright (c) 1999-2009 KEIL, 2009-2012 ARM Germany GmbH
alanffrench 0:52468b19aa21 10 * All rights reserved.
alanffrench 0:52468b19aa21 11 * Redistribution and use in source and binary forms, with or without
alanffrench 0:52468b19aa21 12 * modification, are permitted provided that the following conditions are met:
alanffrench 0:52468b19aa21 13 * - Redistributions of source code must retain the above copyright
alanffrench 0:52468b19aa21 14 * notice, this list of conditions and the following disclaimer.
alanffrench 0:52468b19aa21 15 * - Redistributions in binary form must reproduce the above copyright
alanffrench 0:52468b19aa21 16 * notice, this list of conditions and the following disclaimer in the
alanffrench 0:52468b19aa21 17 * documentation and/or other materials provided with the distribution.
alanffrench 0:52468b19aa21 18 * - Neither the name of ARM nor the names of its contributors may be used
alanffrench 0:52468b19aa21 19 * to endorse or promote products derived from this software without
alanffrench 0:52468b19aa21 20 * specific prior written permission.
alanffrench 0:52468b19aa21 21 *
alanffrench 0:52468b19aa21 22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
alanffrench 0:52468b19aa21 23 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
alanffrench 0:52468b19aa21 24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
alanffrench 0:52468b19aa21 25 * ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
alanffrench 0:52468b19aa21 26 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
alanffrench 0:52468b19aa21 27 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
alanffrench 0:52468b19aa21 28 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
alanffrench 0:52468b19aa21 29 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
alanffrench 0:52468b19aa21 30 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
alanffrench 0:52468b19aa21 31 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
alanffrench 0:52468b19aa21 32 * POSSIBILITY OF SUCH DAMAGE.
alanffrench 0:52468b19aa21 33 *---------------------------------------------------------------------------*/
alanffrench 0:52468b19aa21 34
alanffrench 0:52468b19aa21 35 #if defined (__CC_ARM)
alanffrench 0:52468b19aa21 36 #pragma O3
alanffrench 0:52468b19aa21 37 #define __USED __attribute__((used))
alanffrench 0:52468b19aa21 38 #elif defined (__GNUC__)
alanffrench 0:52468b19aa21 39 #pragma GCC optimize ("O3")
alanffrench 0:52468b19aa21 40 #define __USED __attribute__((used))
alanffrench 0:52468b19aa21 41 #elif defined (__ICCARM__)
alanffrench 0:52468b19aa21 42 #define __USED __root
alanffrench 0:52468b19aa21 43 #endif
alanffrench 0:52468b19aa21 44
alanffrench 0:52468b19aa21 45
alanffrench 0:52468b19aa21 46 /*----------------------------------------------------------------------------
alanffrench 0:52468b19aa21 47 * Definitions
alanffrench 0:52468b19aa21 48 *---------------------------------------------------------------------------*/
alanffrench 0:52468b19aa21 49
alanffrench 0:52468b19aa21 50 #define _declare_box(pool,size,cnt) uint32_t pool[(((size)+3)/4)*(cnt) + 3]
alanffrench 0:52468b19aa21 51 #define _declare_box8(pool,size,cnt) uint64_t pool[(((size)+7)/8)*(cnt) + 2]
alanffrench 0:52468b19aa21 52
alanffrench 0:52468b19aa21 53 #define OS_TCB_SIZE 48
alanffrench 0:52468b19aa21 54 #define OS_TMR_SIZE 8
alanffrench 0:52468b19aa21 55
alanffrench 0:52468b19aa21 56 #if defined (__CC_ARM) && !defined (__MICROLIB)
alanffrench 0:52468b19aa21 57
alanffrench 0:52468b19aa21 58 typedef void *OS_ID;
alanffrench 0:52468b19aa21 59 typedef uint32_t OS_TID;
alanffrench 0:52468b19aa21 60 typedef uint32_t OS_MUT[3];
alanffrench 0:52468b19aa21 61 typedef uint32_t OS_RESULT;
alanffrench 0:52468b19aa21 62
alanffrench 0:52468b19aa21 63 #define runtask_id() rt_tsk_self()
alanffrench 0:52468b19aa21 64 #define mutex_init(m) rt_mut_init(m)
alanffrench 0:52468b19aa21 65 #define mutex_wait(m) os_mut_wait(m,0xFFFF)
alanffrench 0:52468b19aa21 66 #define mutex_rel(m) os_mut_release(m)
alanffrench 0:52468b19aa21 67
alanffrench 0:52468b19aa21 68 extern OS_TID rt_tsk_self (void);
alanffrench 0:52468b19aa21 69 extern void rt_mut_init (OS_ID mutex);
alanffrench 0:52468b19aa21 70 extern OS_RESULT rt_mut_release (OS_ID mutex);
alanffrench 0:52468b19aa21 71 extern OS_RESULT rt_mut_wait (OS_ID mutex, uint16_t timeout);
alanffrench 0:52468b19aa21 72
alanffrench 0:52468b19aa21 73 #define os_mut_wait(mutex,timeout) _os_mut_wait((uint32_t)rt_mut_wait,mutex,timeout)
alanffrench 0:52468b19aa21 74 #define os_mut_release(mutex) _os_mut_release((uint32_t)rt_mut_release,mutex)
alanffrench 0:52468b19aa21 75
alanffrench 0:52468b19aa21 76 OS_RESULT _os_mut_release (uint32_t p, OS_ID mutex) __svc_indirect(0);
alanffrench 0:52468b19aa21 77 OS_RESULT _os_mut_wait (uint32_t p, OS_ID mutex, uint16_t timeout) __svc_indirect(0);
alanffrench 0:52468b19aa21 78
alanffrench 0:52468b19aa21 79 #endif
alanffrench 0:52468b19aa21 80
alanffrench 0:52468b19aa21 81
alanffrench 0:52468b19aa21 82 /*----------------------------------------------------------------------------
alanffrench 0:52468b19aa21 83 * Global Variables
alanffrench 0:52468b19aa21 84 *---------------------------------------------------------------------------*/
alanffrench 0:52468b19aa21 85
alanffrench 0:52468b19aa21 86 #if (OS_TIMERS != 0)
alanffrench 0:52468b19aa21 87 #define OS_TASK_CNT (OS_TASKCNT + 1)
alanffrench 0:52468b19aa21 88 #else
alanffrench 0:52468b19aa21 89 #define OS_TASK_CNT OS_TASKCNT
alanffrench 0:52468b19aa21 90 #endif
alanffrench 0:52468b19aa21 91
alanffrench 0:52468b19aa21 92 uint16_t const os_maxtaskrun = OS_TASK_CNT;
alanffrench 0:52468b19aa21 93 uint32_t const os_rrobin = (OS_ROBIN << 16) | OS_ROBINTOUT;
alanffrench 0:52468b19aa21 94 uint32_t const os_trv = OS_TRV;
alanffrench 0:52468b19aa21 95 uint8_t const os_flags = OS_RUNPRIV;
alanffrench 0:52468b19aa21 96
alanffrench 0:52468b19aa21 97 /* Export following defines to uVision debugger. */
alanffrench 0:52468b19aa21 98 __USED uint32_t const os_clockrate = OS_TICK;
alanffrench 0:52468b19aa21 99 __USED uint32_t const os_timernum = 0;
alanffrench 0:52468b19aa21 100
alanffrench 0:52468b19aa21 101 /* Stack for the os_idle_demon */
alanffrench 0:52468b19aa21 102 unsigned int idle_task_stack[OS_IDLESTKSIZE];
alanffrench 0:52468b19aa21 103 unsigned short const idle_task_stack_size = OS_IDLESTKSIZE;
alanffrench 0:52468b19aa21 104
alanffrench 0:52468b19aa21 105 #ifndef OS_FIFOSZ
alanffrench 0:52468b19aa21 106 #define OS_FIFOSZ 16
alanffrench 0:52468b19aa21 107 #endif
alanffrench 0:52468b19aa21 108
alanffrench 0:52468b19aa21 109 /* Fifo Queue buffer for ISR requests.*/
alanffrench 0:52468b19aa21 110 uint32_t os_fifo[OS_FIFOSZ*2+1];
alanffrench 0:52468b19aa21 111 uint8_t const os_fifo_size = OS_FIFOSZ;
alanffrench 0:52468b19aa21 112
alanffrench 0:52468b19aa21 113 /* An array of Active task pointers. */
alanffrench 0:52468b19aa21 114 void *os_active_TCB[OS_TASK_CNT];
alanffrench 0:52468b19aa21 115
alanffrench 0:52468b19aa21 116 /* User Timers Resources */
alanffrench 0:52468b19aa21 117 #if (OS_TIMERS != 0)
alanffrench 0:52468b19aa21 118 extern void osTimerThread (void const *argument);
alanffrench 0:52468b19aa21 119 osThreadDef(osTimerThread, (osPriority)(OS_TIMERPRIO-3), 4*OS_TIMERSTKSZ);
alanffrench 0:52468b19aa21 120 osThreadId osThreadId_osTimerThread;
alanffrench 0:52468b19aa21 121 osMessageQDef(osTimerMessageQ, OS_TIMERCBQS, void *);
alanffrench 0:52468b19aa21 122 osMessageQId osMessageQId_osTimerMessageQ;
alanffrench 0:52468b19aa21 123 #else
alanffrench 0:52468b19aa21 124 osThreadDef_t os_thread_def_osTimerThread = { NULL };
alanffrench 0:52468b19aa21 125 osThreadId osThreadId_osTimerThread;
alanffrench 0:52468b19aa21 126 osMessageQDef(osTimerMessageQ, 0, void *);
alanffrench 0:52468b19aa21 127 osMessageQId osMessageQId_osTimerMessageQ;
alanffrench 0:52468b19aa21 128 #endif
alanffrench 0:52468b19aa21 129
alanffrench 0:52468b19aa21 130
alanffrench 0:52468b19aa21 131 /*----------------------------------------------------------------------------
alanffrench 0:52468b19aa21 132 * RTX Optimizations (empty functions)
alanffrench 0:52468b19aa21 133 *---------------------------------------------------------------------------*/
alanffrench 0:52468b19aa21 134
alanffrench 0:52468b19aa21 135 #if OS_ROBIN == 0
alanffrench 0:52468b19aa21 136 void rt_init_robin (void) {;}
alanffrench 0:52468b19aa21 137 void rt_chk_robin (void) {;}
alanffrench 0:52468b19aa21 138 #endif
alanffrench 0:52468b19aa21 139
alanffrench 0:52468b19aa21 140 #if OS_STKCHECK == 0
alanffrench 0:52468b19aa21 141 void rt_stk_check (void) {;}
alanffrench 0:52468b19aa21 142 #endif
alanffrench 0:52468b19aa21 143
alanffrench 0:52468b19aa21 144
alanffrench 0:52468b19aa21 145 /*----------------------------------------------------------------------------
alanffrench 0:52468b19aa21 146 * Standard Library multithreading interface
alanffrench 0:52468b19aa21 147 *---------------------------------------------------------------------------*/
alanffrench 0:52468b19aa21 148
alanffrench 0:52468b19aa21 149 #if defined (__CC_ARM) && !defined (__MICROLIB)
alanffrench 0:52468b19aa21 150 static OS_MUT std_libmutex[OS_MUTEXCNT];
alanffrench 0:52468b19aa21 151 static uint32_t nr_mutex;
alanffrench 0:52468b19aa21 152
alanffrench 0:52468b19aa21 153 /*--------------------------- _mutex_initialize -----------------------------*/
alanffrench 0:52468b19aa21 154
alanffrench 0:52468b19aa21 155 int _mutex_initialize (OS_ID *mutex) {
alanffrench 0:52468b19aa21 156 /* Allocate and initialize a system mutex. */
alanffrench 0:52468b19aa21 157
alanffrench 0:52468b19aa21 158 if (nr_mutex >= OS_MUTEXCNT) {
alanffrench 0:52468b19aa21 159 /* If you are here, you need to increase the number OS_MUTEXCNT. */
alanffrench 0:52468b19aa21 160 for (;;);
alanffrench 0:52468b19aa21 161 }
alanffrench 0:52468b19aa21 162 *mutex = &std_libmutex[nr_mutex++];
alanffrench 0:52468b19aa21 163 mutex_init (*mutex);
alanffrench 0:52468b19aa21 164 return (1);
alanffrench 0:52468b19aa21 165 }
alanffrench 0:52468b19aa21 166
alanffrench 0:52468b19aa21 167
alanffrench 0:52468b19aa21 168 /*--------------------------- _mutex_acquire --------------------------------*/
alanffrench 0:52468b19aa21 169
alanffrench 0:52468b19aa21 170 __attribute__((used)) void _mutex_acquire (OS_ID *mutex) {
alanffrench 0:52468b19aa21 171 /* Acquire a system mutex, lock stdlib resources. */
alanffrench 0:52468b19aa21 172 if (runtask_id ()) {
alanffrench 0:52468b19aa21 173 /* RTX running, acquire a mutex. */
alanffrench 0:52468b19aa21 174 mutex_wait (*mutex);
alanffrench 0:52468b19aa21 175 }
alanffrench 0:52468b19aa21 176 }
alanffrench 0:52468b19aa21 177
alanffrench 0:52468b19aa21 178
alanffrench 0:52468b19aa21 179 /*--------------------------- _mutex_release --------------------------------*/
alanffrench 0:52468b19aa21 180
alanffrench 0:52468b19aa21 181 __attribute__((used)) void _mutex_release (OS_ID *mutex) {
alanffrench 0:52468b19aa21 182 /* Release a system mutex, unlock stdlib resources. */
alanffrench 0:52468b19aa21 183 if (runtask_id ()) {
alanffrench 0:52468b19aa21 184 /* RTX running, release a mutex. */
alanffrench 0:52468b19aa21 185 mutex_rel (*mutex);
alanffrench 0:52468b19aa21 186 }
alanffrench 0:52468b19aa21 187 }
alanffrench 0:52468b19aa21 188
alanffrench 0:52468b19aa21 189 #endif
alanffrench 0:52468b19aa21 190
alanffrench 0:52468b19aa21 191
alanffrench 0:52468b19aa21 192 /*----------------------------------------------------------------------------
alanffrench 0:52468b19aa21 193 * RTX Startup
alanffrench 0:52468b19aa21 194 *---------------------------------------------------------------------------*/
alanffrench 0:52468b19aa21 195
alanffrench 0:52468b19aa21 196 /* Main Thread definition */
alanffrench 0:52468b19aa21 197 extern int main (void);
alanffrench 0:52468b19aa21 198 osThreadDef_t os_thread_def_main = {(os_pthread)main, osPriorityNormal, 0, NULL};
alanffrench 0:52468b19aa21 199
alanffrench 0:52468b19aa21 200 #if defined (__CC_ARM)
alanffrench 0:52468b19aa21 201
alanffrench 0:52468b19aa21 202 // This define should be probably moved to the CMSIS layer
alanffrench 0:52468b19aa21 203 #ifdef TARGET_LPC1768
alanffrench 0:52468b19aa21 204 #define INITIAL_SP (0x10008000UL)
alanffrench 0:52468b19aa21 205
alanffrench 0:52468b19aa21 206 #elif TARGET_LPC11U24
alanffrench 0:52468b19aa21 207 #define INITIAL_SP (0x10001000UL)
alanffrench 0:52468b19aa21 208
alanffrench 0:52468b19aa21 209 #endif
alanffrench 0:52468b19aa21 210
alanffrench 0:52468b19aa21 211 extern unsigned char Image$$RW_IRAM1$$ZI$$Limit[];
alanffrench 0:52468b19aa21 212
alanffrench 0:52468b19aa21 213 void set_main_stack(void) {
alanffrench 0:52468b19aa21 214 // Leave OS_SCHEDULERSTKSIZE words for the scheduler and interrupts
alanffrench 0:52468b19aa21 215 os_thread_def_main.stack_pointer = Image$$RW_IRAM1$$ZI$$Limit;
alanffrench 0:52468b19aa21 216 os_thread_def_main.stacksize = (INITIAL_SP - (unsigned int)Image$$RW_IRAM1$$ZI$$Limit) - (OS_SCHEDULERSTKSIZE * 4);
alanffrench 0:52468b19aa21 217 }
alanffrench 0:52468b19aa21 218
alanffrench 0:52468b19aa21 219 #ifdef __MICROLIB
alanffrench 0:52468b19aa21 220 void _main_init (void) __attribute__((section(".ARM.Collect$$$$000000FF")));
alanffrench 0:52468b19aa21 221 void _main_init (void) {
alanffrench 0:52468b19aa21 222 osKernelInitialize();
alanffrench 0:52468b19aa21 223 set_main_stack();
alanffrench 0:52468b19aa21 224 osThreadCreate(&os_thread_def_main, NULL);
alanffrench 0:52468b19aa21 225 osKernelStart();
alanffrench 0:52468b19aa21 226 for (;;);
alanffrench 0:52468b19aa21 227 }
alanffrench 0:52468b19aa21 228 #else
alanffrench 0:52468b19aa21 229
alanffrench 0:52468b19aa21 230 /* The single memory model is checking for stack collision at run time, verifing
alanffrench 0:52468b19aa21 231 that the heap pointer is underneath the stack pointer.
alanffrench 0:52468b19aa21 232
alanffrench 0:52468b19aa21 233 With the RTOS there is not only one stack above the heap, there are multiple
alanffrench 0:52468b19aa21 234 stacks and some of them are underneath the heap pointer.
alanffrench 0:52468b19aa21 235 */
alanffrench 0:52468b19aa21 236 #pragma import(__use_two_region_memory)
alanffrench 0:52468b19aa21 237
alanffrench 0:52468b19aa21 238 __asm void __rt_entry (void) {
alanffrench 0:52468b19aa21 239
alanffrench 0:52468b19aa21 240 IMPORT __user_setup_stackheap
alanffrench 0:52468b19aa21 241 IMPORT __rt_lib_init
alanffrench 0:52468b19aa21 242 IMPORT os_thread_def_main
alanffrench 0:52468b19aa21 243 IMPORT osKernelInitialize
alanffrench 0:52468b19aa21 244 IMPORT set_main_stack
alanffrench 0:52468b19aa21 245 IMPORT osKernelStart
alanffrench 0:52468b19aa21 246 IMPORT osThreadCreate
alanffrench 0:52468b19aa21 247 IMPORT exit
alanffrench 0:52468b19aa21 248
alanffrench 0:52468b19aa21 249 BL __user_setup_stackheap
alanffrench 0:52468b19aa21 250 MOV R1,R2
alanffrench 0:52468b19aa21 251 BL __rt_lib_init
alanffrench 0:52468b19aa21 252 BL osKernelInitialize
alanffrench 0:52468b19aa21 253 BL set_main_stack
alanffrench 0:52468b19aa21 254 LDR R0,=os_thread_def_main
alanffrench 0:52468b19aa21 255 MOVS R1,#0
alanffrench 0:52468b19aa21 256 BL osThreadCreate
alanffrench 0:52468b19aa21 257 BL osKernelStart
alanffrench 0:52468b19aa21 258 BL exit
alanffrench 0:52468b19aa21 259
alanffrench 0:52468b19aa21 260 ALIGN
alanffrench 0:52468b19aa21 261 }
alanffrench 0:52468b19aa21 262 #endif
alanffrench 0:52468b19aa21 263
alanffrench 0:52468b19aa21 264 #elif defined (__GNUC__)
alanffrench 0:52468b19aa21 265
alanffrench 0:52468b19aa21 266 #ifdef __CS3__
alanffrench 0:52468b19aa21 267
alanffrench 0:52468b19aa21 268 /* CS3 start_c routine.
alanffrench 0:52468b19aa21 269 *
alanffrench 0:52468b19aa21 270 * Copyright (c) 2006, 2007 CodeSourcery Inc
alanffrench 0:52468b19aa21 271 *
alanffrench 0:52468b19aa21 272 * The authors hereby grant permission to use, copy, modify, distribute,
alanffrench 0:52468b19aa21 273 * and license this software and its documentation for any purpose, provided
alanffrench 0:52468b19aa21 274 * that existing copyright notices are retained in all copies and that this
alanffrench 0:52468b19aa21 275 * notice is included verbatim in any distributions. No written agreement,
alanffrench 0:52468b19aa21 276 * license, or royalty fee is required for any of the authorized uses.
alanffrench 0:52468b19aa21 277 * Modifications to this software may be copyrighted by their authors
alanffrench 0:52468b19aa21 278 * and need not follow the licensing terms described here, provided that
alanffrench 0:52468b19aa21 279 * the new terms are clearly indicated on the first page of each file where
alanffrench 0:52468b19aa21 280 * they apply.
alanffrench 0:52468b19aa21 281 */
alanffrench 0:52468b19aa21 282
alanffrench 0:52468b19aa21 283 #include "cs3.h"
alanffrench 0:52468b19aa21 284
alanffrench 0:52468b19aa21 285 extern void __libc_init_array (void);
alanffrench 0:52468b19aa21 286
alanffrench 0:52468b19aa21 287 __attribute ((noreturn)) void __cs3_start_c (void){
alanffrench 0:52468b19aa21 288 unsigned regions = __cs3_region_num;
alanffrench 0:52468b19aa21 289 const struct __cs3_region *rptr = __cs3_regions;
alanffrench 0:52468b19aa21 290
alanffrench 0:52468b19aa21 291 /* Initialize memory */
alanffrench 0:52468b19aa21 292 for (regions = __cs3_region_num, rptr = __cs3_regions; regions--; rptr++) {
alanffrench 0:52468b19aa21 293 long long *src = (long long *)rptr->init;
alanffrench 0:52468b19aa21 294 long long *dst = (long long *)rptr->data;
alanffrench 0:52468b19aa21 295 unsigned limit = rptr->init_size;
alanffrench 0:52468b19aa21 296 unsigned count;
alanffrench 0:52468b19aa21 297
alanffrench 0:52468b19aa21 298 if (src != dst)
alanffrench 0:52468b19aa21 299 for (count = 0; count != limit; count += sizeof (long long))
alanffrench 0:52468b19aa21 300 *dst++ = *src++;
alanffrench 0:52468b19aa21 301 else
alanffrench 0:52468b19aa21 302 dst = (long long *)((char *)dst + limit);
alanffrench 0:52468b19aa21 303 limit = rptr->zero_size;
alanffrench 0:52468b19aa21 304 for (count = 0; count != limit; count += sizeof (long long))
alanffrench 0:52468b19aa21 305 *dst++ = 0;
alanffrench 0:52468b19aa21 306 }
alanffrench 0:52468b19aa21 307
alanffrench 0:52468b19aa21 308 /* Run initializers. */
alanffrench 0:52468b19aa21 309 __libc_init_array ();
alanffrench 0:52468b19aa21 310
alanffrench 0:52468b19aa21 311 osKernelInitialize();
alanffrench 0:52468b19aa21 312 osThreadCreate(&os_thread_def_main, NULL);
alanffrench 0:52468b19aa21 313 osKernelStart();
alanffrench 0:52468b19aa21 314 for (;;);
alanffrench 0:52468b19aa21 315 }
alanffrench 0:52468b19aa21 316
alanffrench 0:52468b19aa21 317 #else
alanffrench 0:52468b19aa21 318
alanffrench 0:52468b19aa21 319 __attribute__((naked)) void software_init_hook (void) {
alanffrench 0:52468b19aa21 320 __asm (
alanffrench 0:52468b19aa21 321 ".syntax unified\n"
alanffrench 0:52468b19aa21 322 ".thumb\n"
alanffrench 0:52468b19aa21 323 "movs r0,#0\n"
alanffrench 0:52468b19aa21 324 "movs r1,#0\n"
alanffrench 0:52468b19aa21 325 "mov r4,r0\n"
alanffrench 0:52468b19aa21 326 "mov r5,r1\n"
alanffrench 0:52468b19aa21 327 "ldr r0,= __libc_fini_array\n"
alanffrench 0:52468b19aa21 328 "bl atexit\n"
alanffrench 0:52468b19aa21 329 "bl __libc_init_array\n"
alanffrench 0:52468b19aa21 330 "mov r0,r4\n"
alanffrench 0:52468b19aa21 331 "mov r1,r5\n"
alanffrench 0:52468b19aa21 332 "bl osKernelInitialize\n"
alanffrench 0:52468b19aa21 333 "ldr r0,=os_thread_def_main\n"
alanffrench 0:52468b19aa21 334 "movs r1,#0\n"
alanffrench 0:52468b19aa21 335 "bl osThreadCreate\n"
alanffrench 0:52468b19aa21 336 "bl osKernelStart\n"
alanffrench 0:52468b19aa21 337 "bl exit\n"
alanffrench 0:52468b19aa21 338 );
alanffrench 0:52468b19aa21 339 }
alanffrench 0:52468b19aa21 340
alanffrench 0:52468b19aa21 341 #endif
alanffrench 0:52468b19aa21 342
alanffrench 0:52468b19aa21 343 #elif defined (__ICCARM__)
alanffrench 0:52468b19aa21 344
alanffrench 0:52468b19aa21 345 extern int __low_level_init(void);
alanffrench 0:52468b19aa21 346 extern void __iar_data_init3(void);
alanffrench 0:52468b19aa21 347 extern void exit(int arg);
alanffrench 0:52468b19aa21 348
alanffrench 0:52468b19aa21 349 __noreturn __stackless void __cmain(void) {
alanffrench 0:52468b19aa21 350 int a;
alanffrench 0:52468b19aa21 351
alanffrench 0:52468b19aa21 352 if (__low_level_init() != 0) {
alanffrench 0:52468b19aa21 353 __iar_data_init3();
alanffrench 0:52468b19aa21 354 }
alanffrench 0:52468b19aa21 355 osKernelInitialize();
alanffrench 0:52468b19aa21 356 osThreadCreate(&os_thread_def_main, NULL);
alanffrench 0:52468b19aa21 357 a = osKernelStart();
alanffrench 0:52468b19aa21 358 exit(a);
alanffrench 0:52468b19aa21 359 }
alanffrench 0:52468b19aa21 360
alanffrench 0:52468b19aa21 361 #endif
alanffrench 0:52468b19aa21 362
alanffrench 0:52468b19aa21 363
alanffrench 0:52468b19aa21 364 /*----------------------------------------------------------------------------
alanffrench 0:52468b19aa21 365 * end of file
alanffrench 0:52468b19aa21 366 *---------------------------------------------------------------------------*/
alanffrench 0:52468b19aa21 367