Code for our FYDP -only one IMU works right now -RTOS is working

Dependencies:   mbed

Committer:
majik
Date:
Wed Mar 18 22:23:48 2015 +0000
Revision:
0:964eb6a2ef00
This is our FYDP code, but only one IMU works with the RTOS.

Who changed what in which revision?

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