the program have one sensor acs712 and moduleds1302

Dependencies:   FATFileSystem mbed

Committer:
RUBENTEC
Date:
Thu Jun 08 20:17:34 2017 +0000
Revision:
0:b82abca089ac
ds1302-bluetooth-acs712

Who changed what in which revision?

UserRevisionLine numberNew contents of line
RUBENTEC 0:b82abca089ac 1 /*----------------------------------------------------------------------------
RUBENTEC 0:b82abca089ac 2 * RL-ARM - RTX
RUBENTEC 0:b82abca089ac 3 *----------------------------------------------------------------------------
RUBENTEC 0:b82abca089ac 4 * Name: RTX_CM_LIB.H
RUBENTEC 0:b82abca089ac 5 * Purpose: RTX Kernel System Configuration
RUBENTEC 0:b82abca089ac 6 * Rev.: V4.73
RUBENTEC 0:b82abca089ac 7 *----------------------------------------------------------------------------
RUBENTEC 0:b82abca089ac 8 *
RUBENTEC 0:b82abca089ac 9 * Copyright (c) 1999-2009 KEIL, 2009-2013 ARM Germany GmbH
RUBENTEC 0:b82abca089ac 10 * All rights reserved.
RUBENTEC 0:b82abca089ac 11 * Redistribution and use in source and binary forms, with or without
RUBENTEC 0:b82abca089ac 12 * modification, are permitted provided that the following conditions are met:
RUBENTEC 0:b82abca089ac 13 * - Redistributions of source code must retain the above copyright
RUBENTEC 0:b82abca089ac 14 * notice, this list of conditions and the following disclaimer.
RUBENTEC 0:b82abca089ac 15 * - Redistributions in binary form must reproduce the above copyright
RUBENTEC 0:b82abca089ac 16 * notice, this list of conditions and the following disclaimer in the
RUBENTEC 0:b82abca089ac 17 * documentation and/or other materials provided with the distribution.
RUBENTEC 0:b82abca089ac 18 * - Neither the name of ARM nor the names of its contributors may be used
RUBENTEC 0:b82abca089ac 19 * to endorse or promote products derived from this software without
RUBENTEC 0:b82abca089ac 20 * specific prior written permission.
RUBENTEC 0:b82abca089ac 21 *
RUBENTEC 0:b82abca089ac 22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
RUBENTEC 0:b82abca089ac 23 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
RUBENTEC 0:b82abca089ac 24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
RUBENTEC 0:b82abca089ac 25 * ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
RUBENTEC 0:b82abca089ac 26 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
RUBENTEC 0:b82abca089ac 27 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
RUBENTEC 0:b82abca089ac 28 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
RUBENTEC 0:b82abca089ac 29 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
RUBENTEC 0:b82abca089ac 30 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
RUBENTEC 0:b82abca089ac 31 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
RUBENTEC 0:b82abca089ac 32 * POSSIBILITY OF SUCH DAMAGE.
RUBENTEC 0:b82abca089ac 33 *---------------------------------------------------------------------------*/
RUBENTEC 0:b82abca089ac 34
RUBENTEC 0:b82abca089ac 35 #if defined (__CC_ARM)
RUBENTEC 0:b82abca089ac 36 #pragma O3
RUBENTEC 0:b82abca089ac 37 #define __USED __attribute__((used))
RUBENTEC 0:b82abca089ac 38 #elif defined (__GNUC__)
RUBENTEC 0:b82abca089ac 39 #pragma GCC optimize ("O3")
RUBENTEC 0:b82abca089ac 40 #define __USED __attribute__((used))
RUBENTEC 0:b82abca089ac 41 #elif defined (__ICCARM__)
RUBENTEC 0:b82abca089ac 42 #define __USED __root
RUBENTEC 0:b82abca089ac 43 #endif
RUBENTEC 0:b82abca089ac 44
RUBENTEC 0:b82abca089ac 45
RUBENTEC 0:b82abca089ac 46 /*----------------------------------------------------------------------------
RUBENTEC 0:b82abca089ac 47 * Definitions
RUBENTEC 0:b82abca089ac 48 *---------------------------------------------------------------------------*/
RUBENTEC 0:b82abca089ac 49
RUBENTEC 0:b82abca089ac 50 #define _declare_box(pool,size,cnt) uint32_t pool[(((size)+3)/4)*(cnt) + 3]
RUBENTEC 0:b82abca089ac 51 #define _declare_box8(pool,size,cnt) uint64_t pool[(((size)+7)/8)*(cnt) + 2]
RUBENTEC 0:b82abca089ac 52
RUBENTEC 0:b82abca089ac 53 #define OS_TCB_SIZE 52
RUBENTEC 0:b82abca089ac 54 #define OS_TMR_SIZE 8
RUBENTEC 0:b82abca089ac 55
RUBENTEC 0:b82abca089ac 56 #if defined (__CC_ARM) && !defined (__MICROLIB)
RUBENTEC 0:b82abca089ac 57
RUBENTEC 0:b82abca089ac 58 typedef void *OS_ID;
RUBENTEC 0:b82abca089ac 59 typedef uint32_t OS_TID;
RUBENTEC 0:b82abca089ac 60 typedef uint32_t OS_MUT[4];
RUBENTEC 0:b82abca089ac 61 typedef uint32_t OS_RESULT;
RUBENTEC 0:b82abca089ac 62
RUBENTEC 0:b82abca089ac 63 #define runtask_id() rt_tsk_self()
RUBENTEC 0:b82abca089ac 64 #define mutex_init(m) rt_mut_init(m)
RUBENTEC 0:b82abca089ac 65 #define mutex_wait(m) os_mut_wait(m,0xFFFF)
RUBENTEC 0:b82abca089ac 66 #define mutex_rel(m) os_mut_release(m)
RUBENTEC 0:b82abca089ac 67
RUBENTEC 0:b82abca089ac 68 extern OS_TID rt_tsk_self (void);
RUBENTEC 0:b82abca089ac 69 extern void rt_mut_init (OS_ID mutex);
RUBENTEC 0:b82abca089ac 70 extern OS_RESULT rt_mut_release (OS_ID mutex);
RUBENTEC 0:b82abca089ac 71 extern OS_RESULT rt_mut_wait (OS_ID mutex, uint16_t timeout);
RUBENTEC 0:b82abca089ac 72
RUBENTEC 0:b82abca089ac 73 #define os_mut_wait(mutex,timeout) _os_mut_wait((uint32_t)rt_mut_wait,mutex,timeout)
RUBENTEC 0:b82abca089ac 74 #define os_mut_release(mutex) _os_mut_release((uint32_t)rt_mut_release,mutex)
RUBENTEC 0:b82abca089ac 75
RUBENTEC 0:b82abca089ac 76 OS_RESULT _os_mut_release (uint32_t p, OS_ID mutex) __svc_indirect(0);
RUBENTEC 0:b82abca089ac 77 OS_RESULT _os_mut_wait (uint32_t p, OS_ID mutex, uint16_t timeout) __svc_indirect(0);
RUBENTEC 0:b82abca089ac 78
RUBENTEC 0:b82abca089ac 79 #elif defined (__ICCARM__)
RUBENTEC 0:b82abca089ac 80
RUBENTEC 0:b82abca089ac 81 typedef void *OS_ID;
RUBENTEC 0:b82abca089ac 82 typedef uint32_t OS_TID;
RUBENTEC 0:b82abca089ac 83 typedef uint32_t OS_MUT[4];
RUBENTEC 0:b82abca089ac 84 typedef uint32_t OS_RESULT;
RUBENTEC 0:b82abca089ac 85
RUBENTEC 0:b82abca089ac 86 #define runtask_id() rt_tsk_self()
RUBENTEC 0:b82abca089ac 87 #define mutex_init(m) rt_mut_init(m)
RUBENTEC 0:b82abca089ac 88 #define mutex_del(m) os_mut_delete(m)
RUBENTEC 0:b82abca089ac 89 #define mutex_wait(m) os_mut_wait(m,0xFFFF)
RUBENTEC 0:b82abca089ac 90 #define mutex_rel(m) os_mut_release(m)
RUBENTEC 0:b82abca089ac 91
RUBENTEC 0:b82abca089ac 92 extern OS_TID rt_tsk_self (void);
RUBENTEC 0:b82abca089ac 93 extern void rt_mut_init (OS_ID mutex);
RUBENTEC 0:b82abca089ac 94 extern OS_RESULT rt_mut_delete (OS_ID mutex);
RUBENTEC 0:b82abca089ac 95 extern OS_RESULT rt_mut_release (OS_ID mutex);
RUBENTEC 0:b82abca089ac 96 extern OS_RESULT rt_mut_wait (OS_ID mutex, uint16_t timeout);
RUBENTEC 0:b82abca089ac 97
RUBENTEC 0:b82abca089ac 98 #pragma swi_number=0
RUBENTEC 0:b82abca089ac 99 __swi OS_RESULT _os_mut_delete (OS_ID mutex);
RUBENTEC 0:b82abca089ac 100
RUBENTEC 0:b82abca089ac 101 static inline OS_RESULT os_mut_delete(OS_ID mutex)
RUBENTEC 0:b82abca089ac 102 {
RUBENTEC 0:b82abca089ac 103 __asm("mov r12,%0\n" :: "r"(&rt_mut_delete) : "r12" );
RUBENTEC 0:b82abca089ac 104 return _os_mut_delete(mutex);
RUBENTEC 0:b82abca089ac 105 }
RUBENTEC 0:b82abca089ac 106
RUBENTEC 0:b82abca089ac 107 #pragma swi_number=0
RUBENTEC 0:b82abca089ac 108 __swi OS_RESULT _os_mut_release (OS_ID mutex);
RUBENTEC 0:b82abca089ac 109
RUBENTEC 0:b82abca089ac 110 static inline OS_RESULT os_mut_release(OS_ID mutex)
RUBENTEC 0:b82abca089ac 111 {
RUBENTEC 0:b82abca089ac 112 __asm("mov r12,%0\n" :: "r"(&rt_mut_release) : "r12" );
RUBENTEC 0:b82abca089ac 113 return _os_mut_release(mutex);
RUBENTEC 0:b82abca089ac 114 }
RUBENTEC 0:b82abca089ac 115
RUBENTEC 0:b82abca089ac 116 #pragma swi_number=0
RUBENTEC 0:b82abca089ac 117 __swi OS_RESULT _os_mut_wait (OS_ID mutex, uint16_t timeout);
RUBENTEC 0:b82abca089ac 118
RUBENTEC 0:b82abca089ac 119 static inline OS_RESULT os_mut_wait(OS_ID mutex, uint16_t timeout)
RUBENTEC 0:b82abca089ac 120 {
RUBENTEC 0:b82abca089ac 121 __asm("mov r12,%0\n" :: "r"(&rt_mut_wait) : "r12" );
RUBENTEC 0:b82abca089ac 122 return _os_mut_wait(mutex, timeout);
RUBENTEC 0:b82abca089ac 123 }
RUBENTEC 0:b82abca089ac 124
RUBENTEC 0:b82abca089ac 125 #include <yvals.h> /* for include DLib_Thread.h */
RUBENTEC 0:b82abca089ac 126
RUBENTEC 0:b82abca089ac 127 void __iar_system_Mtxinit(__iar_Rmtx *);
RUBENTEC 0:b82abca089ac 128 void __iar_system_Mtxdst(__iar_Rmtx *);
RUBENTEC 0:b82abca089ac 129 void __iar_system_Mtxlock(__iar_Rmtx *);
RUBENTEC 0:b82abca089ac 130 void __iar_system_Mtxunlock(__iar_Rmtx *);
RUBENTEC 0:b82abca089ac 131
RUBENTEC 0:b82abca089ac 132
RUBENTEC 0:b82abca089ac 133
RUBENTEC 0:b82abca089ac 134
RUBENTEC 0:b82abca089ac 135 #endif
RUBENTEC 0:b82abca089ac 136
RUBENTEC 0:b82abca089ac 137
RUBENTEC 0:b82abca089ac 138 /*----------------------------------------------------------------------------
RUBENTEC 0:b82abca089ac 139 * Global Variables
RUBENTEC 0:b82abca089ac 140 *---------------------------------------------------------------------------*/
RUBENTEC 0:b82abca089ac 141
RUBENTEC 0:b82abca089ac 142 #if (OS_TIMERS != 0)
RUBENTEC 0:b82abca089ac 143 #define OS_TASK_CNT (OS_TASKCNT + 1)
RUBENTEC 0:b82abca089ac 144 #ifndef __MBED_CMSIS_RTOS_CA9
RUBENTEC 0:b82abca089ac 145 #define OS_PRIV_CNT (OS_PRIVCNT + 2)
RUBENTEC 0:b82abca089ac 146 #define OS_STACK_SZ (4*(OS_PRIVSTKSIZE+OS_MAINSTKSIZE+OS_TIMERSTKSZ))
RUBENTEC 0:b82abca089ac 147 #endif
RUBENTEC 0:b82abca089ac 148 #else
RUBENTEC 0:b82abca089ac 149 #define OS_TASK_CNT OS_TASKCNT
RUBENTEC 0:b82abca089ac 150 #ifndef __MBED_CMSIS_RTOS_CA9
RUBENTEC 0:b82abca089ac 151 #define OS_PRIV_CNT (OS_PRIVCNT + 1)
RUBENTEC 0:b82abca089ac 152 #define OS_STACK_SZ (4*(OS_PRIVSTKSIZE+OS_MAINSTKSIZE))
RUBENTEC 0:b82abca089ac 153 #endif
RUBENTEC 0:b82abca089ac 154 #endif
RUBENTEC 0:b82abca089ac 155
RUBENTEC 0:b82abca089ac 156 uint16_t const os_maxtaskrun = OS_TASK_CNT;
RUBENTEC 0:b82abca089ac 157 #ifdef __MBED_CMSIS_RTOS_CA9
RUBENTEC 0:b82abca089ac 158 uint32_t const os_stackinfo = (OS_STKCHECK<<24)| (OS_IDLESTKSIZE*4);
RUBENTEC 0:b82abca089ac 159 #else
RUBENTEC 0:b82abca089ac 160 uint32_t const os_stackinfo = (OS_STKCHECK<<24)| (OS_PRIV_CNT<<16) | (OS_STKSIZE*4);
RUBENTEC 0:b82abca089ac 161 #endif
RUBENTEC 0:b82abca089ac 162 uint32_t const os_rrobin = (OS_ROBIN << 16) | OS_ROBINTOUT;
RUBENTEC 0:b82abca089ac 163 uint32_t const os_tickfreq = OS_CLOCK;
RUBENTEC 0:b82abca089ac 164 uint16_t const os_tickus_i = OS_CLOCK/1000000;
RUBENTEC 0:b82abca089ac 165 uint16_t const os_tickus_f = (((uint64_t)(OS_CLOCK-1000000*(OS_CLOCK/1000000)))<<16)/1000000;
RUBENTEC 0:b82abca089ac 166 uint32_t const os_trv = OS_TRV;
RUBENTEC 0:b82abca089ac 167 uint8_t const os_flags = OS_RUNPRIV;
RUBENTEC 0:b82abca089ac 168
RUBENTEC 0:b82abca089ac 169 /* Export following defines to uVision debugger. */
RUBENTEC 0:b82abca089ac 170 __USED uint32_t const CMSIS_RTOS_API_Version = osCMSIS;
RUBENTEC 0:b82abca089ac 171 __USED uint32_t const CMSIS_RTOS_RTX_Version = osCMSIS_RTX;
RUBENTEC 0:b82abca089ac 172 __USED uint32_t const os_clockrate = OS_TICK;
RUBENTEC 0:b82abca089ac 173 __USED uint32_t const os_timernum = 0;
RUBENTEC 0:b82abca089ac 174
RUBENTEC 0:b82abca089ac 175 /* Memory pool for TCB allocation */
RUBENTEC 0:b82abca089ac 176 _declare_box (mp_tcb, OS_TCB_SIZE, OS_TASK_CNT);
RUBENTEC 0:b82abca089ac 177 uint16_t const mp_tcb_size = sizeof(mp_tcb);
RUBENTEC 0:b82abca089ac 178
RUBENTEC 0:b82abca089ac 179 #ifdef __MBED_CMSIS_RTOS_CA9
RUBENTEC 0:b82abca089ac 180 /* Memory pool for os_idle_demon stack allocation. */
RUBENTEC 0:b82abca089ac 181 _declare_box8 (mp_stk, OS_IDLESTKSIZE*4, 1);
RUBENTEC 0:b82abca089ac 182 uint32_t const mp_stk_size = sizeof(mp_stk);
RUBENTEC 0:b82abca089ac 183 #else
RUBENTEC 0:b82abca089ac 184 /* Memory pool for System stack allocation (+os_idle_demon). */
RUBENTEC 0:b82abca089ac 185 _declare_box8 (mp_stk, OS_STKSIZE*4, OS_TASK_CNT-OS_PRIV_CNT+1);
RUBENTEC 0:b82abca089ac 186 uint32_t const mp_stk_size = sizeof(mp_stk);
RUBENTEC 0:b82abca089ac 187
RUBENTEC 0:b82abca089ac 188 /* Memory pool for user specified stack allocation (+main, +timer) */
RUBENTEC 0:b82abca089ac 189 uint64_t os_stack_mem[2+OS_PRIV_CNT+(OS_STACK_SZ/8)];
RUBENTEC 0:b82abca089ac 190 uint32_t const os_stack_sz = sizeof(os_stack_mem);
RUBENTEC 0:b82abca089ac 191 #endif
RUBENTEC 0:b82abca089ac 192
RUBENTEC 0:b82abca089ac 193 #ifndef OS_FIFOSZ
RUBENTEC 0:b82abca089ac 194 #define OS_FIFOSZ 16
RUBENTEC 0:b82abca089ac 195 #endif
RUBENTEC 0:b82abca089ac 196
RUBENTEC 0:b82abca089ac 197 /* Fifo Queue buffer for ISR requests.*/
RUBENTEC 0:b82abca089ac 198 uint32_t os_fifo[OS_FIFOSZ*2+1];
RUBENTEC 0:b82abca089ac 199 uint8_t const os_fifo_size = OS_FIFOSZ;
RUBENTEC 0:b82abca089ac 200
RUBENTEC 0:b82abca089ac 201 /* An array of Active task pointers. */
RUBENTEC 0:b82abca089ac 202 void *os_active_TCB[OS_TASK_CNT];
RUBENTEC 0:b82abca089ac 203
RUBENTEC 0:b82abca089ac 204 /* User Timers Resources */
RUBENTEC 0:b82abca089ac 205 #if (OS_TIMERS != 0)
RUBENTEC 0:b82abca089ac 206 extern void osTimerThread (void const *argument);
RUBENTEC 0:b82abca089ac 207 #ifdef __MBED_CMSIS_RTOS_CA9
RUBENTEC 0:b82abca089ac 208 osThreadDef(osTimerThread, (osPriority)(OS_TIMERPRIO-3), 4*OS_TIMERSTKSZ);
RUBENTEC 0:b82abca089ac 209 #else
RUBENTEC 0:b82abca089ac 210 osThreadDef(osTimerThread, (osPriority)(OS_TIMERPRIO-3), 1, 4*OS_TIMERSTKSZ);
RUBENTEC 0:b82abca089ac 211 #endif
RUBENTEC 0:b82abca089ac 212 osThreadId osThreadId_osTimerThread;
RUBENTEC 0:b82abca089ac 213 osMessageQDef(osTimerMessageQ, OS_TIMERCBQS, void *);
RUBENTEC 0:b82abca089ac 214 osMessageQId osMessageQId_osTimerMessageQ;
RUBENTEC 0:b82abca089ac 215 #else
RUBENTEC 0:b82abca089ac 216 osThreadDef_t os_thread_def_osTimerThread = { NULL };
RUBENTEC 0:b82abca089ac 217 osThreadId osThreadId_osTimerThread;
RUBENTEC 0:b82abca089ac 218 osMessageQDef(osTimerMessageQ, 0, void *);
RUBENTEC 0:b82abca089ac 219 osMessageQId osMessageQId_osTimerMessageQ;
RUBENTEC 0:b82abca089ac 220 #endif
RUBENTEC 0:b82abca089ac 221
RUBENTEC 0:b82abca089ac 222 /* Legacy RTX User Timers not used */
RUBENTEC 0:b82abca089ac 223 uint32_t os_tmr = 0;
RUBENTEC 0:b82abca089ac 224 uint32_t const *m_tmr = NULL;
RUBENTEC 0:b82abca089ac 225 uint16_t const mp_tmr_size = 0;
RUBENTEC 0:b82abca089ac 226
RUBENTEC 0:b82abca089ac 227 #if defined (__CC_ARM) && !defined (__MICROLIB)
RUBENTEC 0:b82abca089ac 228 /* A memory space for arm standard library. */
RUBENTEC 0:b82abca089ac 229 static uint32_t std_libspace[OS_TASK_CNT][96/4];
RUBENTEC 0:b82abca089ac 230 static OS_MUT std_libmutex[OS_MUTEXCNT];
RUBENTEC 0:b82abca089ac 231 static uint32_t nr_mutex;
RUBENTEC 0:b82abca089ac 232 extern void *__libspace_start;
RUBENTEC 0:b82abca089ac 233 #elif defined (__ICCARM__)
RUBENTEC 0:b82abca089ac 234 typedef struct os_mut_array {
RUBENTEC 0:b82abca089ac 235 OS_MUT mutex;
RUBENTEC 0:b82abca089ac 236 uint32_t used;
RUBENTEC 0:b82abca089ac 237 } os_mut_array_t;
RUBENTEC 0:b82abca089ac 238
RUBENTEC 0:b82abca089ac 239 static os_mut_array_t std_libmutex[OS_MUTEXCNT];/* must be Zero clear */
RUBENTEC 0:b82abca089ac 240 static uint32_t nr_mutex = 0;
RUBENTEC 0:b82abca089ac 241 #endif
RUBENTEC 0:b82abca089ac 242
RUBENTEC 0:b82abca089ac 243
RUBENTEC 0:b82abca089ac 244 /*----------------------------------------------------------------------------
RUBENTEC 0:b82abca089ac 245 * RTX Optimizations (empty functions)
RUBENTEC 0:b82abca089ac 246 *---------------------------------------------------------------------------*/
RUBENTEC 0:b82abca089ac 247
RUBENTEC 0:b82abca089ac 248 #if OS_ROBIN == 0
RUBENTEC 0:b82abca089ac 249 void rt_init_robin (void) {;}
RUBENTEC 0:b82abca089ac 250 void rt_chk_robin (void) {;}
RUBENTEC 0:b82abca089ac 251 #endif
RUBENTEC 0:b82abca089ac 252
RUBENTEC 0:b82abca089ac 253 #if OS_STKCHECK == 0
RUBENTEC 0:b82abca089ac 254 void rt_stk_check (void) {;}
RUBENTEC 0:b82abca089ac 255 #endif
RUBENTEC 0:b82abca089ac 256
RUBENTEC 0:b82abca089ac 257
RUBENTEC 0:b82abca089ac 258 /*----------------------------------------------------------------------------
RUBENTEC 0:b82abca089ac 259 * Standard Library multithreading interface
RUBENTEC 0:b82abca089ac 260 *---------------------------------------------------------------------------*/
RUBENTEC 0:b82abca089ac 261
RUBENTEC 0:b82abca089ac 262 #if defined (__CC_ARM) && !defined (__MICROLIB)
RUBENTEC 0:b82abca089ac 263
RUBENTEC 0:b82abca089ac 264 /*--------------------------- __user_perthread_libspace ---------------------*/
RUBENTEC 0:b82abca089ac 265
RUBENTEC 0:b82abca089ac 266 void *__user_perthread_libspace (void) {
RUBENTEC 0:b82abca089ac 267 /* Provide a separate libspace for each task. */
RUBENTEC 0:b82abca089ac 268 uint32_t idx;
RUBENTEC 0:b82abca089ac 269
RUBENTEC 0:b82abca089ac 270 idx = runtask_id ();
RUBENTEC 0:b82abca089ac 271 if (idx == 0) {
RUBENTEC 0:b82abca089ac 272 /* RTX not running yet. */
RUBENTEC 0:b82abca089ac 273 return (&__libspace_start);
RUBENTEC 0:b82abca089ac 274 }
RUBENTEC 0:b82abca089ac 275 return ((void *)&std_libspace[idx-1]);
RUBENTEC 0:b82abca089ac 276 }
RUBENTEC 0:b82abca089ac 277
RUBENTEC 0:b82abca089ac 278 /*--------------------------- _mutex_initialize -----------------------------*/
RUBENTEC 0:b82abca089ac 279
RUBENTEC 0:b82abca089ac 280 int _mutex_initialize (OS_ID *mutex) {
RUBENTEC 0:b82abca089ac 281 /* Allocate and initialize a system mutex. */
RUBENTEC 0:b82abca089ac 282
RUBENTEC 0:b82abca089ac 283 if (nr_mutex >= OS_MUTEXCNT) {
RUBENTEC 0:b82abca089ac 284 /* If you are here, you need to increase the number OS_MUTEXCNT. */
RUBENTEC 0:b82abca089ac 285 for (;;);
RUBENTEC 0:b82abca089ac 286 }
RUBENTEC 0:b82abca089ac 287 *mutex = &std_libmutex[nr_mutex++];
RUBENTEC 0:b82abca089ac 288 mutex_init (*mutex);
RUBENTEC 0:b82abca089ac 289 return (1);
RUBENTEC 0:b82abca089ac 290 }
RUBENTEC 0:b82abca089ac 291
RUBENTEC 0:b82abca089ac 292
RUBENTEC 0:b82abca089ac 293 /*--------------------------- _mutex_acquire --------------------------------*/
RUBENTEC 0:b82abca089ac 294
RUBENTEC 0:b82abca089ac 295 __attribute__((used)) void _mutex_acquire (OS_ID *mutex) {
RUBENTEC 0:b82abca089ac 296 /* Acquire a system mutex, lock stdlib resources. */
RUBENTEC 0:b82abca089ac 297 if (runtask_id ()) {
RUBENTEC 0:b82abca089ac 298 /* RTX running, acquire a mutex. */
RUBENTEC 0:b82abca089ac 299 mutex_wait (*mutex);
RUBENTEC 0:b82abca089ac 300 }
RUBENTEC 0:b82abca089ac 301 }
RUBENTEC 0:b82abca089ac 302
RUBENTEC 0:b82abca089ac 303
RUBENTEC 0:b82abca089ac 304 /*--------------------------- _mutex_release --------------------------------*/
RUBENTEC 0:b82abca089ac 305
RUBENTEC 0:b82abca089ac 306 __attribute__((used)) void _mutex_release (OS_ID *mutex) {
RUBENTEC 0:b82abca089ac 307 /* Release a system mutex, unlock stdlib resources. */
RUBENTEC 0:b82abca089ac 308 if (runtask_id ()) {
RUBENTEC 0:b82abca089ac 309 /* RTX running, release a mutex. */
RUBENTEC 0:b82abca089ac 310 mutex_rel (*mutex);
RUBENTEC 0:b82abca089ac 311 }
RUBENTEC 0:b82abca089ac 312 }
RUBENTEC 0:b82abca089ac 313
RUBENTEC 0:b82abca089ac 314 #elif defined (__ICCARM__)
RUBENTEC 0:b82abca089ac 315
RUBENTEC 0:b82abca089ac 316 /*--------------------------- __iar_system_Mtxinit --------------------------*/
RUBENTEC 0:b82abca089ac 317
RUBENTEC 0:b82abca089ac 318 void __iar_system_Mtxinit(__iar_Rmtx *mutex)
RUBENTEC 0:b82abca089ac 319 {
RUBENTEC 0:b82abca089ac 320 /* Allocate and initialize a system mutex. */
RUBENTEC 0:b82abca089ac 321 int32_t idx;
RUBENTEC 0:b82abca089ac 322
RUBENTEC 0:b82abca089ac 323 for (idx = 0; idx < OS_MUTEXCNT; idx++)
RUBENTEC 0:b82abca089ac 324 {
RUBENTEC 0:b82abca089ac 325 if (std_libmutex[idx].used == 0)
RUBENTEC 0:b82abca089ac 326 {
RUBENTEC 0:b82abca089ac 327 std_libmutex[idx].used = 1;
RUBENTEC 0:b82abca089ac 328 *mutex = &std_libmutex[idx].mutex;
RUBENTEC 0:b82abca089ac 329 nr_mutex++;
RUBENTEC 0:b82abca089ac 330 break;
RUBENTEC 0:b82abca089ac 331 }
RUBENTEC 0:b82abca089ac 332 }
RUBENTEC 0:b82abca089ac 333 if (nr_mutex >= OS_MUTEXCNT)
RUBENTEC 0:b82abca089ac 334 {
RUBENTEC 0:b82abca089ac 335 /* If you are here, you need to increase the number OS_MUTEXCNT. */
RUBENTEC 0:b82abca089ac 336 for (;;);
RUBENTEC 0:b82abca089ac 337 }
RUBENTEC 0:b82abca089ac 338
RUBENTEC 0:b82abca089ac 339 mutex_init (*mutex);
RUBENTEC 0:b82abca089ac 340 }
RUBENTEC 0:b82abca089ac 341
RUBENTEC 0:b82abca089ac 342 /*--------------------------- __iar_system_Mtxdst ---------------------------*/
RUBENTEC 0:b82abca089ac 343
RUBENTEC 0:b82abca089ac 344 void __iar_system_Mtxdst(__iar_Rmtx *mutex)
RUBENTEC 0:b82abca089ac 345 {
RUBENTEC 0:b82abca089ac 346 /* Free a system mutex. */
RUBENTEC 0:b82abca089ac 347 int32_t idx;
RUBENTEC 0:b82abca089ac 348
RUBENTEC 0:b82abca089ac 349 if (nr_mutex == 0)
RUBENTEC 0:b82abca089ac 350 {
RUBENTEC 0:b82abca089ac 351 for (;;);
RUBENTEC 0:b82abca089ac 352 }
RUBENTEC 0:b82abca089ac 353
RUBENTEC 0:b82abca089ac 354 idx = ((((uint32_t)mutex) - ((uint32_t)&std_libmutex[0].mutex))
RUBENTEC 0:b82abca089ac 355 / sizeof(os_mut_array_t));
RUBENTEC 0:b82abca089ac 356
RUBENTEC 0:b82abca089ac 357 if (idx >= OS_MUTEXCNT)
RUBENTEC 0:b82abca089ac 358 {
RUBENTEC 0:b82abca089ac 359 for (;;);
RUBENTEC 0:b82abca089ac 360 }
RUBENTEC 0:b82abca089ac 361
RUBENTEC 0:b82abca089ac 362 mutex_del (*mutex);
RUBENTEC 0:b82abca089ac 363 std_libmutex[idx].used = 0;
RUBENTEC 0:b82abca089ac 364 }
RUBENTEC 0:b82abca089ac 365
RUBENTEC 0:b82abca089ac 366 /*--------------------------- __iar_system_Mtxlock --------------------------*/
RUBENTEC 0:b82abca089ac 367
RUBENTEC 0:b82abca089ac 368 void __iar_system_Mtxlock(__iar_Rmtx *mutex)
RUBENTEC 0:b82abca089ac 369 {
RUBENTEC 0:b82abca089ac 370 /* Acquire a system mutex, lock stdlib resources. */
RUBENTEC 0:b82abca089ac 371 if (runtask_id ())
RUBENTEC 0:b82abca089ac 372 {
RUBENTEC 0:b82abca089ac 373 /* RTX running, acquire a mutex. */
RUBENTEC 0:b82abca089ac 374 mutex_wait (*mutex);
RUBENTEC 0:b82abca089ac 375 }
RUBENTEC 0:b82abca089ac 376 }
RUBENTEC 0:b82abca089ac 377
RUBENTEC 0:b82abca089ac 378 /*--------------------------- __iar_system_Mtxunlock ------------------------*/
RUBENTEC 0:b82abca089ac 379
RUBENTEC 0:b82abca089ac 380 void __iar_system_Mtxunlock(__iar_Rmtx *mutex)
RUBENTEC 0:b82abca089ac 381 {
RUBENTEC 0:b82abca089ac 382 /* Release a system mutex, unlock stdlib resources. */
RUBENTEC 0:b82abca089ac 383 if (runtask_id ())
RUBENTEC 0:b82abca089ac 384 {
RUBENTEC 0:b82abca089ac 385 /* RTX running, release a mutex. */
RUBENTEC 0:b82abca089ac 386 mutex_rel (*mutex);
RUBENTEC 0:b82abca089ac 387 }
RUBENTEC 0:b82abca089ac 388 }
RUBENTEC 0:b82abca089ac 389
RUBENTEC 0:b82abca089ac 390 #endif
RUBENTEC 0:b82abca089ac 391
RUBENTEC 0:b82abca089ac 392
RUBENTEC 0:b82abca089ac 393 /*----------------------------------------------------------------------------
RUBENTEC 0:b82abca089ac 394 * RTX Startup
RUBENTEC 0:b82abca089ac 395 *---------------------------------------------------------------------------*/
RUBENTEC 0:b82abca089ac 396
RUBENTEC 0:b82abca089ac 397 /* Main Thread definition */
RUBENTEC 0:b82abca089ac 398 extern int main (void);
RUBENTEC 0:b82abca089ac 399 #ifdef __MBED_CMSIS_RTOS_CA9
RUBENTEC 0:b82abca089ac 400 uint32_t os_thread_def_stack_main [(4 * OS_MAINSTKSIZE) / sizeof(uint32_t)];
RUBENTEC 0:b82abca089ac 401 osThreadDef_t os_thread_def_main = {(os_pthread)main, osPriorityNormal, 1, 4*OS_MAINSTKSIZE, os_thread_def_stack_main };
RUBENTEC 0:b82abca089ac 402 #else
RUBENTEC 0:b82abca089ac 403 osThreadDef_t os_thread_def_main = {(os_pthread)main, osPriorityNormal, 1, 4*OS_MAINSTKSIZE };
RUBENTEC 0:b82abca089ac 404 #endif
RUBENTEC 0:b82abca089ac 405
RUBENTEC 0:b82abca089ac 406 #if defined (__CC_ARM)
RUBENTEC 0:b82abca089ac 407
RUBENTEC 0:b82abca089ac 408 #ifdef __MICROLIB
RUBENTEC 0:b82abca089ac 409 void _main_init (void) __attribute__((section(".ARM.Collect$$$$000000FF")));
RUBENTEC 0:b82abca089ac 410 #if __TARGET_ARCH_ARM
RUBENTEC 0:b82abca089ac 411 #pragma push
RUBENTEC 0:b82abca089ac 412 #pragma arm
RUBENTEC 0:b82abca089ac 413 #endif
RUBENTEC 0:b82abca089ac 414 void _main_init (void) {
RUBENTEC 0:b82abca089ac 415 osKernelInitialize();
RUBENTEC 0:b82abca089ac 416 osThreadCreate(&os_thread_def_main, NULL);
RUBENTEC 0:b82abca089ac 417 osKernelStart();
RUBENTEC 0:b82abca089ac 418 for (;;);
RUBENTEC 0:b82abca089ac 419 }
RUBENTEC 0:b82abca089ac 420 #if __TARGET_ARCH_ARM
RUBENTEC 0:b82abca089ac 421 #pragma pop
RUBENTEC 0:b82abca089ac 422 #endif
RUBENTEC 0:b82abca089ac 423 #else
RUBENTEC 0:b82abca089ac 424 __asm void __rt_entry (void) {
RUBENTEC 0:b82abca089ac 425
RUBENTEC 0:b82abca089ac 426 IMPORT __user_setup_stackheap
RUBENTEC 0:b82abca089ac 427 IMPORT __rt_lib_init
RUBENTEC 0:b82abca089ac 428 IMPORT os_thread_def_main
RUBENTEC 0:b82abca089ac 429 IMPORT osKernelInitialize
RUBENTEC 0:b82abca089ac 430 IMPORT osKernelStart
RUBENTEC 0:b82abca089ac 431 IMPORT osThreadCreate
RUBENTEC 0:b82abca089ac 432 IMPORT exit
RUBENTEC 0:b82abca089ac 433
RUBENTEC 0:b82abca089ac 434 BL __user_setup_stackheap
RUBENTEC 0:b82abca089ac 435 MOV R1,R2
RUBENTEC 0:b82abca089ac 436 BL __rt_lib_init
RUBENTEC 0:b82abca089ac 437 BL osKernelInitialize
RUBENTEC 0:b82abca089ac 438 LDR R0,=os_thread_def_main
RUBENTEC 0:b82abca089ac 439 MOVS R1,#0
RUBENTEC 0:b82abca089ac 440 BL osThreadCreate
RUBENTEC 0:b82abca089ac 441 BL osKernelStart
RUBENTEC 0:b82abca089ac 442 BL exit
RUBENTEC 0:b82abca089ac 443
RUBENTEC 0:b82abca089ac 444 ALIGN
RUBENTEC 0:b82abca089ac 445 }
RUBENTEC 0:b82abca089ac 446 #endif
RUBENTEC 0:b82abca089ac 447
RUBENTEC 0:b82abca089ac 448 #elif defined (__GNUC__)
RUBENTEC 0:b82abca089ac 449
RUBENTEC 0:b82abca089ac 450 #ifdef __CS3__
RUBENTEC 0:b82abca089ac 451
RUBENTEC 0:b82abca089ac 452 /* CS3 start_c routine.
RUBENTEC 0:b82abca089ac 453 *
RUBENTEC 0:b82abca089ac 454 * Copyright (c) 2006, 2007 CodeSourcery Inc
RUBENTEC 0:b82abca089ac 455 *
RUBENTEC 0:b82abca089ac 456 * The authors hereby grant permission to use, copy, modify, distribute,
RUBENTEC 0:b82abca089ac 457 * and license this software and its documentation for any purpose, provided
RUBENTEC 0:b82abca089ac 458 * that existing copyright notices are retained in all copies and that this
RUBENTEC 0:b82abca089ac 459 * notice is included verbatim in any distributions. No written agreement,
RUBENTEC 0:b82abca089ac 460 * license, or royalty fee is required for any of the authorized uses.
RUBENTEC 0:b82abca089ac 461 * Modifications to this software may be copyrighted by their authors
RUBENTEC 0:b82abca089ac 462 * and need not follow the licensing terms described here, provided that
RUBENTEC 0:b82abca089ac 463 * the new terms are clearly indicated on the first page of each file where
RUBENTEC 0:b82abca089ac 464 * they apply.
RUBENTEC 0:b82abca089ac 465 */
RUBENTEC 0:b82abca089ac 466
RUBENTEC 0:b82abca089ac 467 #include "cs3.h"
RUBENTEC 0:b82abca089ac 468
RUBENTEC 0:b82abca089ac 469 extern void __libc_init_array (void);
RUBENTEC 0:b82abca089ac 470
RUBENTEC 0:b82abca089ac 471 __attribute ((noreturn)) void __cs3_start_c (void){
RUBENTEC 0:b82abca089ac 472 unsigned regions = __cs3_region_num;
RUBENTEC 0:b82abca089ac 473 const struct __cs3_region *rptr = __cs3_regions;
RUBENTEC 0:b82abca089ac 474
RUBENTEC 0:b82abca089ac 475 /* Initialize memory */
RUBENTEC 0:b82abca089ac 476 for (regions = __cs3_region_num, rptr = __cs3_regions; regions--; rptr++) {
RUBENTEC 0:b82abca089ac 477 long long *src = (long long *)rptr->init;
RUBENTEC 0:b82abca089ac 478 long long *dst = (long long *)rptr->data;
RUBENTEC 0:b82abca089ac 479 unsigned limit = rptr->init_size;
RUBENTEC 0:b82abca089ac 480 unsigned count;
RUBENTEC 0:b82abca089ac 481
RUBENTEC 0:b82abca089ac 482 if (src != dst)
RUBENTEC 0:b82abca089ac 483 for (count = 0; count != limit; count += sizeof (long long))
RUBENTEC 0:b82abca089ac 484 *dst++ = *src++;
RUBENTEC 0:b82abca089ac 485 else
RUBENTEC 0:b82abca089ac 486 dst = (long long *)((char *)dst + limit);
RUBENTEC 0:b82abca089ac 487 limit = rptr->zero_size;
RUBENTEC 0:b82abca089ac 488 for (count = 0; count != limit; count += sizeof (long long))
RUBENTEC 0:b82abca089ac 489 *dst++ = 0;
RUBENTEC 0:b82abca089ac 490 }
RUBENTEC 0:b82abca089ac 491
RUBENTEC 0:b82abca089ac 492 /* Run initializers. */
RUBENTEC 0:b82abca089ac 493 __libc_init_array ();
RUBENTEC 0:b82abca089ac 494
RUBENTEC 0:b82abca089ac 495 osKernelInitialize();
RUBENTEC 0:b82abca089ac 496 osThreadCreate(&os_thread_def_main, NULL);
RUBENTEC 0:b82abca089ac 497 osKernelStart();
RUBENTEC 0:b82abca089ac 498 for (;;);
RUBENTEC 0:b82abca089ac 499 }
RUBENTEC 0:b82abca089ac 500
RUBENTEC 0:b82abca089ac 501 #else
RUBENTEC 0:b82abca089ac 502
RUBENTEC 0:b82abca089ac 503 __attribute__((naked)) void software_init_hook (void) {
RUBENTEC 0:b82abca089ac 504 __asm (
RUBENTEC 0:b82abca089ac 505 ".syntax unified\n"
RUBENTEC 0:b82abca089ac 506 ".arm\n"
RUBENTEC 0:b82abca089ac 507 "movs r0,#0\n"
RUBENTEC 0:b82abca089ac 508 "movs r1,#0\n"
RUBENTEC 0:b82abca089ac 509 "mov r4,r0\n"
RUBENTEC 0:b82abca089ac 510 "mov r5,r1\n"
RUBENTEC 0:b82abca089ac 511 "ldr r0,= __libc_fini_array\n"
RUBENTEC 0:b82abca089ac 512 "bl atexit\n"
RUBENTEC 0:b82abca089ac 513 "bl __libc_init_array\n"
RUBENTEC 0:b82abca089ac 514 "mov r0,r4\n"
RUBENTEC 0:b82abca089ac 515 "mov r1,r5\n"
RUBENTEC 0:b82abca089ac 516 "bl osKernelInitialize\n"
RUBENTEC 0:b82abca089ac 517 "ldr r0,=os_thread_def_main\n"
RUBENTEC 0:b82abca089ac 518 "movs r1,#0\n"
RUBENTEC 0:b82abca089ac 519 "bl osThreadCreate\n"
RUBENTEC 0:b82abca089ac 520 "bl osKernelStart\n"
RUBENTEC 0:b82abca089ac 521 "bl exit\n"
RUBENTEC 0:b82abca089ac 522 );
RUBENTEC 0:b82abca089ac 523 }
RUBENTEC 0:b82abca089ac 524
RUBENTEC 0:b82abca089ac 525 #endif
RUBENTEC 0:b82abca089ac 526
RUBENTEC 0:b82abca089ac 527 #elif defined (__ICCARM__)
RUBENTEC 0:b82abca089ac 528
RUBENTEC 0:b82abca089ac 529 extern void exit(int arg);
RUBENTEC 0:b82abca089ac 530
RUBENTEC 0:b82abca089ac 531 void mbed_main(void) {
RUBENTEC 0:b82abca089ac 532 int a;
RUBENTEC 0:b82abca089ac 533
RUBENTEC 0:b82abca089ac 534 osKernelInitialize();
RUBENTEC 0:b82abca089ac 535 osThreadCreate(&os_thread_def_main, NULL);
RUBENTEC 0:b82abca089ac 536 a = osKernelStart();
RUBENTEC 0:b82abca089ac 537 exit(a);
RUBENTEC 0:b82abca089ac 538 }
RUBENTEC 0:b82abca089ac 539
RUBENTEC 0:b82abca089ac 540 #endif
RUBENTEC 0:b82abca089ac 541
RUBENTEC 0:b82abca089ac 542
RUBENTEC 0:b82abca089ac 543 /*----------------------------------------------------------------------------
RUBENTEC 0:b82abca089ac 544 * end of file
RUBENTEC 0:b82abca089ac 545 *---------------------------------------------------------------------------*/
RUBENTEC 0:b82abca089ac 546