ソースの整理中ですが、利用はできます。

Dependencies:   EthernetInterface HttpServer TextLCD mbed-rpc mbed-rtos mbed Socket lwip-eth lwip-sys lwip

Committer:
yueee_yt
Date:
Wed Mar 12 04:39:15 2014 +0000
Revision:
2:14b689a85306
Parent:
0:7766f6712673
bug fix

Who changed what in which revision?

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