OS2

Dependents:   GYRO_MPU6050 Bluetooth_Powered_Multimeter_Using_STM32F429_and_RTOS fyp

Committer:
guilhemMBED
Date:
Mon Feb 03 13:41:14 2020 +0000
Revision:
0:a7c449cd2d5a
previous version;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
guilhemMBED 0:a7c449cd2d5a 1
guilhemMBED 0:a7c449cd2d5a 2 /** \addtogroup rtos */
guilhemMBED 0:a7c449cd2d5a 3 /** @{*/
guilhemMBED 0:a7c449cd2d5a 4 /*----------------------------------------------------------------------------
guilhemMBED 0:a7c449cd2d5a 5 * CMSIS-RTOS - RTX
guilhemMBED 0:a7c449cd2d5a 6 *----------------------------------------------------------------------------
guilhemMBED 0:a7c449cd2d5a 7 * Name: RTX_CM_LIB.H
guilhemMBED 0:a7c449cd2d5a 8 * Purpose: RTX Kernel System Configuration
guilhemMBED 0:a7c449cd2d5a 9 * Rev.: V4.79
guilhemMBED 0:a7c449cd2d5a 10 *----------------------------------------------------------------------------
guilhemMBED 0:a7c449cd2d5a 11 *
guilhemMBED 0:a7c449cd2d5a 12 * Copyright (c) 1999-2009 KEIL, 2009-2015 ARM Germany GmbH
guilhemMBED 0:a7c449cd2d5a 13 * All rights reserved.
guilhemMBED 0:a7c449cd2d5a 14 * Redistribution and use in source and binary forms, with or without
guilhemMBED 0:a7c449cd2d5a 15 * modification, are permitted provided that the following conditions are met:
guilhemMBED 0:a7c449cd2d5a 16 * - Redistributions of source code must retain the above copyright
guilhemMBED 0:a7c449cd2d5a 17 * notice, this list of conditions and the following disclaimer.
guilhemMBED 0:a7c449cd2d5a 18 * - Redistributions in binary form must reproduce the above copyright
guilhemMBED 0:a7c449cd2d5a 19 * notice, this list of conditions and the following disclaimer in the
guilhemMBED 0:a7c449cd2d5a 20 * documentation and/or other materials provided with the distribution.
guilhemMBED 0:a7c449cd2d5a 21 * - Neither the name of ARM nor the names of its contributors may be used
guilhemMBED 0:a7c449cd2d5a 22 * to endorse or promote products derived from this software without
guilhemMBED 0:a7c449cd2d5a 23 * specific prior written permission.
guilhemMBED 0:a7c449cd2d5a 24 *
guilhemMBED 0:a7c449cd2d5a 25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
guilhemMBED 0:a7c449cd2d5a 26 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
guilhemMBED 0:a7c449cd2d5a 27 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
guilhemMBED 0:a7c449cd2d5a 28 * ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
guilhemMBED 0:a7c449cd2d5a 29 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
guilhemMBED 0:a7c449cd2d5a 30 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
guilhemMBED 0:a7c449cd2d5a 31 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
guilhemMBED 0:a7c449cd2d5a 32 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
guilhemMBED 0:a7c449cd2d5a 33 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
guilhemMBED 0:a7c449cd2d5a 34 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
guilhemMBED 0:a7c449cd2d5a 35 * POSSIBILITY OF SUCH DAMAGE.
guilhemMBED 0:a7c449cd2d5a 36 *---------------------------------------------------------------------------*/
guilhemMBED 0:a7c449cd2d5a 37 #include "mbed_error.h"
guilhemMBED 0:a7c449cd2d5a 38
guilhemMBED 0:a7c449cd2d5a 39 #if defined (__CC_ARM)
guilhemMBED 0:a7c449cd2d5a 40 #include <rt_misc.h>
guilhemMBED 0:a7c449cd2d5a 41 #pragma O3
guilhemMBED 0:a7c449cd2d5a 42 #define __USED __attribute__((used))
guilhemMBED 0:a7c449cd2d5a 43 #elif defined (__GNUC__)
guilhemMBED 0:a7c449cd2d5a 44 #pragma GCC optimize ("O3")
guilhemMBED 0:a7c449cd2d5a 45 #define __USED __attribute__((used))
guilhemMBED 0:a7c449cd2d5a 46 #elif defined (__ICCARM__)
guilhemMBED 0:a7c449cd2d5a 47 #define __USED __root
guilhemMBED 0:a7c449cd2d5a 48 #endif
guilhemMBED 0:a7c449cd2d5a 49
guilhemMBED 0:a7c449cd2d5a 50
guilhemMBED 0:a7c449cd2d5a 51 /*----------------------------------------------------------------------------
guilhemMBED 0:a7c449cd2d5a 52 * Definitions
guilhemMBED 0:a7c449cd2d5a 53 *---------------------------------------------------------------------------*/
guilhemMBED 0:a7c449cd2d5a 54
guilhemMBED 0:a7c449cd2d5a 55 #define _declare_box(pool,size,cnt) uint32_t pool[(((size)+3)/4)*(cnt) + 3]
guilhemMBED 0:a7c449cd2d5a 56 #define _declare_box8(pool,size,cnt) uint64_t pool[(((size)+7)/8)*(cnt) + 2]
guilhemMBED 0:a7c449cd2d5a 57
guilhemMBED 0:a7c449cd2d5a 58 #define OS_TCB_SIZE 64
guilhemMBED 0:a7c449cd2d5a 59 #define OS_TMR_SIZE 8
guilhemMBED 0:a7c449cd2d5a 60
guilhemMBED 0:a7c449cd2d5a 61 typedef void *OS_ID;
guilhemMBED 0:a7c449cd2d5a 62 typedef uint32_t OS_TID;
guilhemMBED 0:a7c449cd2d5a 63 typedef uint32_t OS_MUT[4];
guilhemMBED 0:a7c449cd2d5a 64 typedef uint32_t OS_RESULT;
guilhemMBED 0:a7c449cd2d5a 65
guilhemMBED 0:a7c449cd2d5a 66 #if defined (__CC_ARM) && !defined (__MICROLIB)
guilhemMBED 0:a7c449cd2d5a 67
guilhemMBED 0:a7c449cd2d5a 68 #define runtask_id() rt_tsk_self()
guilhemMBED 0:a7c449cd2d5a 69 #define mutex_init(m) rt_mut_init(m)
guilhemMBED 0:a7c449cd2d5a 70 #define mutex_wait(m) os_mut_wait(m,0xFFFFU)
guilhemMBED 0:a7c449cd2d5a 71 #define mutex_rel(m) os_mut_release(m)
guilhemMBED 0:a7c449cd2d5a 72
guilhemMBED 0:a7c449cd2d5a 73 extern uint8_t os_running;
guilhemMBED 0:a7c449cd2d5a 74 extern OS_TID rt_tsk_self (void);
guilhemMBED 0:a7c449cd2d5a 75 extern void rt_mut_init (OS_ID mutex);
guilhemMBED 0:a7c449cd2d5a 76 extern OS_RESULT rt_mut_release (OS_ID mutex);
guilhemMBED 0:a7c449cd2d5a 77 extern OS_RESULT rt_mut_wait (OS_ID mutex, uint16_t timeout);
guilhemMBED 0:a7c449cd2d5a 78
guilhemMBED 0:a7c449cd2d5a 79 #define os_mut_wait(mutex,timeout) _os_mut_wait((uint32_t)rt_mut_wait,mutex,timeout)
guilhemMBED 0:a7c449cd2d5a 80 #define os_mut_release(mutex) _os_mut_release((uint32_t)rt_mut_release,mutex)
guilhemMBED 0:a7c449cd2d5a 81
guilhemMBED 0:a7c449cd2d5a 82 OS_RESULT _os_mut_release (uint32_t p, OS_ID mutex) __svc_indirect(0);
guilhemMBED 0:a7c449cd2d5a 83 OS_RESULT _os_mut_wait (uint32_t p, OS_ID mutex, uint16_t timeout) __svc_indirect(0);
guilhemMBED 0:a7c449cd2d5a 84
guilhemMBED 0:a7c449cd2d5a 85 #endif
guilhemMBED 0:a7c449cd2d5a 86
guilhemMBED 0:a7c449cd2d5a 87
guilhemMBED 0:a7c449cd2d5a 88 /*----------------------------------------------------------------------------
guilhemMBED 0:a7c449cd2d5a 89 * Global Variables
guilhemMBED 0:a7c449cd2d5a 90 *---------------------------------------------------------------------------*/
guilhemMBED 0:a7c449cd2d5a 91
guilhemMBED 0:a7c449cd2d5a 92 #if (OS_TASKCNT == 0)
guilhemMBED 0:a7c449cd2d5a 93 #error "Invalid number of concurrent running threads!"
guilhemMBED 0:a7c449cd2d5a 94 #endif
guilhemMBED 0:a7c449cd2d5a 95
guilhemMBED 0:a7c449cd2d5a 96 #if (OS_PRIVCNT >= OS_TASKCNT)
guilhemMBED 0:a7c449cd2d5a 97 #error "Too many threads with user-provided stack size!"
guilhemMBED 0:a7c449cd2d5a 98 #endif
guilhemMBED 0:a7c449cd2d5a 99
guilhemMBED 0:a7c449cd2d5a 100 #if (OS_TIMERS != 0)
guilhemMBED 0:a7c449cd2d5a 101 #define OS_TASK_CNT (OS_TASKCNT + 1)
guilhemMBED 0:a7c449cd2d5a 102 #ifndef __MBED_CMSIS_RTOS_CM
guilhemMBED 0:a7c449cd2d5a 103 #define OS_PRIV_CNT (OS_PRIVCNT + 2)
guilhemMBED 0:a7c449cd2d5a 104 #define OS_STACK_SZ (4*(OS_PRIVSTKSIZE+OS_MAINSTKSIZE+OS_TIMERSTKSZ))
guilhemMBED 0:a7c449cd2d5a 105 #endif
guilhemMBED 0:a7c449cd2d5a 106 #else
guilhemMBED 0:a7c449cd2d5a 107 #define OS_TASK_CNT OS_TASKCNT
guilhemMBED 0:a7c449cd2d5a 108 #ifndef __MBED_CMSIS_RTOS_CM
guilhemMBED 0:a7c449cd2d5a 109 #define OS_PRIV_CNT (OS_PRIVCNT + 1)
guilhemMBED 0:a7c449cd2d5a 110 #define OS_STACK_SZ (4*(OS_PRIVSTKSIZE+OS_MAINSTKSIZE))
guilhemMBED 0:a7c449cd2d5a 111 #endif
guilhemMBED 0:a7c449cd2d5a 112 #endif
guilhemMBED 0:a7c449cd2d5a 113
guilhemMBED 0:a7c449cd2d5a 114 #ifndef OS_STKINIT
guilhemMBED 0:a7c449cd2d5a 115 #define OS_STKINIT 0
guilhemMBED 0:a7c449cd2d5a 116 #endif
guilhemMBED 0:a7c449cd2d5a 117
guilhemMBED 0:a7c449cd2d5a 118 uint16_t const os_maxtaskrun = OS_TASK_CNT;
guilhemMBED 0:a7c449cd2d5a 119 #ifdef __MBED_CMSIS_RTOS_CM
guilhemMBED 0:a7c449cd2d5a 120 uint32_t const os_stackinfo = (OS_STKINIT<<28) | (OS_STKCHECK<<24) | (OS_IDLESTKSIZE*4);
guilhemMBED 0:a7c449cd2d5a 121 #else
guilhemMBED 0:a7c449cd2d5a 122 uint32_t const os_stackinfo = (OS_STKINIT<<28) | (OS_STKCHECK<<24) | (OS_PRIV_CNT<<16) | (OS_STKSIZE*4);
guilhemMBED 0:a7c449cd2d5a 123 #endif
guilhemMBED 0:a7c449cd2d5a 124 uint32_t const os_rrobin = (OS_ROBIN << 16) | OS_ROBINTOUT;
guilhemMBED 0:a7c449cd2d5a 125 uint32_t const os_tickfreq = OS_CLOCK;
guilhemMBED 0:a7c449cd2d5a 126 uint16_t const os_tickus_i = OS_CLOCK/1000000;
guilhemMBED 0:a7c449cd2d5a 127 uint16_t const os_tickus_f = (((uint64_t)(OS_CLOCK-1000000*(OS_CLOCK/1000000)))<<16)/1000000;
guilhemMBED 0:a7c449cd2d5a 128 uint32_t const os_trv = OS_TRV;
guilhemMBED 0:a7c449cd2d5a 129 #if defined(FEATURE_UVISOR) && defined(TARGET_UVISOR_SUPPORTED)
guilhemMBED 0:a7c449cd2d5a 130 uint8_t const os_flags = 0;
guilhemMBED 0:a7c449cd2d5a 131 #else /* defined(FEATURE_UVISOR) && defined(TARGET_UVISOR_SUPPORTED) */
guilhemMBED 0:a7c449cd2d5a 132 uint8_t const os_flags = OS_RUNPRIV;
guilhemMBED 0:a7c449cd2d5a 133 #endif /* defined(FEATURE_UVISOR) && defined(TARGET_UVISOR_SUPPORTED) */
guilhemMBED 0:a7c449cd2d5a 134
guilhemMBED 0:a7c449cd2d5a 135 /* Export following defines to uVision debugger. */
guilhemMBED 0:a7c449cd2d5a 136 __USED uint32_t const CMSIS_RTOS_API_Version = osCMSIS;
guilhemMBED 0:a7c449cd2d5a 137 __USED uint32_t const CMSIS_RTOS_RTX_Version = osCMSIS_RTX;
guilhemMBED 0:a7c449cd2d5a 138 __USED uint32_t const os_clockrate = OS_TICK;
guilhemMBED 0:a7c449cd2d5a 139 __USED uint32_t const os_timernum = 0U;
guilhemMBED 0:a7c449cd2d5a 140
guilhemMBED 0:a7c449cd2d5a 141 /* Memory pool for TCB allocation */
guilhemMBED 0:a7c449cd2d5a 142 _declare_box (mp_tcb, OS_TCB_SIZE, OS_TASK_CNT);
guilhemMBED 0:a7c449cd2d5a 143 uint16_t const mp_tcb_size = sizeof(mp_tcb);
guilhemMBED 0:a7c449cd2d5a 144
guilhemMBED 0:a7c449cd2d5a 145 #ifdef __MBED_CMSIS_RTOS_CM
guilhemMBED 0:a7c449cd2d5a 146 /* Memory pool for os_idle_demon stack allocation. */
guilhemMBED 0:a7c449cd2d5a 147 _declare_box8 (mp_stk, OS_IDLESTKSIZE*4, 1);
guilhemMBED 0:a7c449cd2d5a 148 uint32_t const mp_stk_size = sizeof(mp_stk);
guilhemMBED 0:a7c449cd2d5a 149 #else
guilhemMBED 0:a7c449cd2d5a 150 /* Memory pool for System stack allocation (+os_idle_demon). */
guilhemMBED 0:a7c449cd2d5a 151 _declare_box8 (mp_stk, OS_STKSIZE*4, OS_TASK_CNT-OS_PRIV_CNT+1);
guilhemMBED 0:a7c449cd2d5a 152 uint32_t const mp_stk_size = sizeof(mp_stk);
guilhemMBED 0:a7c449cd2d5a 153
guilhemMBED 0:a7c449cd2d5a 154 /* Memory pool for user specified stack allocation (+main, +timer) */
guilhemMBED 0:a7c449cd2d5a 155 uint64_t os_stack_mem[2+OS_PRIV_CNT+(OS_STACK_SZ/8)];
guilhemMBED 0:a7c449cd2d5a 156 uint32_t const os_stack_sz = sizeof(os_stack_mem);
guilhemMBED 0:a7c449cd2d5a 157 #endif
guilhemMBED 0:a7c449cd2d5a 158
guilhemMBED 0:a7c449cd2d5a 159 #ifndef OS_FIFOSZ
guilhemMBED 0:a7c449cd2d5a 160 #define OS_FIFOSZ 16
guilhemMBED 0:a7c449cd2d5a 161 #endif
guilhemMBED 0:a7c449cd2d5a 162
guilhemMBED 0:a7c449cd2d5a 163 /* Fifo Queue buffer for ISR requests.*/
guilhemMBED 0:a7c449cd2d5a 164 uint32_t os_fifo[OS_FIFOSZ*2+1];
guilhemMBED 0:a7c449cd2d5a 165 uint8_t const os_fifo_size = OS_FIFOSZ;
guilhemMBED 0:a7c449cd2d5a 166
guilhemMBED 0:a7c449cd2d5a 167 /* An array of Active task pointers. */
guilhemMBED 0:a7c449cd2d5a 168 void *os_active_TCB[OS_TASK_CNT];
guilhemMBED 0:a7c449cd2d5a 169
guilhemMBED 0:a7c449cd2d5a 170 /* User Timers Resources */
guilhemMBED 0:a7c449cd2d5a 171 #if (OS_TIMERS != 0)
guilhemMBED 0:a7c449cd2d5a 172 extern void osTimerThread (void const *argument);
guilhemMBED 0:a7c449cd2d5a 173 #ifdef __MBED_CMSIS_RTOS_CM
guilhemMBED 0:a7c449cd2d5a 174 osThreadDef(osTimerThread, (osPriority)(OS_TIMERPRIO-3), 4*OS_TIMERSTKSZ);
guilhemMBED 0:a7c449cd2d5a 175 #else
guilhemMBED 0:a7c449cd2d5a 176 osThreadDef(osTimerThread, (osPriority)(OS_TIMERPRIO-3), 1, 4*OS_TIMERSTKSZ);
guilhemMBED 0:a7c449cd2d5a 177 #endif
guilhemMBED 0:a7c449cd2d5a 178 osThreadId osThreadId_osTimerThread;
guilhemMBED 0:a7c449cd2d5a 179 osMessageQDef(osTimerMessageQ, OS_TIMERCBQS, void *);
guilhemMBED 0:a7c449cd2d5a 180 osMessageQId osMessageQId_osTimerMessageQ;
guilhemMBED 0:a7c449cd2d5a 181 #else
guilhemMBED 0:a7c449cd2d5a 182 osThreadDef_t os_thread_def_osTimerThread = { NULL };
guilhemMBED 0:a7c449cd2d5a 183 osThreadId osThreadId_osTimerThread;
guilhemMBED 0:a7c449cd2d5a 184 osMessageQDef(osTimerMessageQ, 0U, void *);
guilhemMBED 0:a7c449cd2d5a 185 osMessageQId osMessageQId_osTimerMessageQ;
guilhemMBED 0:a7c449cd2d5a 186 #endif
guilhemMBED 0:a7c449cd2d5a 187
guilhemMBED 0:a7c449cd2d5a 188 /* Legacy RTX User Timers not used */
guilhemMBED 0:a7c449cd2d5a 189 uint32_t os_tmr = 0U;
guilhemMBED 0:a7c449cd2d5a 190 uint32_t const *m_tmr = NULL;
guilhemMBED 0:a7c449cd2d5a 191 uint16_t const mp_tmr_size = 0U;
guilhemMBED 0:a7c449cd2d5a 192
guilhemMBED 0:a7c449cd2d5a 193 /* singleton mutex */
guilhemMBED 0:a7c449cd2d5a 194 osMutexId singleton_mutex_id;
guilhemMBED 0:a7c449cd2d5a 195 osMutexDef(singleton_mutex);
guilhemMBED 0:a7c449cd2d5a 196
guilhemMBED 0:a7c449cd2d5a 197 #if defined (__CC_ARM) && !defined (__MICROLIB)
guilhemMBED 0:a7c449cd2d5a 198 /* A memory space for arm standard library. */
guilhemMBED 0:a7c449cd2d5a 199 static uint32_t std_libspace[OS_TASK_CNT][96/4];
guilhemMBED 0:a7c449cd2d5a 200 static OS_MUT std_libmutex[OS_MUTEXCNT];
guilhemMBED 0:a7c449cd2d5a 201 static uint32_t nr_mutex;
guilhemMBED 0:a7c449cd2d5a 202 extern void *__libspace_start;
guilhemMBED 0:a7c449cd2d5a 203 #endif
guilhemMBED 0:a7c449cd2d5a 204
guilhemMBED 0:a7c449cd2d5a 205 #if defined (__ICCARM__)
guilhemMBED 0:a7c449cd2d5a 206 static osMutexId std_mutex_id_sys[_MAX_LOCK] = {0};
guilhemMBED 0:a7c449cd2d5a 207 static OS_MUT std_mutex_sys[_MAX_LOCK] = {0};
guilhemMBED 0:a7c449cd2d5a 208 #define _FOPEN_MAX 10
guilhemMBED 0:a7c449cd2d5a 209 static osMutexId std_mutex_id_file[_FOPEN_MAX] = {0};
guilhemMBED 0:a7c449cd2d5a 210 static OS_MUT std_mutex_file[_FOPEN_MAX] = {0};
guilhemMBED 0:a7c449cd2d5a 211 void __iar_system_Mtxinit(__iar_Rmtx *mutex) /* Initialize a system lock */
guilhemMBED 0:a7c449cd2d5a 212 {
guilhemMBED 0:a7c449cd2d5a 213 osMutexDef_t def;
guilhemMBED 0:a7c449cd2d5a 214 uint32_t index;
guilhemMBED 0:a7c449cd2d5a 215 for (index = 0; index < _MAX_LOCK; index++) {
guilhemMBED 0:a7c449cd2d5a 216 if (0 == std_mutex_id_sys[index]) {
guilhemMBED 0:a7c449cd2d5a 217 def.mutex = &std_mutex_sys[index];
guilhemMBED 0:a7c449cd2d5a 218 std_mutex_id_sys[index] = osMutexCreate(&def);
guilhemMBED 0:a7c449cd2d5a 219 *mutex = (__iar_Rmtx*)&std_mutex_id_sys[index];
guilhemMBED 0:a7c449cd2d5a 220 return;
guilhemMBED 0:a7c449cd2d5a 221 }
guilhemMBED 0:a7c449cd2d5a 222 }
guilhemMBED 0:a7c449cd2d5a 223 // This should never happen
guilhemMBED 0:a7c449cd2d5a 224 error("Not enough mutexes\n");
guilhemMBED 0:a7c449cd2d5a 225 }
guilhemMBED 0:a7c449cd2d5a 226
guilhemMBED 0:a7c449cd2d5a 227 void __iar_system_Mtxdst(__iar_Rmtx *mutex)/*Destroy a system lock */
guilhemMBED 0:a7c449cd2d5a 228 {
guilhemMBED 0:a7c449cd2d5a 229 osMutexDelete(*(osMutexId*)*mutex);
guilhemMBED 0:a7c449cd2d5a 230 *mutex = 0;
guilhemMBED 0:a7c449cd2d5a 231 }
guilhemMBED 0:a7c449cd2d5a 232
guilhemMBED 0:a7c449cd2d5a 233 void __iar_system_Mtxlock(__iar_Rmtx *mutex) /* Lock a system lock */
guilhemMBED 0:a7c449cd2d5a 234 {
guilhemMBED 0:a7c449cd2d5a 235 osMutexWait(*(osMutexId*)*mutex, osWaitForever);
guilhemMBED 0:a7c449cd2d5a 236 }
guilhemMBED 0:a7c449cd2d5a 237
guilhemMBED 0:a7c449cd2d5a 238 void __iar_system_Mtxunlock(__iar_Rmtx *mutex) /* Unlock a system lock */
guilhemMBED 0:a7c449cd2d5a 239 {
guilhemMBED 0:a7c449cd2d5a 240 osMutexRelease(*(osMutexId*)*mutex);
guilhemMBED 0:a7c449cd2d5a 241 }
guilhemMBED 0:a7c449cd2d5a 242
guilhemMBED 0:a7c449cd2d5a 243 void __iar_file_Mtxinit(__iar_Rmtx *mutex)/*Initialize a file lock */
guilhemMBED 0:a7c449cd2d5a 244 {
guilhemMBED 0:a7c449cd2d5a 245 osMutexDef_t def;
guilhemMBED 0:a7c449cd2d5a 246 uint32_t index;
guilhemMBED 0:a7c449cd2d5a 247 for (index = 0; index < _FOPEN_MAX; index++) {
guilhemMBED 0:a7c449cd2d5a 248 if (0 == std_mutex_id_file[index]) {
guilhemMBED 0:a7c449cd2d5a 249 def.mutex = &std_mutex_file[index];
guilhemMBED 0:a7c449cd2d5a 250 std_mutex_id_file[index] = osMutexCreate(&def);
guilhemMBED 0:a7c449cd2d5a 251 *mutex = (__iar_Rmtx*)&std_mutex_id_file[index];
guilhemMBED 0:a7c449cd2d5a 252 return;
guilhemMBED 0:a7c449cd2d5a 253 }
guilhemMBED 0:a7c449cd2d5a 254 }
guilhemMBED 0:a7c449cd2d5a 255 // The variable _FOPEN_MAX needs to be increased
guilhemMBED 0:a7c449cd2d5a 256 error("Not enough mutexes\n");
guilhemMBED 0:a7c449cd2d5a 257 }
guilhemMBED 0:a7c449cd2d5a 258
guilhemMBED 0:a7c449cd2d5a 259 void __iar_file_Mtxdst(__iar_Rmtx *mutex) /* Destroy a file lock */
guilhemMBED 0:a7c449cd2d5a 260 {
guilhemMBED 0:a7c449cd2d5a 261 osMutexDelete(*(osMutexId*)*mutex);
guilhemMBED 0:a7c449cd2d5a 262 *mutex = 0;
guilhemMBED 0:a7c449cd2d5a 263 }
guilhemMBED 0:a7c449cd2d5a 264
guilhemMBED 0:a7c449cd2d5a 265 void __iar_file_Mtxlock(__iar_Rmtx *mutex) /* Lock a file lock */
guilhemMBED 0:a7c449cd2d5a 266 {
guilhemMBED 0:a7c449cd2d5a 267 osMutexWait(*(osMutexId*)*mutex, osWaitForever);
guilhemMBED 0:a7c449cd2d5a 268 }
guilhemMBED 0:a7c449cd2d5a 269
guilhemMBED 0:a7c449cd2d5a 270 void __iar_file_Mtxunlock(__iar_Rmtx *mutex) /* Unlock a file lock */
guilhemMBED 0:a7c449cd2d5a 271 {
guilhemMBED 0:a7c449cd2d5a 272 osMutexRelease(*(osMutexId*)*mutex);
guilhemMBED 0:a7c449cd2d5a 273 }
guilhemMBED 0:a7c449cd2d5a 274
guilhemMBED 0:a7c449cd2d5a 275 #endif
guilhemMBED 0:a7c449cd2d5a 276
guilhemMBED 0:a7c449cd2d5a 277 /*----------------------------------------------------------------------------
guilhemMBED 0:a7c449cd2d5a 278 * RTX Optimizations (empty functions)
guilhemMBED 0:a7c449cd2d5a 279 *---------------------------------------------------------------------------*/
guilhemMBED 0:a7c449cd2d5a 280
guilhemMBED 0:a7c449cd2d5a 281 #if OS_ROBIN == 0
guilhemMBED 0:a7c449cd2d5a 282 void rt_init_robin (void) {;}
guilhemMBED 0:a7c449cd2d5a 283 void rt_chk_robin (void) {;}
guilhemMBED 0:a7c449cd2d5a 284 #endif
guilhemMBED 0:a7c449cd2d5a 285
guilhemMBED 0:a7c449cd2d5a 286 #if OS_STKCHECK == 0
guilhemMBED 0:a7c449cd2d5a 287 void rt_stk_check (void) {;}
guilhemMBED 0:a7c449cd2d5a 288 #endif
guilhemMBED 0:a7c449cd2d5a 289
guilhemMBED 0:a7c449cd2d5a 290
guilhemMBED 0:a7c449cd2d5a 291 /*----------------------------------------------------------------------------
guilhemMBED 0:a7c449cd2d5a 292 * Standard Library multithreading interface
guilhemMBED 0:a7c449cd2d5a 293 *---------------------------------------------------------------------------*/
guilhemMBED 0:a7c449cd2d5a 294
guilhemMBED 0:a7c449cd2d5a 295 #if defined (__CC_ARM) && !defined (__MICROLIB)
guilhemMBED 0:a7c449cd2d5a 296
guilhemMBED 0:a7c449cd2d5a 297 /*--------------------------- __user_perthread_libspace ---------------------*/
guilhemMBED 0:a7c449cd2d5a 298
guilhemMBED 0:a7c449cd2d5a 299 void *__user_perthread_libspace (void) {
guilhemMBED 0:a7c449cd2d5a 300 /* Provide a separate libspace for each task. */
guilhemMBED 0:a7c449cd2d5a 301 uint32_t idx;
guilhemMBED 0:a7c449cd2d5a 302
guilhemMBED 0:a7c449cd2d5a 303 idx = (os_running != 0U) ? runtask_id () : 0U;
guilhemMBED 0:a7c449cd2d5a 304 if (idx == 0U) {
guilhemMBED 0:a7c449cd2d5a 305 /* RTX not running yet. */
guilhemMBED 0:a7c449cd2d5a 306 return (&__libspace_start);
guilhemMBED 0:a7c449cd2d5a 307 }
guilhemMBED 0:a7c449cd2d5a 308 return ((void *)&std_libspace[idx-1]);
guilhemMBED 0:a7c449cd2d5a 309 }
guilhemMBED 0:a7c449cd2d5a 310
guilhemMBED 0:a7c449cd2d5a 311 /*--------------------------- _mutex_initialize -----------------------------*/
guilhemMBED 0:a7c449cd2d5a 312
guilhemMBED 0:a7c449cd2d5a 313 int _mutex_initialize (OS_ID *mutex) {
guilhemMBED 0:a7c449cd2d5a 314 /* Allocate and initialize a system mutex. */
guilhemMBED 0:a7c449cd2d5a 315
guilhemMBED 0:a7c449cd2d5a 316 if (nr_mutex >= OS_MUTEXCNT) {
guilhemMBED 0:a7c449cd2d5a 317 /* If you are here, you need to increase the number OS_MUTEXCNT. */
guilhemMBED 0:a7c449cd2d5a 318 error("Not enough stdlib mutexes\n");
guilhemMBED 0:a7c449cd2d5a 319 }
guilhemMBED 0:a7c449cd2d5a 320 *mutex = &std_libmutex[nr_mutex++];
guilhemMBED 0:a7c449cd2d5a 321 mutex_init (*mutex);
guilhemMBED 0:a7c449cd2d5a 322 return (1);
guilhemMBED 0:a7c449cd2d5a 323 }
guilhemMBED 0:a7c449cd2d5a 324
guilhemMBED 0:a7c449cd2d5a 325
guilhemMBED 0:a7c449cd2d5a 326 /*--------------------------- _mutex_acquire --------------------------------*/
guilhemMBED 0:a7c449cd2d5a 327
guilhemMBED 0:a7c449cd2d5a 328 __attribute__((used)) void _mutex_acquire (OS_ID *mutex) {
guilhemMBED 0:a7c449cd2d5a 329 /* Acquire a system mutex, lock stdlib resources. */
guilhemMBED 0:a7c449cd2d5a 330 if (os_running) {
guilhemMBED 0:a7c449cd2d5a 331 /* RTX running, acquire a mutex. */
guilhemMBED 0:a7c449cd2d5a 332 mutex_wait (*mutex);
guilhemMBED 0:a7c449cd2d5a 333 }
guilhemMBED 0:a7c449cd2d5a 334 }
guilhemMBED 0:a7c449cd2d5a 335
guilhemMBED 0:a7c449cd2d5a 336
guilhemMBED 0:a7c449cd2d5a 337 /*--------------------------- _mutex_release --------------------------------*/
guilhemMBED 0:a7c449cd2d5a 338
guilhemMBED 0:a7c449cd2d5a 339 __attribute__((used)) void _mutex_release (OS_ID *mutex) {
guilhemMBED 0:a7c449cd2d5a 340 /* Release a system mutex, unlock stdlib resources. */
guilhemMBED 0:a7c449cd2d5a 341 if (os_running) {
guilhemMBED 0:a7c449cd2d5a 342 /* RTX running, release a mutex. */
guilhemMBED 0:a7c449cd2d5a 343 mutex_rel (*mutex);
guilhemMBED 0:a7c449cd2d5a 344 }
guilhemMBED 0:a7c449cd2d5a 345 }
guilhemMBED 0:a7c449cd2d5a 346
guilhemMBED 0:a7c449cd2d5a 347 #endif
guilhemMBED 0:a7c449cd2d5a 348
guilhemMBED 0:a7c449cd2d5a 349
guilhemMBED 0:a7c449cd2d5a 350 /*----------------------------------------------------------------------------
guilhemMBED 0:a7c449cd2d5a 351 * RTX Startup
guilhemMBED 0:a7c449cd2d5a 352 *---------------------------------------------------------------------------*/
guilhemMBED 0:a7c449cd2d5a 353
guilhemMBED 0:a7c449cd2d5a 354 /* Main Thread definition */
guilhemMBED 0:a7c449cd2d5a 355 extern void pre_main (void);
guilhemMBED 0:a7c449cd2d5a 356 osThreadDef_t os_thread_def_main = {(os_pthread)pre_main, osPriorityNormal, 1U, 0U, NULL};
guilhemMBED 0:a7c449cd2d5a 357
guilhemMBED 0:a7c449cd2d5a 358 #ifdef __CC_ARM
guilhemMBED 0:a7c449cd2d5a 359 #if defined(TARGET_NUMAKER_PFM_NUC472)
guilhemMBED 0:a7c449cd2d5a 360 extern uint32_t Image$$ARM_LIB_HEAP$$Base[];
guilhemMBED 0:a7c449cd2d5a 361 #define HEAP_START ((uint32_t) Image$$ARM_LIB_HEAP$$Base)
guilhemMBED 0:a7c449cd2d5a 362 #else
guilhemMBED 0:a7c449cd2d5a 363 extern uint32_t Image$$RW_IRAM1$$ZI$$Limit[];
guilhemMBED 0:a7c449cd2d5a 364 #define HEAP_START (Image$$RW_IRAM1$$ZI$$Limit)
guilhemMBED 0:a7c449cd2d5a 365 #endif
guilhemMBED 0:a7c449cd2d5a 366 #elif defined(__GNUC__)
guilhemMBED 0:a7c449cd2d5a 367 extern uint32_t __end__[];
guilhemMBED 0:a7c449cd2d5a 368 #define HEAP_START (__end__)
guilhemMBED 0:a7c449cd2d5a 369 #elif defined(__ICCARM__)
guilhemMBED 0:a7c449cd2d5a 370 #pragma section="HEAP"
guilhemMBED 0:a7c449cd2d5a 371 #define HEAP_END (void *)__section_end("HEAP")
guilhemMBED 0:a7c449cd2d5a 372 #endif
guilhemMBED 0:a7c449cd2d5a 373
guilhemMBED 0:a7c449cd2d5a 374 void set_main_stack(void) {
guilhemMBED 0:a7c449cd2d5a 375 #if defined(TARGET_NUMAKER_PFM_NUC472)
guilhemMBED 0:a7c449cd2d5a 376 // Scheduler stack: OS_MAINSTKSIZE words
guilhemMBED 0:a7c449cd2d5a 377 // Main thread stack: Reserved stack size - OS_MAINSTKSIZE words
guilhemMBED 0:a7c449cd2d5a 378 os_thread_def_main.stack_pointer = (uint32_t *) FINAL_SP;
guilhemMBED 0:a7c449cd2d5a 379 os_thread_def_main.stacksize = (uint32_t) INITIAL_SP - (uint32_t) FINAL_SP - OS_MAINSTKSIZE * 4;
guilhemMBED 0:a7c449cd2d5a 380 #else
guilhemMBED 0:a7c449cd2d5a 381 #if defined(__ICCARM__)
guilhemMBED 0:a7c449cd2d5a 382 /* For IAR heap is defined .icf file */
guilhemMBED 0:a7c449cd2d5a 383 uint32_t main_stack_size = ((uint32_t)INITIAL_SP - (uint32_t)HEAP_END) - interrupt_stack_size;
guilhemMBED 0:a7c449cd2d5a 384 #else
guilhemMBED 0:a7c449cd2d5a 385 /* For ARM , uARM, or GCC_ARM , heap can grow and reach main stack */
guilhemMBED 0:a7c449cd2d5a 386 #endif
guilhemMBED 0:a7c449cd2d5a 387 // That is the bottom of the main stack block: no collision detection
guilhemMBED 0:a7c449cd2d5a 388 os_thread_def_main.stack_pointer = HEAP_START;
guilhemMBED 0:a7c449cd2d5a 389
guilhemMBED 0:a7c449cd2d5a 390 // Leave OS_MAINSTKSIZE words for the scheduler and interrupts
guilhemMBED 0:a7c449cd2d5a 391 os_thread_def_main.stacksize = (INITIAL_SP - (unsigned int)HEAP_START) - (OS_MAINSTKSIZE * 4);
guilhemMBED 0:a7c449cd2d5a 392 #endif
guilhemMBED 0:a7c449cd2d5a 393 }
guilhemMBED 0:a7c449cd2d5a 394
guilhemMBED 0:a7c449cd2d5a 395 #if defined (__CC_ARM)
guilhemMBED 0:a7c449cd2d5a 396
guilhemMBED 0:a7c449cd2d5a 397 #ifdef __MICROLIB
guilhemMBED 0:a7c449cd2d5a 398
guilhemMBED 0:a7c449cd2d5a 399 int main(void);
guilhemMBED 0:a7c449cd2d5a 400 void _main_init (void) __attribute__((section(".ARM.Collect$$$$000000FF")));
guilhemMBED 0:a7c449cd2d5a 401 void $Super$$__cpp_initialize__aeabi_(void);
guilhemMBED 0:a7c449cd2d5a 402
guilhemMBED 0:a7c449cd2d5a 403 void _main_init (void) {
guilhemMBED 0:a7c449cd2d5a 404 osKernelInitialize();
guilhemMBED 0:a7c449cd2d5a 405 #ifdef __MBED_CMSIS_RTOS_CM
guilhemMBED 0:a7c449cd2d5a 406 set_main_stack();
guilhemMBED 0:a7c449cd2d5a 407 #endif
guilhemMBED 0:a7c449cd2d5a 408 osThreadCreate(&os_thread_def_main, NULL);
guilhemMBED 0:a7c449cd2d5a 409 osKernelStart();
guilhemMBED 0:a7c449cd2d5a 410 for (;;);
guilhemMBED 0:a7c449cd2d5a 411 }
guilhemMBED 0:a7c449cd2d5a 412
guilhemMBED 0:a7c449cd2d5a 413 void $Sub$$__cpp_initialize__aeabi_(void)
guilhemMBED 0:a7c449cd2d5a 414 {
guilhemMBED 0:a7c449cd2d5a 415 // this should invoke C++ initializers prior _main_init, we keep this empty and
guilhemMBED 0:a7c449cd2d5a 416 // invoke them after _main_init (=starts RTX kernel)
guilhemMBED 0:a7c449cd2d5a 417 }
guilhemMBED 0:a7c449cd2d5a 418
guilhemMBED 0:a7c449cd2d5a 419 void pre_main()
guilhemMBED 0:a7c449cd2d5a 420 {
guilhemMBED 0:a7c449cd2d5a 421 singleton_mutex_id = osMutexCreate(osMutex(singleton_mutex));
guilhemMBED 0:a7c449cd2d5a 422 $Super$$__cpp_initialize__aeabi_();
guilhemMBED 0:a7c449cd2d5a 423 main();
guilhemMBED 0:a7c449cd2d5a 424 }
guilhemMBED 0:a7c449cd2d5a 425
guilhemMBED 0:a7c449cd2d5a 426 #else
guilhemMBED 0:a7c449cd2d5a 427
guilhemMBED 0:a7c449cd2d5a 428 void * armcc_heap_base;
guilhemMBED 0:a7c449cd2d5a 429 void * armcc_heap_top;
guilhemMBED 0:a7c449cd2d5a 430
guilhemMBED 0:a7c449cd2d5a 431 int main(void);
guilhemMBED 0:a7c449cd2d5a 432
guilhemMBED 0:a7c449cd2d5a 433 void pre_main (void)
guilhemMBED 0:a7c449cd2d5a 434 {
guilhemMBED 0:a7c449cd2d5a 435 singleton_mutex_id = osMutexCreate(osMutex(singleton_mutex));
guilhemMBED 0:a7c449cd2d5a 436 __rt_lib_init((unsigned)armcc_heap_base, (unsigned)armcc_heap_top);
guilhemMBED 0:a7c449cd2d5a 437 main();
guilhemMBED 0:a7c449cd2d5a 438 }
guilhemMBED 0:a7c449cd2d5a 439
guilhemMBED 0:a7c449cd2d5a 440 /* The single memory model is checking for stack collision at run time, verifing
guilhemMBED 0:a7c449cd2d5a 441 that the heap pointer is underneath the stack pointer.
guilhemMBED 0:a7c449cd2d5a 442
guilhemMBED 0:a7c449cd2d5a 443 With the RTOS there is not only one stack above the heap, there are multiple
guilhemMBED 0:a7c449cd2d5a 444 stacks and some of them are underneath the heap pointer.
guilhemMBED 0:a7c449cd2d5a 445 */
guilhemMBED 0:a7c449cd2d5a 446 #pragma import(__use_two_region_memory)
guilhemMBED 0:a7c449cd2d5a 447
guilhemMBED 0:a7c449cd2d5a 448 __asm void __rt_entry (void) {
guilhemMBED 0:a7c449cd2d5a 449
guilhemMBED 0:a7c449cd2d5a 450 IMPORT __user_setup_stackheap
guilhemMBED 0:a7c449cd2d5a 451 IMPORT armcc_heap_base
guilhemMBED 0:a7c449cd2d5a 452 IMPORT armcc_heap_top
guilhemMBED 0:a7c449cd2d5a 453 IMPORT _platform_post_stackheap_init
guilhemMBED 0:a7c449cd2d5a 454 IMPORT os_thread_def_main
guilhemMBED 0:a7c449cd2d5a 455 IMPORT osKernelInitialize
guilhemMBED 0:a7c449cd2d5a 456 #ifdef __MBED_CMSIS_RTOS_CM
guilhemMBED 0:a7c449cd2d5a 457 IMPORT set_main_stack
guilhemMBED 0:a7c449cd2d5a 458 #endif
guilhemMBED 0:a7c449cd2d5a 459 IMPORT osKernelStart
guilhemMBED 0:a7c449cd2d5a 460 IMPORT osThreadCreate
guilhemMBED 0:a7c449cd2d5a 461
guilhemMBED 0:a7c449cd2d5a 462 /* __user_setup_stackheap returns:
guilhemMBED 0:a7c449cd2d5a 463 * - Heap base in r0 (if the program uses the heap).
guilhemMBED 0:a7c449cd2d5a 464 * - Stack base in sp.
guilhemMBED 0:a7c449cd2d5a 465 * - Heap limit in r2 (if the program uses the heap and uses two-region memory).
guilhemMBED 0:a7c449cd2d5a 466 *
guilhemMBED 0:a7c449cd2d5a 467 * More info can be found in:
guilhemMBED 0:a7c449cd2d5a 468 * ARM Compiler ARM C and C++ Libraries and Floating-Point Support User Guide
guilhemMBED 0:a7c449cd2d5a 469 */
guilhemMBED 0:a7c449cd2d5a 470 BL __user_setup_stackheap
guilhemMBED 0:a7c449cd2d5a 471 LDR R3,=armcc_heap_base
guilhemMBED 0:a7c449cd2d5a 472 LDR R4,=armcc_heap_top
guilhemMBED 0:a7c449cd2d5a 473 STR R0,[R3]
guilhemMBED 0:a7c449cd2d5a 474 STR R2,[R4]
guilhemMBED 0:a7c449cd2d5a 475 BL _platform_post_stackheap_init
guilhemMBED 0:a7c449cd2d5a 476 BL osKernelInitialize
guilhemMBED 0:a7c449cd2d5a 477 #ifdef __MBED_CMSIS_RTOS_CM
guilhemMBED 0:a7c449cd2d5a 478 BL set_main_stack
guilhemMBED 0:a7c449cd2d5a 479 #endif
guilhemMBED 0:a7c449cd2d5a 480 LDR R0,=os_thread_def_main
guilhemMBED 0:a7c449cd2d5a 481 MOVS R1,#0
guilhemMBED 0:a7c449cd2d5a 482 BL osThreadCreate
guilhemMBED 0:a7c449cd2d5a 483 BL osKernelStart
guilhemMBED 0:a7c449cd2d5a 484 /* osKernelStart should not return */
guilhemMBED 0:a7c449cd2d5a 485 B .
guilhemMBED 0:a7c449cd2d5a 486
guilhemMBED 0:a7c449cd2d5a 487 ALIGN
guilhemMBED 0:a7c449cd2d5a 488 }
guilhemMBED 0:a7c449cd2d5a 489
guilhemMBED 0:a7c449cd2d5a 490 #endif
guilhemMBED 0:a7c449cd2d5a 491
guilhemMBED 0:a7c449cd2d5a 492 #elif defined (__GNUC__)
guilhemMBED 0:a7c449cd2d5a 493
guilhemMBED 0:a7c449cd2d5a 494 osMutexDef(malloc_mutex);
guilhemMBED 0:a7c449cd2d5a 495 static osMutexId malloc_mutex_id;
guilhemMBED 0:a7c449cd2d5a 496 osMutexDef(env_mutex);
guilhemMBED 0:a7c449cd2d5a 497 static osMutexId env_mutex_id;
guilhemMBED 0:a7c449cd2d5a 498
guilhemMBED 0:a7c449cd2d5a 499 extern int atexit(void (*func)(void));
guilhemMBED 0:a7c449cd2d5a 500 extern void __libc_fini_array(void);
guilhemMBED 0:a7c449cd2d5a 501 extern void __libc_init_array (void);
guilhemMBED 0:a7c449cd2d5a 502 extern int main(int argc, char **argv);
guilhemMBED 0:a7c449cd2d5a 503
guilhemMBED 0:a7c449cd2d5a 504 void pre_main(void) {
guilhemMBED 0:a7c449cd2d5a 505 singleton_mutex_id = osMutexCreate(osMutex(singleton_mutex));
guilhemMBED 0:a7c449cd2d5a 506 malloc_mutex_id = osMutexCreate(osMutex(malloc_mutex));
guilhemMBED 0:a7c449cd2d5a 507 env_mutex_id = osMutexCreate(osMutex(env_mutex));
guilhemMBED 0:a7c449cd2d5a 508 __libc_init_array();
guilhemMBED 0:a7c449cd2d5a 509 main(0, NULL);
guilhemMBED 0:a7c449cd2d5a 510 }
guilhemMBED 0:a7c449cd2d5a 511
guilhemMBED 0:a7c449cd2d5a 512 __attribute__((naked)) void software_init_hook_rtos (void) {
guilhemMBED 0:a7c449cd2d5a 513 __asm (
guilhemMBED 0:a7c449cd2d5a 514 "bl osKernelInitialize\n"
guilhemMBED 0:a7c449cd2d5a 515 #ifdef __MBED_CMSIS_RTOS_CM
guilhemMBED 0:a7c449cd2d5a 516 "bl set_main_stack\n"
guilhemMBED 0:a7c449cd2d5a 517 #endif
guilhemMBED 0:a7c449cd2d5a 518 "ldr r0,=os_thread_def_main\n"
guilhemMBED 0:a7c449cd2d5a 519 "movs r1,#0\n"
guilhemMBED 0:a7c449cd2d5a 520 "bl osThreadCreate\n"
guilhemMBED 0:a7c449cd2d5a 521 "bl osKernelStart\n"
guilhemMBED 0:a7c449cd2d5a 522 /* osKernelStart should not return */
guilhemMBED 0:a7c449cd2d5a 523 "B .\n"
guilhemMBED 0:a7c449cd2d5a 524 );
guilhemMBED 0:a7c449cd2d5a 525 }
guilhemMBED 0:a7c449cd2d5a 526
guilhemMBED 0:a7c449cd2d5a 527 // Opaque declaration of _reent structure
guilhemMBED 0:a7c449cd2d5a 528 struct _reent;
guilhemMBED 0:a7c449cd2d5a 529
guilhemMBED 0:a7c449cd2d5a 530 void __rtos_malloc_lock( struct _reent *_r )
guilhemMBED 0:a7c449cd2d5a 531 {
guilhemMBED 0:a7c449cd2d5a 532 osMutexWait(malloc_mutex_id, osWaitForever);
guilhemMBED 0:a7c449cd2d5a 533 }
guilhemMBED 0:a7c449cd2d5a 534
guilhemMBED 0:a7c449cd2d5a 535 void __rtos_malloc_unlock( struct _reent *_r )
guilhemMBED 0:a7c449cd2d5a 536 {
guilhemMBED 0:a7c449cd2d5a 537 osMutexRelease(malloc_mutex_id);
guilhemMBED 0:a7c449cd2d5a 538 }
guilhemMBED 0:a7c449cd2d5a 539
guilhemMBED 0:a7c449cd2d5a 540 void __rtos_env_lock( struct _reent *_r )
guilhemMBED 0:a7c449cd2d5a 541 {
guilhemMBED 0:a7c449cd2d5a 542 osMutexWait(env_mutex_id, osWaitForever);
guilhemMBED 0:a7c449cd2d5a 543 }
guilhemMBED 0:a7c449cd2d5a 544
guilhemMBED 0:a7c449cd2d5a 545 void __rtos_env_unlock( struct _reent *_r )
guilhemMBED 0:a7c449cd2d5a 546 {
guilhemMBED 0:a7c449cd2d5a 547 osMutexRelease(env_mutex_id);
guilhemMBED 0:a7c449cd2d5a 548 }
guilhemMBED 0:a7c449cd2d5a 549
guilhemMBED 0:a7c449cd2d5a 550 #elif defined (__ICCARM__)
guilhemMBED 0:a7c449cd2d5a 551
guilhemMBED 0:a7c449cd2d5a 552 extern void* __vector_table;
guilhemMBED 0:a7c449cd2d5a 553 extern int __low_level_init(void);
guilhemMBED 0:a7c449cd2d5a 554 extern void __iar_data_init3(void);
guilhemMBED 0:a7c449cd2d5a 555 extern __weak void __iar_init_core( void );
guilhemMBED 0:a7c449cd2d5a 556 extern __weak void __iar_init_vfp( void );
guilhemMBED 0:a7c449cd2d5a 557 extern void __iar_dynamic_initialization(void);
guilhemMBED 0:a7c449cd2d5a 558 extern void mbed_sdk_init(void);
guilhemMBED 0:a7c449cd2d5a 559 extern void mbed_main(void);
guilhemMBED 0:a7c449cd2d5a 560 extern int main(void);
guilhemMBED 0:a7c449cd2d5a 561 extern void exit(int arg);
guilhemMBED 0:a7c449cd2d5a 562
guilhemMBED 0:a7c449cd2d5a 563 static uint8_t low_level_init_needed;
guilhemMBED 0:a7c449cd2d5a 564
guilhemMBED 0:a7c449cd2d5a 565 void pre_main(void) {
guilhemMBED 0:a7c449cd2d5a 566 singleton_mutex_id = osMutexCreate(osMutex(singleton_mutex));
guilhemMBED 0:a7c449cd2d5a 567 if (low_level_init_needed) {
guilhemMBED 0:a7c449cd2d5a 568 __iar_dynamic_initialization();
guilhemMBED 0:a7c449cd2d5a 569 }
guilhemMBED 0:a7c449cd2d5a 570 mbed_main();
guilhemMBED 0:a7c449cd2d5a 571 main();
guilhemMBED 0:a7c449cd2d5a 572 }
guilhemMBED 0:a7c449cd2d5a 573
guilhemMBED 0:a7c449cd2d5a 574 #pragma required=__vector_table
guilhemMBED 0:a7c449cd2d5a 575 void __iar_program_start( void )
guilhemMBED 0:a7c449cd2d5a 576 {
guilhemMBED 0:a7c449cd2d5a 577 #ifdef __MBED_CMSIS_RTOS_CM
guilhemMBED 0:a7c449cd2d5a 578 __iar_init_core();
guilhemMBED 0:a7c449cd2d5a 579 __iar_init_vfp();
guilhemMBED 0:a7c449cd2d5a 580
guilhemMBED 0:a7c449cd2d5a 581 uint8_t low_level_init_needed_local;
guilhemMBED 0:a7c449cd2d5a 582
guilhemMBED 0:a7c449cd2d5a 583 low_level_init_needed_local = __low_level_init();
guilhemMBED 0:a7c449cd2d5a 584 if (low_level_init_needed_local) {
guilhemMBED 0:a7c449cd2d5a 585 __iar_data_init3();
guilhemMBED 0:a7c449cd2d5a 586 mbed_sdk_init();
guilhemMBED 0:a7c449cd2d5a 587 }
guilhemMBED 0:a7c449cd2d5a 588 /* Store in a global variable after RAM has been initialized */
guilhemMBED 0:a7c449cd2d5a 589 low_level_init_needed = low_level_init_needed_local;
guilhemMBED 0:a7c449cd2d5a 590 #endif
guilhemMBED 0:a7c449cd2d5a 591 osKernelInitialize();
guilhemMBED 0:a7c449cd2d5a 592 #ifdef __MBED_CMSIS_RTOS_CM
guilhemMBED 0:a7c449cd2d5a 593 set_main_stack();
guilhemMBED 0:a7c449cd2d5a 594 #endif
guilhemMBED 0:a7c449cd2d5a 595 osThreadCreate(&os_thread_def_main, NULL);
guilhemMBED 0:a7c449cd2d5a 596 osKernelStart();
guilhemMBED 0:a7c449cd2d5a 597 /* osKernelStart should not return */
guilhemMBED 0:a7c449cd2d5a 598 while (1);
guilhemMBED 0:a7c449cd2d5a 599 }
guilhemMBED 0:a7c449cd2d5a 600
guilhemMBED 0:a7c449cd2d5a 601 #endif
guilhemMBED 0:a7c449cd2d5a 602
guilhemMBED 0:a7c449cd2d5a 603
guilhemMBED 0:a7c449cd2d5a 604 /*----------------------------------------------------------------------------
guilhemMBED 0:a7c449cd2d5a 605 * end of file
guilhemMBED 0:a7c449cd2d5a 606 *---------------------------------------------------------------------------*/
guilhemMBED 0:a7c449cd2d5a 607
guilhemMBED 0:a7c449cd2d5a 608 /** @}*/