NRF com

Dependencies:   mbed nRF24L01P

Committer:
vmihalcut
Date:
Mon May 27 06:06:31 2013 +0000
Revision:
0:fdfe93cb9255
NRF24L01 receiver

Who changed what in which revision?

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