mbed client lightswitch demo

Dependencies:   mbed Socket lwip-eth lwip-sys lwip

Fork of mbed-client-classic-example-lwip by Austin Blackstone

Committer:
mbedAustin
Date:
Thu Jun 09 17:08:36 2016 +0000
Revision:
11:cada08fc8a70
Commit for public Consumption

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbedAustin 11:cada08fc8a70 1 /*----------------------------------------------------------------------------
mbedAustin 11:cada08fc8a70 2 * RL-ARM - RTX
mbedAustin 11:cada08fc8a70 3 *----------------------------------------------------------------------------
mbedAustin 11:cada08fc8a70 4 * Name: rt_CMSIS.c
mbedAustin 11:cada08fc8a70 5 * Purpose: CMSIS RTOS API
mbedAustin 11:cada08fc8a70 6 * Rev.: V4.74
mbedAustin 11:cada08fc8a70 7 *----------------------------------------------------------------------------
mbedAustin 11:cada08fc8a70 8 *
mbedAustin 11:cada08fc8a70 9 * Copyright (c) 1999-2009 KEIL, 2009-2013 ARM Germany GmbH
mbedAustin 11:cada08fc8a70 10 * All rights reserved.
mbedAustin 11:cada08fc8a70 11 * Redistribution and use in source and binary forms, with or without
mbedAustin 11:cada08fc8a70 12 * modification, are permitted provided that the following conditions are met:
mbedAustin 11:cada08fc8a70 13 * - Redistributions of source code must retain the above copyright
mbedAustin 11:cada08fc8a70 14 * notice, this list of conditions and the following disclaimer.
mbedAustin 11:cada08fc8a70 15 * - Redistributions in binary form must reproduce the above copyright
mbedAustin 11:cada08fc8a70 16 * notice, this list of conditions and the following disclaimer in the
mbedAustin 11:cada08fc8a70 17 * documentation and/or other materials provided with the distribution.
mbedAustin 11:cada08fc8a70 18 * - Neither the name of ARM nor the names of its contributors may be used
mbedAustin 11:cada08fc8a70 19 * to endorse or promote products derived from this software without
mbedAustin 11:cada08fc8a70 20 * specific prior written permission.
mbedAustin 11:cada08fc8a70 21 *
mbedAustin 11:cada08fc8a70 22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
mbedAustin 11:cada08fc8a70 23 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
mbedAustin 11:cada08fc8a70 24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
mbedAustin 11:cada08fc8a70 25 * ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
mbedAustin 11:cada08fc8a70 26 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
mbedAustin 11:cada08fc8a70 27 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
mbedAustin 11:cada08fc8a70 28 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
mbedAustin 11:cada08fc8a70 29 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
mbedAustin 11:cada08fc8a70 30 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
mbedAustin 11:cada08fc8a70 31 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
mbedAustin 11:cada08fc8a70 32 * POSSIBILITY OF SUCH DAMAGE.
mbedAustin 11:cada08fc8a70 33 *---------------------------------------------------------------------------*/
mbedAustin 11:cada08fc8a70 34
mbedAustin 11:cada08fc8a70 35 #define __CMSIS_GENERIC
mbedAustin 11:cada08fc8a70 36
mbedAustin 11:cada08fc8a70 37 #if defined (__CORTEX_M4) || defined (__CORTEX_M4F)
mbedAustin 11:cada08fc8a70 38 #include "core_cm4.h"
mbedAustin 11:cada08fc8a70 39 #elif defined (__CORTEX_M3)
mbedAustin 11:cada08fc8a70 40 #include "core_cm3.h"
mbedAustin 11:cada08fc8a70 41 #elif defined (__CORTEX_M0)
mbedAustin 11:cada08fc8a70 42 #include "core_cm0.h"
mbedAustin 11:cada08fc8a70 43 #elif defined (__CORTEX_A9)
mbedAustin 11:cada08fc8a70 44 #include "core_ca9.h"
mbedAustin 11:cada08fc8a70 45 #else
mbedAustin 11:cada08fc8a70 46 #error "Missing __CORTEX_xx definition"
mbedAustin 11:cada08fc8a70 47 #endif
mbedAustin 11:cada08fc8a70 48
mbedAustin 11:cada08fc8a70 49 #include "rt_TypeDef.h"
mbedAustin 11:cada08fc8a70 50 #include "RTX_Config.h"
mbedAustin 11:cada08fc8a70 51 #include "rt_System.h"
mbedAustin 11:cada08fc8a70 52 #include "rt_Task.h"
mbedAustin 11:cada08fc8a70 53 #include "rt_Event.h"
mbedAustin 11:cada08fc8a70 54 #include "rt_List.h"
mbedAustin 11:cada08fc8a70 55 #include "rt_Time.h"
mbedAustin 11:cada08fc8a70 56 #include "rt_Mutex.h"
mbedAustin 11:cada08fc8a70 57 #include "rt_Semaphore.h"
mbedAustin 11:cada08fc8a70 58 #include "rt_Mailbox.h"
mbedAustin 11:cada08fc8a70 59 #include "rt_MemBox.h"
mbedAustin 11:cada08fc8a70 60 #include "rt_Memory.h"
mbedAustin 11:cada08fc8a70 61 #include "rt_HAL_CM.h"
mbedAustin 11:cada08fc8a70 62
mbedAustin 11:cada08fc8a70 63 #define os_thread_cb OS_TCB
mbedAustin 11:cada08fc8a70 64
mbedAustin 11:cada08fc8a70 65 #include "cmsis_os.h"
mbedAustin 11:cada08fc8a70 66
mbedAustin 11:cada08fc8a70 67 #if (osFeature_Signals != 16)
mbedAustin 11:cada08fc8a70 68 #error Invalid "osFeature_Signals" value!
mbedAustin 11:cada08fc8a70 69 #endif
mbedAustin 11:cada08fc8a70 70 #if (osFeature_Semaphore > 65535)
mbedAustin 11:cada08fc8a70 71 #error Invalid "osFeature_Semaphore" value!
mbedAustin 11:cada08fc8a70 72 #endif
mbedAustin 11:cada08fc8a70 73 #if (osFeature_Wait != 0)
mbedAustin 11:cada08fc8a70 74 #error osWait not supported!
mbedAustin 11:cada08fc8a70 75 #endif
mbedAustin 11:cada08fc8a70 76
mbedAustin 11:cada08fc8a70 77
mbedAustin 11:cada08fc8a70 78 // ==== Enumeration, structures, defines ====
mbedAustin 11:cada08fc8a70 79
mbedAustin 11:cada08fc8a70 80 // Service Calls defines
mbedAustin 11:cada08fc8a70 81
mbedAustin 11:cada08fc8a70 82 #if defined (__CC_ARM) /* ARM Compiler */
mbedAustin 11:cada08fc8a70 83
mbedAustin 11:cada08fc8a70 84 #define __NO_RETURN __declspec(noreturn)
mbedAustin 11:cada08fc8a70 85
mbedAustin 11:cada08fc8a70 86 #define osEvent_type osEvent
mbedAustin 11:cada08fc8a70 87 #define osEvent_ret_status ret
mbedAustin 11:cada08fc8a70 88 #define osEvent_ret_value ret
mbedAustin 11:cada08fc8a70 89 #define osEvent_ret_msg ret
mbedAustin 11:cada08fc8a70 90 #define osEvent_ret_mail ret
mbedAustin 11:cada08fc8a70 91
mbedAustin 11:cada08fc8a70 92 #define osCallback_type osCallback
mbedAustin 11:cada08fc8a70 93 #define osCallback_ret ret
mbedAustin 11:cada08fc8a70 94
mbedAustin 11:cada08fc8a70 95 #define SVC_0_1(f,t,...) \
mbedAustin 11:cada08fc8a70 96 __svc_indirect(0) t _##f (t(*)()); \
mbedAustin 11:cada08fc8a70 97 t f (void); \
mbedAustin 11:cada08fc8a70 98 __attribute__((always_inline)) \
mbedAustin 11:cada08fc8a70 99 static __inline t __##f (void) { \
mbedAustin 11:cada08fc8a70 100 return _##f(f); \
mbedAustin 11:cada08fc8a70 101 }
mbedAustin 11:cada08fc8a70 102
mbedAustin 11:cada08fc8a70 103 #define SVC_1_0(f,t,t1,...) \
mbedAustin 11:cada08fc8a70 104 __svc_indirect(0) t _##f (t(*)(t1),t1); \
mbedAustin 11:cada08fc8a70 105 t f (t1 a1); \
mbedAustin 11:cada08fc8a70 106 __attribute__((always_inline)) \
mbedAustin 11:cada08fc8a70 107 static __inline t __##f (t1 a1) { \
mbedAustin 11:cada08fc8a70 108 _##f(f,a1); \
mbedAustin 11:cada08fc8a70 109 }
mbedAustin 11:cada08fc8a70 110
mbedAustin 11:cada08fc8a70 111 #define SVC_1_1(f,t,t1,...) \
mbedAustin 11:cada08fc8a70 112 __svc_indirect(0) t _##f (t(*)(t1),t1); \
mbedAustin 11:cada08fc8a70 113 t f (t1 a1); \
mbedAustin 11:cada08fc8a70 114 __attribute__((always_inline)) \
mbedAustin 11:cada08fc8a70 115 static __inline t __##f (t1 a1) { \
mbedAustin 11:cada08fc8a70 116 return _##f(f,a1); \
mbedAustin 11:cada08fc8a70 117 }
mbedAustin 11:cada08fc8a70 118
mbedAustin 11:cada08fc8a70 119 #define SVC_2_1(f,t,t1,t2,...) \
mbedAustin 11:cada08fc8a70 120 __svc_indirect(0) t _##f (t(*)(t1,t2),t1,t2); \
mbedAustin 11:cada08fc8a70 121 t f (t1 a1, t2 a2); \
mbedAustin 11:cada08fc8a70 122 __attribute__((always_inline)) \
mbedAustin 11:cada08fc8a70 123 static __inline t __##f (t1 a1, t2 a2) { \
mbedAustin 11:cada08fc8a70 124 return _##f(f,a1,a2); \
mbedAustin 11:cada08fc8a70 125 }
mbedAustin 11:cada08fc8a70 126
mbedAustin 11:cada08fc8a70 127 #define SVC_3_1(f,t,t1,t2,t3,...) \
mbedAustin 11:cada08fc8a70 128 __svc_indirect(0) t _##f (t(*)(t1,t2,t3),t1,t2,t3); \
mbedAustin 11:cada08fc8a70 129 t f (t1 a1, t2 a2, t3 a3); \
mbedAustin 11:cada08fc8a70 130 __attribute__((always_inline)) \
mbedAustin 11:cada08fc8a70 131 static __inline t __##f (t1 a1, t2 a2, t3 a3) { \
mbedAustin 11:cada08fc8a70 132 return _##f(f,a1,a2,a3); \
mbedAustin 11:cada08fc8a70 133 }
mbedAustin 11:cada08fc8a70 134
mbedAustin 11:cada08fc8a70 135 #define SVC_4_1(f,t,t1,t2,t3,t4,...) \
mbedAustin 11:cada08fc8a70 136 __svc_indirect(0) t _##f (t(*)(t1,t2,t3,t4),t1,t2,t3,t4); \
mbedAustin 11:cada08fc8a70 137 t f (t1 a1, t2 a2, t3 a3, t4 a4); \
mbedAustin 11:cada08fc8a70 138 __attribute__((always_inline)) \
mbedAustin 11:cada08fc8a70 139 static __inline t __##f (t1 a1, t2 a2, t3 a3, t4 a4) { \
mbedAustin 11:cada08fc8a70 140 return _##f(f,a1,a2,a3,a4); \
mbedAustin 11:cada08fc8a70 141 }
mbedAustin 11:cada08fc8a70 142
mbedAustin 11:cada08fc8a70 143 #define SVC_1_2 SVC_1_1
mbedAustin 11:cada08fc8a70 144 #define SVC_1_3 SVC_1_1
mbedAustin 11:cada08fc8a70 145 #define SVC_2_3 SVC_2_1
mbedAustin 11:cada08fc8a70 146
mbedAustin 11:cada08fc8a70 147 #elif defined (__GNUC__) /* GNU Compiler */
mbedAustin 11:cada08fc8a70 148
mbedAustin 11:cada08fc8a70 149 #define __NO_RETURN __attribute__((noreturn))
mbedAustin 11:cada08fc8a70 150
mbedAustin 11:cada08fc8a70 151 typedef uint32_t __attribute__((vector_size(8))) ret64;
mbedAustin 11:cada08fc8a70 152 typedef uint32_t __attribute__((vector_size(16))) ret128;
mbedAustin 11:cada08fc8a70 153
mbedAustin 11:cada08fc8a70 154 #define RET_pointer __r0
mbedAustin 11:cada08fc8a70 155 #define RET_int32_t __r0
mbedAustin 11:cada08fc8a70 156 #define RET_uint32_t __r0
mbedAustin 11:cada08fc8a70 157 #define RET_osStatus __r0
mbedAustin 11:cada08fc8a70 158 #define RET_osPriority __r0
mbedAustin 11:cada08fc8a70 159 #define RET_osEvent {(osStatus)__r0, {(uint32_t)__r1}, {(void *)__r2}}
mbedAustin 11:cada08fc8a70 160 #define RET_osCallback {(void *)__r0, (void *)__r1}
mbedAustin 11:cada08fc8a70 161
mbedAustin 11:cada08fc8a70 162 #if defined (__ARM_PCS_VFP)
mbedAustin 11:cada08fc8a70 163
mbedAustin 11:cada08fc8a70 164 #define osEvent_type void
mbedAustin 11:cada08fc8a70 165 #define osEvent_ret_status { __asm ("MOV r0, %0;" \
mbedAustin 11:cada08fc8a70 166 : /* no outputs */ \
mbedAustin 11:cada08fc8a70 167 : "r"(ret.status) \
mbedAustin 11:cada08fc8a70 168 : "r0" \
mbedAustin 11:cada08fc8a70 169 ); \
mbedAustin 11:cada08fc8a70 170 }
mbedAustin 11:cada08fc8a70 171 #define osEvent_ret_value { __asm ("MOV r1, %0;" \
mbedAustin 11:cada08fc8a70 172 "MOV r0, %1;" \
mbedAustin 11:cada08fc8a70 173 : /* no outputs */ \
mbedAustin 11:cada08fc8a70 174 : "r"(ret.value.v), \
mbedAustin 11:cada08fc8a70 175 "r"(ret.status) \
mbedAustin 11:cada08fc8a70 176 : "r0", "r1" \
mbedAustin 11:cada08fc8a70 177 ); \
mbedAustin 11:cada08fc8a70 178 }
mbedAustin 11:cada08fc8a70 179 #define osEvent_ret_msg { __asm ("MOV r2, %0;" \
mbedAustin 11:cada08fc8a70 180 "MOV r1, %1;" \
mbedAustin 11:cada08fc8a70 181 "MOV r0, %2;" \
mbedAustin 11:cada08fc8a70 182 : /* no outputs */ \
mbedAustin 11:cada08fc8a70 183 : "r"(ret.def.message_id), \
mbedAustin 11:cada08fc8a70 184 "r"(ret.value.v), \
mbedAustin 11:cada08fc8a70 185 "r"(ret.status) \
mbedAustin 11:cada08fc8a70 186 : "r0", "r1" , "r2" \
mbedAustin 11:cada08fc8a70 187 ); \
mbedAustin 11:cada08fc8a70 188 }
mbedAustin 11:cada08fc8a70 189
mbedAustin 11:cada08fc8a70 190 #define osEvent_ret_mail { __asm ("MOV r2, %0;" \
mbedAustin 11:cada08fc8a70 191 "MOV r1, %1;" \
mbedAustin 11:cada08fc8a70 192 "MOV r0, %2;" \
mbedAustin 11:cada08fc8a70 193 : /* no outputs */ \
mbedAustin 11:cada08fc8a70 194 : "r"(ret.def.mail_id), \
mbedAustin 11:cada08fc8a70 195 "r"(ret.value.v), \
mbedAustin 11:cada08fc8a70 196 "r"(ret.status) \
mbedAustin 11:cada08fc8a70 197 : "r0", "r1" , "r2" \
mbedAustin 11:cada08fc8a70 198 ); \
mbedAustin 11:cada08fc8a70 199 }
mbedAustin 11:cada08fc8a70 200
mbedAustin 11:cada08fc8a70 201 #define osCallback_type void
mbedAustin 11:cada08fc8a70 202 #define osCallback_ret { __asm ("MOV r1, %0;" \
mbedAustin 11:cada08fc8a70 203 "MOV r0, %1;" \
mbedAustin 11:cada08fc8a70 204 : /* no outputs */ \
mbedAustin 11:cada08fc8a70 205 : "r"(ret.arg), \
mbedAustin 11:cada08fc8a70 206 "r"(ret.fp) \
mbedAustin 11:cada08fc8a70 207 : "r0", "r1" \
mbedAustin 11:cada08fc8a70 208 ); \
mbedAustin 11:cada08fc8a70 209 }
mbedAustin 11:cada08fc8a70 210
mbedAustin 11:cada08fc8a70 211 #else /* defined (__ARM_PCS_VFP) */
mbedAustin 11:cada08fc8a70 212
mbedAustin 11:cada08fc8a70 213 #define osEvent_type ret128
mbedAustin 11:cada08fc8a70 214 #define osEvent_ret_status (ret128){ret.status}
mbedAustin 11:cada08fc8a70 215 #define osEvent_ret_value (ret128){ret.status, ret.value.v}
mbedAustin 11:cada08fc8a70 216 #define osEvent_ret_msg (ret128){ret.status, ret.value.v, (uint32_t)ret.def.message_id}
mbedAustin 11:cada08fc8a70 217 #define osEvent_ret_mail (ret128){ret.status, ret.value.v, (uint32_t)ret.def.mail_id}
mbedAustin 11:cada08fc8a70 218
mbedAustin 11:cada08fc8a70 219 #define osCallback_type ret64
mbedAustin 11:cada08fc8a70 220 #define osCallback_ret (ret64) {(uint32_t)ret.fp, (uint32_t)ret.arg}
mbedAustin 11:cada08fc8a70 221
mbedAustin 11:cada08fc8a70 222 #endif /* defined (__ARM_PCS_VFP) */
mbedAustin 11:cada08fc8a70 223
mbedAustin 11:cada08fc8a70 224 #define SVC_ArgN(n) \
mbedAustin 11:cada08fc8a70 225 register int __r##n __asm("r"#n);
mbedAustin 11:cada08fc8a70 226
mbedAustin 11:cada08fc8a70 227 #define SVC_ArgR(n,t,a) \
mbedAustin 11:cada08fc8a70 228 register t __r##n __asm("r"#n) = a;
mbedAustin 11:cada08fc8a70 229
mbedAustin 11:cada08fc8a70 230 #define SVC_Arg0() \
mbedAustin 11:cada08fc8a70 231 SVC_ArgN(0) \
mbedAustin 11:cada08fc8a70 232 SVC_ArgN(1) \
mbedAustin 11:cada08fc8a70 233 SVC_ArgN(2) \
mbedAustin 11:cada08fc8a70 234 SVC_ArgN(3)
mbedAustin 11:cada08fc8a70 235
mbedAustin 11:cada08fc8a70 236 #define SVC_Arg1(t1) \
mbedAustin 11:cada08fc8a70 237 SVC_ArgR(0,t1,a1) \
mbedAustin 11:cada08fc8a70 238 SVC_ArgN(1) \
mbedAustin 11:cada08fc8a70 239 SVC_ArgN(2) \
mbedAustin 11:cada08fc8a70 240 SVC_ArgN(3)
mbedAustin 11:cada08fc8a70 241
mbedAustin 11:cada08fc8a70 242 #define SVC_Arg2(t1,t2) \
mbedAustin 11:cada08fc8a70 243 SVC_ArgR(0,t1,a1) \
mbedAustin 11:cada08fc8a70 244 SVC_ArgR(1,t2,a2) \
mbedAustin 11:cada08fc8a70 245 SVC_ArgN(2) \
mbedAustin 11:cada08fc8a70 246 SVC_ArgN(3)
mbedAustin 11:cada08fc8a70 247
mbedAustin 11:cada08fc8a70 248 #define SVC_Arg3(t1,t2,t3) \
mbedAustin 11:cada08fc8a70 249 SVC_ArgR(0,t1,a1) \
mbedAustin 11:cada08fc8a70 250 SVC_ArgR(1,t2,a2) \
mbedAustin 11:cada08fc8a70 251 SVC_ArgR(2,t3,a3) \
mbedAustin 11:cada08fc8a70 252 SVC_ArgN(3)
mbedAustin 11:cada08fc8a70 253
mbedAustin 11:cada08fc8a70 254 #define SVC_Arg4(t1,t2,t3,t4) \
mbedAustin 11:cada08fc8a70 255 SVC_ArgR(0,t1,a1) \
mbedAustin 11:cada08fc8a70 256 SVC_ArgR(1,t2,a2) \
mbedAustin 11:cada08fc8a70 257 SVC_ArgR(2,t3,a3) \
mbedAustin 11:cada08fc8a70 258 SVC_ArgR(3,t4,a4)
mbedAustin 11:cada08fc8a70 259
mbedAustin 11:cada08fc8a70 260 #if (defined (__CORTEX_M0))
mbedAustin 11:cada08fc8a70 261 #define SVC_Call(f) \
mbedAustin 11:cada08fc8a70 262 __asm volatile \
mbedAustin 11:cada08fc8a70 263 ( \
mbedAustin 11:cada08fc8a70 264 "ldr r7,="#f"\n\t" \
mbedAustin 11:cada08fc8a70 265 "mov r12,r7\n\t" \
mbedAustin 11:cada08fc8a70 266 "svc 0" \
mbedAustin 11:cada08fc8a70 267 : "=r" (__r0), "=r" (__r1), "=r" (__r2), "=r" (__r3) \
mbedAustin 11:cada08fc8a70 268 : "r" (__r0), "r" (__r1), "r" (__r2), "r" (__r3) \
mbedAustin 11:cada08fc8a70 269 : "r7", "r12", "lr", "cc" \
mbedAustin 11:cada08fc8a70 270 );
mbedAustin 11:cada08fc8a70 271 #else
mbedAustin 11:cada08fc8a70 272 #define SVC_Call(f) \
mbedAustin 11:cada08fc8a70 273 __asm volatile \
mbedAustin 11:cada08fc8a70 274 ( \
mbedAustin 11:cada08fc8a70 275 "ldr r12,="#f"\n\t" \
mbedAustin 11:cada08fc8a70 276 "svc 0" \
mbedAustin 11:cada08fc8a70 277 : "=r" (__r0), "=r" (__r1), "=r" (__r2), "=r" (__r3) \
mbedAustin 11:cada08fc8a70 278 : "r" (__r0), "r" (__r1), "r" (__r2), "r" (__r3) \
mbedAustin 11:cada08fc8a70 279 : "r12", "lr", "cc" \
mbedAustin 11:cada08fc8a70 280 );
mbedAustin 11:cada08fc8a70 281 #endif
mbedAustin 11:cada08fc8a70 282
mbedAustin 11:cada08fc8a70 283 #define SVC_0_1(f,t,rv) \
mbedAustin 11:cada08fc8a70 284 __attribute__((always_inline)) \
mbedAustin 11:cada08fc8a70 285 static inline t __##f (void) { \
mbedAustin 11:cada08fc8a70 286 SVC_Arg0(); \
mbedAustin 11:cada08fc8a70 287 SVC_Call(f); \
mbedAustin 11:cada08fc8a70 288 return (t) rv; \
mbedAustin 11:cada08fc8a70 289 }
mbedAustin 11:cada08fc8a70 290
mbedAustin 11:cada08fc8a70 291 #define SVC_1_0(f,t,t1) \
mbedAustin 11:cada08fc8a70 292 __attribute__((always_inline)) \
mbedAustin 11:cada08fc8a70 293 static inline t __##f (t1 a1) { \
mbedAustin 11:cada08fc8a70 294 SVC_Arg1(t1); \
mbedAustin 11:cada08fc8a70 295 SVC_Call(f); \
mbedAustin 11:cada08fc8a70 296 }
mbedAustin 11:cada08fc8a70 297
mbedAustin 11:cada08fc8a70 298 #define SVC_1_1(f,t,t1,rv) \
mbedAustin 11:cada08fc8a70 299 __attribute__((always_inline)) \
mbedAustin 11:cada08fc8a70 300 static inline t __##f (t1 a1) { \
mbedAustin 11:cada08fc8a70 301 SVC_Arg1(t1); \
mbedAustin 11:cada08fc8a70 302 SVC_Call(f); \
mbedAustin 11:cada08fc8a70 303 return (t) rv; \
mbedAustin 11:cada08fc8a70 304 }
mbedAustin 11:cada08fc8a70 305
mbedAustin 11:cada08fc8a70 306 #define SVC_2_1(f,t,t1,t2,rv) \
mbedAustin 11:cada08fc8a70 307 __attribute__((always_inline)) \
mbedAustin 11:cada08fc8a70 308 static inline t __##f (t1 a1, t2 a2) { \
mbedAustin 11:cada08fc8a70 309 SVC_Arg2(t1,t2); \
mbedAustin 11:cada08fc8a70 310 SVC_Call(f); \
mbedAustin 11:cada08fc8a70 311 return (t) rv; \
mbedAustin 11:cada08fc8a70 312 }
mbedAustin 11:cada08fc8a70 313
mbedAustin 11:cada08fc8a70 314 #define SVC_3_1(f,t,t1,t2,t3,rv) \
mbedAustin 11:cada08fc8a70 315 __attribute__((always_inline)) \
mbedAustin 11:cada08fc8a70 316 static inline t __##f (t1 a1, t2 a2, t3 a3) { \
mbedAustin 11:cada08fc8a70 317 SVC_Arg3(t1,t2,t3); \
mbedAustin 11:cada08fc8a70 318 SVC_Call(f); \
mbedAustin 11:cada08fc8a70 319 return (t) rv; \
mbedAustin 11:cada08fc8a70 320 }
mbedAustin 11:cada08fc8a70 321
mbedAustin 11:cada08fc8a70 322 #define SVC_4_1(f,t,t1,t2,t3,t4,rv) \
mbedAustin 11:cada08fc8a70 323 __attribute__((always_inline)) \
mbedAustin 11:cada08fc8a70 324 static inline t __##f (t1 a1, t2 a2, t3 a3, t4 a4) { \
mbedAustin 11:cada08fc8a70 325 SVC_Arg4(t1,t2,t3,t4); \
mbedAustin 11:cada08fc8a70 326 SVC_Call(f); \
mbedAustin 11:cada08fc8a70 327 return (t) rv; \
mbedAustin 11:cada08fc8a70 328 }
mbedAustin 11:cada08fc8a70 329
mbedAustin 11:cada08fc8a70 330 #define SVC_1_2 SVC_1_1
mbedAustin 11:cada08fc8a70 331 #define SVC_1_3 SVC_1_1
mbedAustin 11:cada08fc8a70 332 #define SVC_2_3 SVC_2_1
mbedAustin 11:cada08fc8a70 333
mbedAustin 11:cada08fc8a70 334 #elif defined (__ICCARM__) /* IAR Compiler */
mbedAustin 11:cada08fc8a70 335
mbedAustin 11:cada08fc8a70 336 #define __NO_RETURN __noreturn
mbedAustin 11:cada08fc8a70 337
mbedAustin 11:cada08fc8a70 338 #define RET_osEvent "=r"(ret.status), "=r"(ret.value), "=r"(ret.def)
mbedAustin 11:cada08fc8a70 339 #define RET_osCallback "=r"(ret.fp), "=r"(ret.arg)
mbedAustin 11:cada08fc8a70 340
mbedAustin 11:cada08fc8a70 341 #define osEvent_type osEvent
mbedAustin 11:cada08fc8a70 342 #define osEvent_ret_status ret
mbedAustin 11:cada08fc8a70 343 #define osEvent_ret_value ret
mbedAustin 11:cada08fc8a70 344 #define osEvent_ret_msg ret
mbedAustin 11:cada08fc8a70 345 #define osEvent_ret_mail ret
mbedAustin 11:cada08fc8a70 346
mbedAustin 11:cada08fc8a70 347 #define osCallback_type uint64_t
mbedAustin 11:cada08fc8a70 348 #define osCallback_ret ((uint64_t)ret.fp | ((uint64_t)ret.arg)<<32)
mbedAustin 11:cada08fc8a70 349
mbedAustin 11:cada08fc8a70 350 #define SVC_Setup(f) \
mbedAustin 11:cada08fc8a70 351 __asm( \
mbedAustin 11:cada08fc8a70 352 "mov r12,%0\n" \
mbedAustin 11:cada08fc8a70 353 :: "r"(&f): "r12" \
mbedAustin 11:cada08fc8a70 354 );
mbedAustin 11:cada08fc8a70 355
mbedAustin 11:cada08fc8a70 356 #define SVC_Ret3() \
mbedAustin 11:cada08fc8a70 357 __asm( \
mbedAustin 11:cada08fc8a70 358 "ldr r0,[sp,#0]\n" \
mbedAustin 11:cada08fc8a70 359 "ldr r1,[sp,#4]\n" \
mbedAustin 11:cada08fc8a70 360 "ldr r2,[sp,#8]\n" \
mbedAustin 11:cada08fc8a70 361 );
mbedAustin 11:cada08fc8a70 362
mbedAustin 11:cada08fc8a70 363 #define SVC_0_1(f,t,...) \
mbedAustin 11:cada08fc8a70 364 t f (void); \
mbedAustin 11:cada08fc8a70 365 _Pragma("swi_number=0") __swi t _##f (void); \
mbedAustin 11:cada08fc8a70 366 static inline t __##f (void) { \
mbedAustin 11:cada08fc8a70 367 SVC_Setup(f); \
mbedAustin 11:cada08fc8a70 368 return _##f(); \
mbedAustin 11:cada08fc8a70 369 }
mbedAustin 11:cada08fc8a70 370
mbedAustin 11:cada08fc8a70 371 #define SVC_1_0(f,t,t1,...) \
mbedAustin 11:cada08fc8a70 372 t f (t1 a1); \
mbedAustin 11:cada08fc8a70 373 _Pragma("swi_number=0") __swi t _##f (t1 a1); \
mbedAustin 11:cada08fc8a70 374 static inline t __##f (t1 a1) { \
mbedAustin 11:cada08fc8a70 375 SVC_Setup(f); \
mbedAustin 11:cada08fc8a70 376 _##f(a1); \
mbedAustin 11:cada08fc8a70 377 }
mbedAustin 11:cada08fc8a70 378
mbedAustin 11:cada08fc8a70 379 #define SVC_1_1(f,t,t1,...) \
mbedAustin 11:cada08fc8a70 380 t f (t1 a1); \
mbedAustin 11:cada08fc8a70 381 _Pragma("swi_number=0") __swi t _##f (t1 a1); \
mbedAustin 11:cada08fc8a70 382 static inline t __##f (t1 a1) { \
mbedAustin 11:cada08fc8a70 383 SVC_Setup(f); \
mbedAustin 11:cada08fc8a70 384 return _##f(a1); \
mbedAustin 11:cada08fc8a70 385 }
mbedAustin 11:cada08fc8a70 386
mbedAustin 11:cada08fc8a70 387 #define SVC_2_1(f,t,t1,t2,...) \
mbedAustin 11:cada08fc8a70 388 t f (t1 a1, t2 a2); \
mbedAustin 11:cada08fc8a70 389 _Pragma("swi_number=0") __swi t _##f (t1 a1, t2 a2); \
mbedAustin 11:cada08fc8a70 390 static inline t __##f (t1 a1, t2 a2) { \
mbedAustin 11:cada08fc8a70 391 SVC_Setup(f); \
mbedAustin 11:cada08fc8a70 392 return _##f(a1,a2); \
mbedAustin 11:cada08fc8a70 393 }
mbedAustin 11:cada08fc8a70 394
mbedAustin 11:cada08fc8a70 395 #define SVC_3_1(f,t,t1,t2,t3,...) \
mbedAustin 11:cada08fc8a70 396 t f (t1 a1, t2 a2, t3 a3); \
mbedAustin 11:cada08fc8a70 397 _Pragma("swi_number=0") __swi t _##f (t1 a1, t2 a2, t3 a3); \
mbedAustin 11:cada08fc8a70 398 static inline t __##f (t1 a1, t2 a2, t3 a3) { \
mbedAustin 11:cada08fc8a70 399 SVC_Setup(f); \
mbedAustin 11:cada08fc8a70 400 return _##f(a1,a2,a3); \
mbedAustin 11:cada08fc8a70 401 }
mbedAustin 11:cada08fc8a70 402
mbedAustin 11:cada08fc8a70 403 #define SVC_4_1(f,t,t1,t2,t3,t4,...) \
mbedAustin 11:cada08fc8a70 404 t f (t1 a1, t2 a2, t3 a3, t4 a4); \
mbedAustin 11:cada08fc8a70 405 _Pragma("swi_number=0") __swi t _##f (t1 a1, t2 a2, t3 a3, t4 a4); \
mbedAustin 11:cada08fc8a70 406 static inline t __##f (t1 a1, t2 a2, t3 a3, t4 a4) { \
mbedAustin 11:cada08fc8a70 407 SVC_Setup(f); \
mbedAustin 11:cada08fc8a70 408 return _##f(a1,a2,a3,a4); \
mbedAustin 11:cada08fc8a70 409 }
mbedAustin 11:cada08fc8a70 410
mbedAustin 11:cada08fc8a70 411 #define SVC_1_2(f,t,t1,rr) \
mbedAustin 11:cada08fc8a70 412 uint64_t f (t1 a1); \
mbedAustin 11:cada08fc8a70 413 _Pragma("swi_number=0") __swi uint64_t _##f (t1 a1); \
mbedAustin 11:cada08fc8a70 414 static inline t __##f (t1 a1) { \
mbedAustin 11:cada08fc8a70 415 t ret; \
mbedAustin 11:cada08fc8a70 416 SVC_Setup(f); \
mbedAustin 11:cada08fc8a70 417 _##f(a1); \
mbedAustin 11:cada08fc8a70 418 __asm("" : rr : :); \
mbedAustin 11:cada08fc8a70 419 return ret; \
mbedAustin 11:cada08fc8a70 420 }
mbedAustin 11:cada08fc8a70 421
mbedAustin 11:cada08fc8a70 422 #define SVC_1_3(f,t,t1,rr) \
mbedAustin 11:cada08fc8a70 423 t f (t1 a1); \
mbedAustin 11:cada08fc8a70 424 void f##_ (t1 a1) { \
mbedAustin 11:cada08fc8a70 425 f(a1); \
mbedAustin 11:cada08fc8a70 426 SVC_Ret3(); \
mbedAustin 11:cada08fc8a70 427 } \
mbedAustin 11:cada08fc8a70 428 _Pragma("swi_number=0") __swi void _##f (t1 a1); \
mbedAustin 11:cada08fc8a70 429 static inline t __##f (t1 a1) { \
mbedAustin 11:cada08fc8a70 430 t ret; \
mbedAustin 11:cada08fc8a70 431 SVC_Setup(f##_); \
mbedAustin 11:cada08fc8a70 432 _##f(a1); \
mbedAustin 11:cada08fc8a70 433 __asm("" : rr : :); \
mbedAustin 11:cada08fc8a70 434 return ret; \
mbedAustin 11:cada08fc8a70 435 }
mbedAustin 11:cada08fc8a70 436
mbedAustin 11:cada08fc8a70 437 #define SVC_2_3(f,t,t1,t2,rr) \
mbedAustin 11:cada08fc8a70 438 t f (t1 a1, t2 a2); \
mbedAustin 11:cada08fc8a70 439 void f##_ (t1 a1, t2 a2) { \
mbedAustin 11:cada08fc8a70 440 f(a1,a2); \
mbedAustin 11:cada08fc8a70 441 SVC_Ret3(); \
mbedAustin 11:cada08fc8a70 442 } \
mbedAustin 11:cada08fc8a70 443 _Pragma("swi_number=0") __swi void _##f (t1 a1, t2 a2); \
mbedAustin 11:cada08fc8a70 444 static inline t __##f (t1 a1, t2 a2) { \
mbedAustin 11:cada08fc8a70 445 t ret; \
mbedAustin 11:cada08fc8a70 446 SVC_Setup(f##_); \
mbedAustin 11:cada08fc8a70 447 _##f(a1,a2); \
mbedAustin 11:cada08fc8a70 448 __asm("" : rr : :); \
mbedAustin 11:cada08fc8a70 449 return ret; \
mbedAustin 11:cada08fc8a70 450 }
mbedAustin 11:cada08fc8a70 451
mbedAustin 11:cada08fc8a70 452 #endif
mbedAustin 11:cada08fc8a70 453
mbedAustin 11:cada08fc8a70 454
mbedAustin 11:cada08fc8a70 455 // Callback structure
mbedAustin 11:cada08fc8a70 456 typedef struct {
mbedAustin 11:cada08fc8a70 457 void *fp; // Function pointer
mbedAustin 11:cada08fc8a70 458 void *arg; // Function argument
mbedAustin 11:cada08fc8a70 459 } osCallback;
mbedAustin 11:cada08fc8a70 460
mbedAustin 11:cada08fc8a70 461
mbedAustin 11:cada08fc8a70 462 // OS Section definitions
mbedAustin 11:cada08fc8a70 463 #ifdef OS_SECTIONS_LINK_INFO
mbedAustin 11:cada08fc8a70 464 extern const uint32_t os_section_id$$Base;
mbedAustin 11:cada08fc8a70 465 extern const uint32_t os_section_id$$Limit;
mbedAustin 11:cada08fc8a70 466 #endif
mbedAustin 11:cada08fc8a70 467
mbedAustin 11:cada08fc8a70 468 #ifndef __MBED_CMSIS_RTOS_CA9
mbedAustin 11:cada08fc8a70 469 // OS Stack Memory for Threads definitions
mbedAustin 11:cada08fc8a70 470 extern uint64_t os_stack_mem[];
mbedAustin 11:cada08fc8a70 471 extern const uint32_t os_stack_sz;
mbedAustin 11:cada08fc8a70 472 #endif
mbedAustin 11:cada08fc8a70 473
mbedAustin 11:cada08fc8a70 474 // OS Timers external resources
mbedAustin 11:cada08fc8a70 475 extern const osThreadDef_t os_thread_def_osTimerThread;
mbedAustin 11:cada08fc8a70 476 extern osThreadId osThreadId_osTimerThread;
mbedAustin 11:cada08fc8a70 477 extern const osMessageQDef_t os_messageQ_def_osTimerMessageQ;
mbedAustin 11:cada08fc8a70 478 extern osMessageQId osMessageQId_osTimerMessageQ;
mbedAustin 11:cada08fc8a70 479
mbedAustin 11:cada08fc8a70 480 extern U32 IRQNestLevel; /* Indicates whether inside an ISR, and the depth of nesting. 0 = not in ISR. */
mbedAustin 11:cada08fc8a70 481
mbedAustin 11:cada08fc8a70 482
mbedAustin 11:cada08fc8a70 483 // ==== Helper Functions ====
mbedAustin 11:cada08fc8a70 484
mbedAustin 11:cada08fc8a70 485 /// Convert timeout in millisec to system ticks
mbedAustin 11:cada08fc8a70 486 static uint32_t rt_ms2tick (uint32_t millisec) {
mbedAustin 11:cada08fc8a70 487 uint32_t tick;
mbedAustin 11:cada08fc8a70 488
mbedAustin 11:cada08fc8a70 489 if (millisec == osWaitForever) return 0xFFFF; // Indefinite timeout
mbedAustin 11:cada08fc8a70 490 if (millisec > 4000000) return 0xFFFE; // Max ticks supported
mbedAustin 11:cada08fc8a70 491
mbedAustin 11:cada08fc8a70 492 tick = ((1000 * millisec) + os_clockrate - 1) / os_clockrate;
mbedAustin 11:cada08fc8a70 493 if (tick > 0xFFFE) return 0xFFFE;
mbedAustin 11:cada08fc8a70 494
mbedAustin 11:cada08fc8a70 495 return tick;
mbedAustin 11:cada08fc8a70 496 }
mbedAustin 11:cada08fc8a70 497
mbedAustin 11:cada08fc8a70 498 /// Convert Thread ID to TCB pointer
mbedAustin 11:cada08fc8a70 499 static P_TCB rt_tid2ptcb (osThreadId thread_id) {
mbedAustin 11:cada08fc8a70 500 P_TCB ptcb;
mbedAustin 11:cada08fc8a70 501
mbedAustin 11:cada08fc8a70 502 if (thread_id == NULL) return NULL;
mbedAustin 11:cada08fc8a70 503
mbedAustin 11:cada08fc8a70 504 if ((uint32_t)thread_id & 3) return NULL;
mbedAustin 11:cada08fc8a70 505
mbedAustin 11:cada08fc8a70 506 #ifdef OS_SECTIONS_LINK_INFO
mbedAustin 11:cada08fc8a70 507 if ((os_section_id$$Base != 0) && (os_section_id$$Limit != 0)) {
mbedAustin 11:cada08fc8a70 508 if (thread_id < (osThreadId)os_section_id$$Base) return NULL;
mbedAustin 11:cada08fc8a70 509 if (thread_id >= (osThreadId)os_section_id$$Limit) return NULL;
mbedAustin 11:cada08fc8a70 510 }
mbedAustin 11:cada08fc8a70 511 #endif
mbedAustin 11:cada08fc8a70 512
mbedAustin 11:cada08fc8a70 513 ptcb = thread_id;
mbedAustin 11:cada08fc8a70 514
mbedAustin 11:cada08fc8a70 515 if (ptcb->cb_type != TCB) return NULL;
mbedAustin 11:cada08fc8a70 516
mbedAustin 11:cada08fc8a70 517 return ptcb;
mbedAustin 11:cada08fc8a70 518 }
mbedAustin 11:cada08fc8a70 519
mbedAustin 11:cada08fc8a70 520 /// Convert ID pointer to Object pointer
mbedAustin 11:cada08fc8a70 521 static void *rt_id2obj (void *id) {
mbedAustin 11:cada08fc8a70 522
mbedAustin 11:cada08fc8a70 523 if ((uint32_t)id & 3) return NULL;
mbedAustin 11:cada08fc8a70 524
mbedAustin 11:cada08fc8a70 525 #ifdef OS_SECTIONS_LINK_INFO
mbedAustin 11:cada08fc8a70 526 if ((os_section_id$$Base != 0) && (os_section_id$$Limit != 0)) {
mbedAustin 11:cada08fc8a70 527 if (id < (void *)os_section_id$$Base) return NULL;
mbedAustin 11:cada08fc8a70 528 if (id >= (void *)os_section_id$$Limit) return NULL;
mbedAustin 11:cada08fc8a70 529 }
mbedAustin 11:cada08fc8a70 530 #endif
mbedAustin 11:cada08fc8a70 531
mbedAustin 11:cada08fc8a70 532 return id;
mbedAustin 11:cada08fc8a70 533 }
mbedAustin 11:cada08fc8a70 534
mbedAustin 11:cada08fc8a70 535 // === Helper functions for system call interface ===
mbedAustin 11:cada08fc8a70 536
mbedAustin 11:cada08fc8a70 537 static __inline char __get_mode(void) {
mbedAustin 11:cada08fc8a70 538 return (char)(__get_CPSR() & 0x1f);
mbedAustin 11:cada08fc8a70 539 }
mbedAustin 11:cada08fc8a70 540
mbedAustin 11:cada08fc8a70 541 static __inline char __exceptional_mode(void) {
mbedAustin 11:cada08fc8a70 542 switch(__get_mode()) {
mbedAustin 11:cada08fc8a70 543 case MODE_USR:
mbedAustin 11:cada08fc8a70 544 case MODE_SYS:
mbedAustin 11:cada08fc8a70 545 return 0;
mbedAustin 11:cada08fc8a70 546 case MODE_SVC:
mbedAustin 11:cada08fc8a70 547 if (IRQNestLevel == 0)
mbedAustin 11:cada08fc8a70 548 return 0; /* handling a regular service call */
mbedAustin 11:cada08fc8a70 549 else
mbedAustin 11:cada08fc8a70 550 return 1; /* handling an ISR in SVC mode */
mbedAustin 11:cada08fc8a70 551 default:
mbedAustin 11:cada08fc8a70 552 return 1;
mbedAustin 11:cada08fc8a70 553 }
mbedAustin 11:cada08fc8a70 554 }
mbedAustin 11:cada08fc8a70 555
mbedAustin 11:cada08fc8a70 556 // ==== Kernel Control ====
mbedAustin 11:cada08fc8a70 557
mbedAustin 11:cada08fc8a70 558 uint8_t os_initialized; // Kernel Initialized flag
mbedAustin 11:cada08fc8a70 559 uint8_t os_running; // Kernel Running flag
mbedAustin 11:cada08fc8a70 560
mbedAustin 11:cada08fc8a70 561 // Kernel Control Service Calls declarations
mbedAustin 11:cada08fc8a70 562 SVC_0_1(svcKernelInitialize, osStatus, RET_osStatus)
mbedAustin 11:cada08fc8a70 563 SVC_0_1(svcKernelStart, osStatus, RET_osStatus)
mbedAustin 11:cada08fc8a70 564 SVC_0_1(svcKernelRunning, int32_t, RET_int32_t)
mbedAustin 11:cada08fc8a70 565 SVC_0_1(svcKernelSysTick, uint32_t, RET_uint32_t)
mbedAustin 11:cada08fc8a70 566
mbedAustin 11:cada08fc8a70 567 static void sysThreadError (osStatus status);
mbedAustin 11:cada08fc8a70 568 osThreadId svcThreadCreate (const osThreadDef_t *thread_def, void *argument);
mbedAustin 11:cada08fc8a70 569 osMessageQId svcMessageCreate (const osMessageQDef_t *queue_def, osThreadId thread_id);
mbedAustin 11:cada08fc8a70 570
mbedAustin 11:cada08fc8a70 571 // Kernel Control Service Calls
mbedAustin 11:cada08fc8a70 572
mbedAustin 11:cada08fc8a70 573 /// Initialize the RTOS Kernel for creating objects
mbedAustin 11:cada08fc8a70 574 osStatus svcKernelInitialize (void) {
mbedAustin 11:cada08fc8a70 575 #ifdef __MBED_CMSIS_RTOS_CA9
mbedAustin 11:cada08fc8a70 576 if (!os_initialized) {
mbedAustin 11:cada08fc8a70 577 rt_sys_init(); // RTX System Initialization
mbedAustin 11:cada08fc8a70 578 }
mbedAustin 11:cada08fc8a70 579 #else
mbedAustin 11:cada08fc8a70 580 int ret;
mbedAustin 11:cada08fc8a70 581
mbedAustin 11:cada08fc8a70 582 if (!os_initialized) {
mbedAustin 11:cada08fc8a70 583
mbedAustin 11:cada08fc8a70 584 // Init Thread Stack Memory (must be 8-byte aligned)
mbedAustin 11:cada08fc8a70 585 if ((uint32_t)os_stack_mem & 7) return osErrorNoMemory;
mbedAustin 11:cada08fc8a70 586 ret = rt_init_mem(os_stack_mem, os_stack_sz);
mbedAustin 11:cada08fc8a70 587 if (ret != 0) return osErrorNoMemory;
mbedAustin 11:cada08fc8a70 588
mbedAustin 11:cada08fc8a70 589 rt_sys_init(); // RTX System Initialization
mbedAustin 11:cada08fc8a70 590 }
mbedAustin 11:cada08fc8a70 591 #endif
mbedAustin 11:cada08fc8a70 592
mbedAustin 11:cada08fc8a70 593 os_tsk.run->prio = 255; // Highest priority
mbedAustin 11:cada08fc8a70 594
mbedAustin 11:cada08fc8a70 595 if (!os_initialized) {
mbedAustin 11:cada08fc8a70 596 // Create OS Timers resources (Message Queue & Thread)
mbedAustin 11:cada08fc8a70 597 osMessageQId_osTimerMessageQ = svcMessageCreate (&os_messageQ_def_osTimerMessageQ, NULL);
mbedAustin 11:cada08fc8a70 598 osThreadId_osTimerThread = svcThreadCreate(&os_thread_def_osTimerThread, NULL);
mbedAustin 11:cada08fc8a70 599 }
mbedAustin 11:cada08fc8a70 600
mbedAustin 11:cada08fc8a70 601 sysThreadError(osOK);
mbedAustin 11:cada08fc8a70 602
mbedAustin 11:cada08fc8a70 603 os_initialized = 1;
mbedAustin 11:cada08fc8a70 604 os_running = 0;
mbedAustin 11:cada08fc8a70 605
mbedAustin 11:cada08fc8a70 606 return osOK;
mbedAustin 11:cada08fc8a70 607 }
mbedAustin 11:cada08fc8a70 608
mbedAustin 11:cada08fc8a70 609 /// Start the RTOS Kernel
mbedAustin 11:cada08fc8a70 610 osStatus svcKernelStart (void) {
mbedAustin 11:cada08fc8a70 611
mbedAustin 11:cada08fc8a70 612 if (os_running) return osOK;
mbedAustin 11:cada08fc8a70 613
mbedAustin 11:cada08fc8a70 614 rt_tsk_prio(0, os_tsk.run->prio_base); // Restore priority
mbedAustin 11:cada08fc8a70 615 if (os_tsk.run->task_id == 0xFF) { // Idle Thread
mbedAustin 11:cada08fc8a70 616 __set_PSP(os_tsk.run->tsk_stack + 8*4); // Setup PSP
mbedAustin 11:cada08fc8a70 617 }
mbedAustin 11:cada08fc8a70 618 os_tsk.run = NULL; // Force context switch
mbedAustin 11:cada08fc8a70 619
mbedAustin 11:cada08fc8a70 620 rt_sys_start();
mbedAustin 11:cada08fc8a70 621
mbedAustin 11:cada08fc8a70 622 os_running = 1;
mbedAustin 11:cada08fc8a70 623
mbedAustin 11:cada08fc8a70 624 return osOK;
mbedAustin 11:cada08fc8a70 625 }
mbedAustin 11:cada08fc8a70 626
mbedAustin 11:cada08fc8a70 627 /// Check if the RTOS kernel is already started
mbedAustin 11:cada08fc8a70 628 int32_t svcKernelRunning(void) {
mbedAustin 11:cada08fc8a70 629 return os_running;
mbedAustin 11:cada08fc8a70 630 }
mbedAustin 11:cada08fc8a70 631
mbedAustin 11:cada08fc8a70 632 /// Get the RTOS kernel system timer counter
mbedAustin 11:cada08fc8a70 633 uint32_t svcKernelSysTick (void) {
mbedAustin 11:cada08fc8a70 634 uint32_t tick, tick0;
mbedAustin 11:cada08fc8a70 635
mbedAustin 11:cada08fc8a70 636 tick = os_tick_val();
mbedAustin 11:cada08fc8a70 637 if (os_tick_ovf()) {
mbedAustin 11:cada08fc8a70 638 tick0 = os_tick_val();
mbedAustin 11:cada08fc8a70 639 if (tick0 < tick) tick = tick0;
mbedAustin 11:cada08fc8a70 640 tick += (os_trv + 1) * (os_time + 1);
mbedAustin 11:cada08fc8a70 641 } else {
mbedAustin 11:cada08fc8a70 642 tick += (os_trv + 1) * os_time;
mbedAustin 11:cada08fc8a70 643 }
mbedAustin 11:cada08fc8a70 644
mbedAustin 11:cada08fc8a70 645 return tick;
mbedAustin 11:cada08fc8a70 646 }
mbedAustin 11:cada08fc8a70 647
mbedAustin 11:cada08fc8a70 648 // Kernel Control Public API
mbedAustin 11:cada08fc8a70 649
mbedAustin 11:cada08fc8a70 650 /// Initialize the RTOS Kernel for creating objects
mbedAustin 11:cada08fc8a70 651 osStatus osKernelInitialize (void) {
mbedAustin 11:cada08fc8a70 652 if (__exceptional_mode()) return osErrorISR; // Not allowed in ISR
mbedAustin 11:cada08fc8a70 653 if (__get_mode() != MODE_USR) {
mbedAustin 11:cada08fc8a70 654 return svcKernelInitialize();
mbedAustin 11:cada08fc8a70 655 } else {
mbedAustin 11:cada08fc8a70 656 return __svcKernelInitialize();
mbedAustin 11:cada08fc8a70 657 }
mbedAustin 11:cada08fc8a70 658 }
mbedAustin 11:cada08fc8a70 659
mbedAustin 11:cada08fc8a70 660 /// Start the RTOS Kernel
mbedAustin 11:cada08fc8a70 661 osStatus osKernelStart (void) {
mbedAustin 11:cada08fc8a70 662 char mode = __get_mode();
mbedAustin 11:cada08fc8a70 663
mbedAustin 11:cada08fc8a70 664 switch(mode) {
mbedAustin 11:cada08fc8a70 665 case MODE_USR:
mbedAustin 11:cada08fc8a70 666 if (os_flags & 1) return osErrorOS; // Privileged Thread mode requested from Unprivileged
mbedAustin 11:cada08fc8a70 667 break;
mbedAustin 11:cada08fc8a70 668 case MODE_SYS:
mbedAustin 11:cada08fc8a70 669 if (!(os_flags & 1)) {
mbedAustin 11:cada08fc8a70 670 __set_CPS_USR();
mbedAustin 11:cada08fc8a70 671 }
mbedAustin 11:cada08fc8a70 672 break;
mbedAustin 11:cada08fc8a70 673 default:
mbedAustin 11:cada08fc8a70 674 return osErrorISR; // Not allowed in ISR
mbedAustin 11:cada08fc8a70 675 }
mbedAustin 11:cada08fc8a70 676 return __svcKernelStart();
mbedAustin 11:cada08fc8a70 677 }
mbedAustin 11:cada08fc8a70 678
mbedAustin 11:cada08fc8a70 679 /// Check if the RTOS kernel is already started
mbedAustin 11:cada08fc8a70 680 int32_t osKernelRunning(void) {
mbedAustin 11:cada08fc8a70 681 if(__get_mode() != MODE_USR) {
mbedAustin 11:cada08fc8a70 682 return os_running;
mbedAustin 11:cada08fc8a70 683 } else {
mbedAustin 11:cada08fc8a70 684 return __svcKernelRunning();
mbedAustin 11:cada08fc8a70 685 }
mbedAustin 11:cada08fc8a70 686 }
mbedAustin 11:cada08fc8a70 687
mbedAustin 11:cada08fc8a70 688 /// Get the RTOS kernel system timer counter
mbedAustin 11:cada08fc8a70 689 uint32_t osKernelSysTick (void) {
mbedAustin 11:cada08fc8a70 690 if (__exceptional_mode()) return 0; // Not allowed in ISR
mbedAustin 11:cada08fc8a70 691 return __svcKernelSysTick();
mbedAustin 11:cada08fc8a70 692 }
mbedAustin 11:cada08fc8a70 693
mbedAustin 11:cada08fc8a70 694
mbedAustin 11:cada08fc8a70 695 // ==== Thread Management ====
mbedAustin 11:cada08fc8a70 696
mbedAustin 11:cada08fc8a70 697 /// Set Thread Error (for Create functions which return IDs)
mbedAustin 11:cada08fc8a70 698 static void sysThreadError (osStatus status) {
mbedAustin 11:cada08fc8a70 699 // To Do
mbedAustin 11:cada08fc8a70 700 }
mbedAustin 11:cada08fc8a70 701
mbedAustin 11:cada08fc8a70 702 __NO_RETURN void osThreadExit (void);
mbedAustin 11:cada08fc8a70 703
mbedAustin 11:cada08fc8a70 704 // Thread Service Calls declarations
mbedAustin 11:cada08fc8a70 705 SVC_2_1(svcThreadCreate, osThreadId, const osThreadDef_t *, void *, RET_pointer)
mbedAustin 11:cada08fc8a70 706 SVC_0_1(svcThreadGetId, osThreadId, RET_pointer)
mbedAustin 11:cada08fc8a70 707 SVC_1_1(svcThreadTerminate, osStatus, osThreadId, RET_osStatus)
mbedAustin 11:cada08fc8a70 708 SVC_0_1(svcThreadYield, osStatus, RET_osStatus)
mbedAustin 11:cada08fc8a70 709 SVC_2_1(svcThreadSetPriority, osStatus, osThreadId, osPriority, RET_osStatus)
mbedAustin 11:cada08fc8a70 710 SVC_1_1(svcThreadGetPriority, osPriority, osThreadId, RET_osPriority)
mbedAustin 11:cada08fc8a70 711
mbedAustin 11:cada08fc8a70 712 // Thread Service Calls
mbedAustin 11:cada08fc8a70 713
mbedAustin 11:cada08fc8a70 714 /// Create a thread and add it to Active Threads and set it to state READY
mbedAustin 11:cada08fc8a70 715 osThreadId svcThreadCreate (const osThreadDef_t *thread_def, void *argument) {
mbedAustin 11:cada08fc8a70 716 P_TCB ptcb;
mbedAustin 11:cada08fc8a70 717 OS_TID tsk;
mbedAustin 11:cada08fc8a70 718 void *stk;
mbedAustin 11:cada08fc8a70 719
mbedAustin 11:cada08fc8a70 720 if ((thread_def == NULL) ||
mbedAustin 11:cada08fc8a70 721 (thread_def->pthread == NULL) ||
mbedAustin 11:cada08fc8a70 722 (thread_def->tpriority < osPriorityIdle) ||
mbedAustin 11:cada08fc8a70 723 (thread_def->tpriority > osPriorityRealtime)) {
mbedAustin 11:cada08fc8a70 724 sysThreadError(osErrorParameter);
mbedAustin 11:cada08fc8a70 725 return NULL;
mbedAustin 11:cada08fc8a70 726 }
mbedAustin 11:cada08fc8a70 727
mbedAustin 11:cada08fc8a70 728 #ifdef __MBED_CMSIS_RTOS_CA9
mbedAustin 11:cada08fc8a70 729 if (thread_def->stacksize != 0) { // Custom stack size
mbedAustin 11:cada08fc8a70 730 stk = (void *)thread_def->stack_pointer;
mbedAustin 11:cada08fc8a70 731 } else { // Default stack size
mbedAustin 11:cada08fc8a70 732 stk = NULL;
mbedAustin 11:cada08fc8a70 733 }
mbedAustin 11:cada08fc8a70 734 #else
mbedAustin 11:cada08fc8a70 735 if (thread_def->stacksize != 0) { // Custom stack size
mbedAustin 11:cada08fc8a70 736 stk = rt_alloc_mem( // Allocate stack
mbedAustin 11:cada08fc8a70 737 os_stack_mem,
mbedAustin 11:cada08fc8a70 738 thread_def->stacksize
mbedAustin 11:cada08fc8a70 739 );
mbedAustin 11:cada08fc8a70 740 if (stk == NULL) {
mbedAustin 11:cada08fc8a70 741 sysThreadError(osErrorNoMemory); // Out of memory
mbedAustin 11:cada08fc8a70 742 return NULL;
mbedAustin 11:cada08fc8a70 743 }
mbedAustin 11:cada08fc8a70 744 } else { // Default stack size
mbedAustin 11:cada08fc8a70 745 stk = NULL;
mbedAustin 11:cada08fc8a70 746 }
mbedAustin 11:cada08fc8a70 747 #endif
mbedAustin 11:cada08fc8a70 748
mbedAustin 11:cada08fc8a70 749 tsk = rt_tsk_create( // Create task
mbedAustin 11:cada08fc8a70 750 (FUNCP)thread_def->pthread, // Task function pointer
mbedAustin 11:cada08fc8a70 751 (thread_def->tpriority-osPriorityIdle+1) | // Task priority
mbedAustin 11:cada08fc8a70 752 (thread_def->stacksize << 8), // Task stack size in bytes
mbedAustin 11:cada08fc8a70 753 stk, // Pointer to task's stack
mbedAustin 11:cada08fc8a70 754 argument // Argument to the task
mbedAustin 11:cada08fc8a70 755 );
mbedAustin 11:cada08fc8a70 756
mbedAustin 11:cada08fc8a70 757 if (tsk == 0) { // Invalid task ID
mbedAustin 11:cada08fc8a70 758 #ifndef __MBED_CMSIS_RTOS_CA9
mbedAustin 11:cada08fc8a70 759 if (stk != NULL) {
mbedAustin 11:cada08fc8a70 760 rt_free_mem(os_stack_mem, stk); // Free allocated stack
mbedAustin 11:cada08fc8a70 761 }
mbedAustin 11:cada08fc8a70 762 #endif
mbedAustin 11:cada08fc8a70 763 sysThreadError(osErrorNoMemory); // Create task failed (Out of memory)
mbedAustin 11:cada08fc8a70 764 return NULL;
mbedAustin 11:cada08fc8a70 765 }
mbedAustin 11:cada08fc8a70 766
mbedAustin 11:cada08fc8a70 767 ptcb = (P_TCB)os_active_TCB[tsk - 1]; // TCB pointer
mbedAustin 11:cada08fc8a70 768
mbedAustin 11:cada08fc8a70 769 *((uint32_t *)ptcb->tsk_stack + 13) = (uint32_t)osThreadExit;
mbedAustin 11:cada08fc8a70 770
mbedAustin 11:cada08fc8a70 771 return ptcb;
mbedAustin 11:cada08fc8a70 772 }
mbedAustin 11:cada08fc8a70 773
mbedAustin 11:cada08fc8a70 774 /// Return the thread ID of the current running thread
mbedAustin 11:cada08fc8a70 775 osThreadId svcThreadGetId (void) {
mbedAustin 11:cada08fc8a70 776 OS_TID tsk;
mbedAustin 11:cada08fc8a70 777
mbedAustin 11:cada08fc8a70 778 tsk = rt_tsk_self();
mbedAustin 11:cada08fc8a70 779 if (tsk == 0) return NULL;
mbedAustin 11:cada08fc8a70 780 return (P_TCB)os_active_TCB[tsk - 1];
mbedAustin 11:cada08fc8a70 781 }
mbedAustin 11:cada08fc8a70 782
mbedAustin 11:cada08fc8a70 783 /// Terminate execution of a thread and remove it from ActiveThreads
mbedAustin 11:cada08fc8a70 784 osStatus svcThreadTerminate (osThreadId thread_id) {
mbedAustin 11:cada08fc8a70 785 OS_RESULT res;
mbedAustin 11:cada08fc8a70 786 P_TCB ptcb;
mbedAustin 11:cada08fc8a70 787 #ifndef __MBED_CMSIS_RTOS_CA9
mbedAustin 11:cada08fc8a70 788 void *stk;
mbedAustin 11:cada08fc8a70 789 #endif
mbedAustin 11:cada08fc8a70 790
mbedAustin 11:cada08fc8a70 791 ptcb = rt_tid2ptcb(thread_id); // Get TCB pointer
mbedAustin 11:cada08fc8a70 792 if (ptcb == NULL) return osErrorParameter;
mbedAustin 11:cada08fc8a70 793
mbedAustin 11:cada08fc8a70 794 #ifndef __MBED_CMSIS_RTOS_CA9
mbedAustin 11:cada08fc8a70 795 stk = ptcb->priv_stack ? ptcb->stack : NULL; // Private stack
mbedAustin 11:cada08fc8a70 796 #endif
mbedAustin 11:cada08fc8a70 797
mbedAustin 11:cada08fc8a70 798 res = rt_tsk_delete(ptcb->task_id); // Delete task
mbedAustin 11:cada08fc8a70 799
mbedAustin 11:cada08fc8a70 800 if (res == OS_R_NOK) return osErrorResource; // Delete task failed
mbedAustin 11:cada08fc8a70 801
mbedAustin 11:cada08fc8a70 802 #ifndef __MBED_CMSIS_RTOS_CA9
mbedAustin 11:cada08fc8a70 803 if (stk != NULL) {
mbedAustin 11:cada08fc8a70 804 rt_free_mem(os_stack_mem, stk); // Free private stack
mbedAustin 11:cada08fc8a70 805 }
mbedAustin 11:cada08fc8a70 806 #endif
mbedAustin 11:cada08fc8a70 807
mbedAustin 11:cada08fc8a70 808 return osOK;
mbedAustin 11:cada08fc8a70 809 }
mbedAustin 11:cada08fc8a70 810
mbedAustin 11:cada08fc8a70 811 /// Pass control to next thread that is in state READY
mbedAustin 11:cada08fc8a70 812 osStatus svcThreadYield (void) {
mbedAustin 11:cada08fc8a70 813 rt_tsk_pass(); // Pass control to next task
mbedAustin 11:cada08fc8a70 814 return osOK;
mbedAustin 11:cada08fc8a70 815 }
mbedAustin 11:cada08fc8a70 816
mbedAustin 11:cada08fc8a70 817 /// Change priority of an active thread
mbedAustin 11:cada08fc8a70 818 osStatus svcThreadSetPriority (osThreadId thread_id, osPriority priority) {
mbedAustin 11:cada08fc8a70 819 OS_RESULT res;
mbedAustin 11:cada08fc8a70 820 P_TCB ptcb;
mbedAustin 11:cada08fc8a70 821
mbedAustin 11:cada08fc8a70 822 ptcb = rt_tid2ptcb(thread_id); // Get TCB pointer
mbedAustin 11:cada08fc8a70 823 if (ptcb == NULL) return osErrorParameter;
mbedAustin 11:cada08fc8a70 824
mbedAustin 11:cada08fc8a70 825 if ((priority < osPriorityIdle) || (priority > osPriorityRealtime)) {
mbedAustin 11:cada08fc8a70 826 return osErrorValue;
mbedAustin 11:cada08fc8a70 827 }
mbedAustin 11:cada08fc8a70 828
mbedAustin 11:cada08fc8a70 829 res = rt_tsk_prio( // Change task priority
mbedAustin 11:cada08fc8a70 830 ptcb->task_id, // Task ID
mbedAustin 11:cada08fc8a70 831 priority - osPriorityIdle + 1 // New task priority
mbedAustin 11:cada08fc8a70 832 );
mbedAustin 11:cada08fc8a70 833
mbedAustin 11:cada08fc8a70 834 if (res == OS_R_NOK) return osErrorResource; // Change task priority failed
mbedAustin 11:cada08fc8a70 835
mbedAustin 11:cada08fc8a70 836 return osOK;
mbedAustin 11:cada08fc8a70 837 }
mbedAustin 11:cada08fc8a70 838
mbedAustin 11:cada08fc8a70 839 /// Get current priority of an active thread
mbedAustin 11:cada08fc8a70 840 osPriority svcThreadGetPriority (osThreadId thread_id) {
mbedAustin 11:cada08fc8a70 841 P_TCB ptcb;
mbedAustin 11:cada08fc8a70 842
mbedAustin 11:cada08fc8a70 843 ptcb = rt_tid2ptcb(thread_id); // Get TCB pointer
mbedAustin 11:cada08fc8a70 844 if (ptcb == NULL) return osPriorityError;
mbedAustin 11:cada08fc8a70 845
mbedAustin 11:cada08fc8a70 846 return (osPriority)(ptcb->prio - 1 + osPriorityIdle);
mbedAustin 11:cada08fc8a70 847 }
mbedAustin 11:cada08fc8a70 848
mbedAustin 11:cada08fc8a70 849
mbedAustin 11:cada08fc8a70 850 // Thread Public API
mbedAustin 11:cada08fc8a70 851
mbedAustin 11:cada08fc8a70 852 /// Create a thread and add it to Active Threads and set it to state READY
mbedAustin 11:cada08fc8a70 853 osThreadId osThreadCreate (const osThreadDef_t *thread_def, void *argument) {
mbedAustin 11:cada08fc8a70 854 if (__exceptional_mode()) return NULL; // Not allowed in ISR
mbedAustin 11:cada08fc8a70 855 if ((__get_mode() != MODE_USR) && (os_running == 0)) {
mbedAustin 11:cada08fc8a70 856 // Privileged and not running
mbedAustin 11:cada08fc8a70 857 return svcThreadCreate(thread_def, argument);
mbedAustin 11:cada08fc8a70 858 } else {
mbedAustin 11:cada08fc8a70 859 return __svcThreadCreate(thread_def, argument);
mbedAustin 11:cada08fc8a70 860 }
mbedAustin 11:cada08fc8a70 861 }
mbedAustin 11:cada08fc8a70 862
mbedAustin 11:cada08fc8a70 863 /// Return the thread ID of the current running thread
mbedAustin 11:cada08fc8a70 864 osThreadId osThreadGetId (void) {
mbedAustin 11:cada08fc8a70 865 if (__exceptional_mode()) return NULL; // Not allowed in ISR
mbedAustin 11:cada08fc8a70 866 return __svcThreadGetId();
mbedAustin 11:cada08fc8a70 867 }
mbedAustin 11:cada08fc8a70 868
mbedAustin 11:cada08fc8a70 869 /// Terminate execution of a thread and remove it from ActiveThreads
mbedAustin 11:cada08fc8a70 870 osStatus osThreadTerminate (osThreadId thread_id) {
mbedAustin 11:cada08fc8a70 871 if (__exceptional_mode()) return osErrorISR; // Not allowed in ISR
mbedAustin 11:cada08fc8a70 872 return __svcThreadTerminate(thread_id);
mbedAustin 11:cada08fc8a70 873 }
mbedAustin 11:cada08fc8a70 874
mbedAustin 11:cada08fc8a70 875 /// Pass control to next thread that is in state READY
mbedAustin 11:cada08fc8a70 876 osStatus osThreadYield (void) {
mbedAustin 11:cada08fc8a70 877 if (__exceptional_mode()) return osErrorISR; // Not allowed in ISR
mbedAustin 11:cada08fc8a70 878 return __svcThreadYield();
mbedAustin 11:cada08fc8a70 879 }
mbedAustin 11:cada08fc8a70 880
mbedAustin 11:cada08fc8a70 881 /// Change priority of an active thread
mbedAustin 11:cada08fc8a70 882 osStatus osThreadSetPriority (osThreadId thread_id, osPriority priority) {
mbedAustin 11:cada08fc8a70 883 if (__exceptional_mode()) return osErrorISR; // Not allowed in ISR
mbedAustin 11:cada08fc8a70 884 return __svcThreadSetPriority(thread_id, priority);
mbedAustin 11:cada08fc8a70 885 }
mbedAustin 11:cada08fc8a70 886
mbedAustin 11:cada08fc8a70 887 /// Get current priority of an active thread
mbedAustin 11:cada08fc8a70 888 osPriority osThreadGetPriority (osThreadId thread_id) {
mbedAustin 11:cada08fc8a70 889 if (__exceptional_mode()) return osPriorityError;// Not allowed in ISR
mbedAustin 11:cada08fc8a70 890 return __svcThreadGetPriority(thread_id);
mbedAustin 11:cada08fc8a70 891 }
mbedAustin 11:cada08fc8a70 892
mbedAustin 11:cada08fc8a70 893 /// INTERNAL - Not Public
mbedAustin 11:cada08fc8a70 894 /// Auto Terminate Thread on exit (used implicitly when thread exists)
mbedAustin 11:cada08fc8a70 895 __NO_RETURN void osThreadExit (void) {
mbedAustin 11:cada08fc8a70 896 __svcThreadTerminate(__svcThreadGetId());
mbedAustin 11:cada08fc8a70 897 for (;;); // Should never come here
mbedAustin 11:cada08fc8a70 898 }
mbedAustin 11:cada08fc8a70 899
mbedAustin 11:cada08fc8a70 900 #ifdef __MBED_CMSIS_RTOS_CA9
mbedAustin 11:cada08fc8a70 901 /// Get current thread state
mbedAustin 11:cada08fc8a70 902 uint8_t osThreadGetState (osThreadId thread_id) {
mbedAustin 11:cada08fc8a70 903 P_TCB ptcb;
mbedAustin 11:cada08fc8a70 904
mbedAustin 11:cada08fc8a70 905 if (__exceptional_mode()) return osErrorISR; // Not allowed in ISR
mbedAustin 11:cada08fc8a70 906
mbedAustin 11:cada08fc8a70 907 ptcb = rt_tid2ptcb(thread_id); // Get TCB pointer
mbedAustin 11:cada08fc8a70 908 if (ptcb == NULL) return osErrorParameter;
mbedAustin 11:cada08fc8a70 909
mbedAustin 11:cada08fc8a70 910 return ptcb->state;
mbedAustin 11:cada08fc8a70 911 }
mbedAustin 11:cada08fc8a70 912 #endif
mbedAustin 11:cada08fc8a70 913
mbedAustin 11:cada08fc8a70 914 // ==== Generic Wait Functions ====
mbedAustin 11:cada08fc8a70 915
mbedAustin 11:cada08fc8a70 916 // Generic Wait Service Calls declarations
mbedAustin 11:cada08fc8a70 917 SVC_1_1(svcDelay, osStatus, uint32_t, RET_osStatus)
mbedAustin 11:cada08fc8a70 918 #if osFeature_Wait != 0
mbedAustin 11:cada08fc8a70 919 SVC_1_3(svcWait, os_InRegs osEvent, uint32_t, RET_osEvent)
mbedAustin 11:cada08fc8a70 920 #endif
mbedAustin 11:cada08fc8a70 921
mbedAustin 11:cada08fc8a70 922 // Generic Wait Service Calls
mbedAustin 11:cada08fc8a70 923
mbedAustin 11:cada08fc8a70 924 /// Wait for Timeout (Time Delay)
mbedAustin 11:cada08fc8a70 925 osStatus svcDelay (uint32_t millisec) {
mbedAustin 11:cada08fc8a70 926 if (millisec == 0) return osOK;
mbedAustin 11:cada08fc8a70 927 rt_dly_wait(rt_ms2tick(millisec));
mbedAustin 11:cada08fc8a70 928 return osEventTimeout;
mbedAustin 11:cada08fc8a70 929 }
mbedAustin 11:cada08fc8a70 930
mbedAustin 11:cada08fc8a70 931 /// Wait for Signal, Message, Mail, or Timeout
mbedAustin 11:cada08fc8a70 932 #if osFeature_Wait != 0
mbedAustin 11:cada08fc8a70 933 os_InRegs osEvent_type svcWait (uint32_t millisec) {
mbedAustin 11:cada08fc8a70 934 osEvent ret;
mbedAustin 11:cada08fc8a70 935
mbedAustin 11:cada08fc8a70 936 if (millisec == 0) {
mbedAustin 11:cada08fc8a70 937 ret.status = osOK;
mbedAustin 11:cada08fc8a70 938 #if defined (__GNUC__) && defined (__ARM_PCS_VFP)
mbedAustin 11:cada08fc8a70 939 osEvent_ret_status;
mbedAustin 11:cada08fc8a70 940 return;
mbedAustin 11:cada08fc8a70 941 #else
mbedAustin 11:cada08fc8a70 942 return osEvent_ret_status;
mbedAustin 11:cada08fc8a70 943 #endif
mbedAustin 11:cada08fc8a70 944 }
mbedAustin 11:cada08fc8a70 945
mbedAustin 11:cada08fc8a70 946 /* To Do: osEventSignal, osEventMessage, osEventMail */
mbedAustin 11:cada08fc8a70 947 rt_dly_wait(rt_ms2tick(millisec));
mbedAustin 11:cada08fc8a70 948 ret.status = osEventTimeout;
mbedAustin 11:cada08fc8a70 949
mbedAustin 11:cada08fc8a70 950 #if defined (__GNUC__) && defined (__ARM_PCS_VFP)
mbedAustin 11:cada08fc8a70 951 osEvent_ret_status;
mbedAustin 11:cada08fc8a70 952 return;
mbedAustin 11:cada08fc8a70 953 #else
mbedAustin 11:cada08fc8a70 954 return osEvent_ret_status;
mbedAustin 11:cada08fc8a70 955 #endif
mbedAustin 11:cada08fc8a70 956 }
mbedAustin 11:cada08fc8a70 957 #endif
mbedAustin 11:cada08fc8a70 958
mbedAustin 11:cada08fc8a70 959
mbedAustin 11:cada08fc8a70 960 // Generic Wait API
mbedAustin 11:cada08fc8a70 961
mbedAustin 11:cada08fc8a70 962 /// Wait for Timeout (Time Delay)
mbedAustin 11:cada08fc8a70 963 osStatus osDelay (uint32_t millisec) {
mbedAustin 11:cada08fc8a70 964 if (__exceptional_mode()) return osErrorISR; // Not allowed in ISR
mbedAustin 11:cada08fc8a70 965 return __svcDelay(millisec);
mbedAustin 11:cada08fc8a70 966 }
mbedAustin 11:cada08fc8a70 967
mbedAustin 11:cada08fc8a70 968 /// Wait for Signal, Message, Mail, or Timeout
mbedAustin 11:cada08fc8a70 969 os_InRegs osEvent osWait (uint32_t millisec) {
mbedAustin 11:cada08fc8a70 970 osEvent ret;
mbedAustin 11:cada08fc8a70 971
mbedAustin 11:cada08fc8a70 972 #if osFeature_Wait == 0
mbedAustin 11:cada08fc8a70 973 ret.status = osErrorOS;
mbedAustin 11:cada08fc8a70 974 return ret;
mbedAustin 11:cada08fc8a70 975 #else
mbedAustin 11:cada08fc8a70 976 if (__exceptional_mode()) { // Not allowed in ISR
mbedAustin 11:cada08fc8a70 977 ret.status = osErrorISR;
mbedAustin 11:cada08fc8a70 978 return ret;
mbedAustin 11:cada08fc8a70 979 }
mbedAustin 11:cada08fc8a70 980 return __svcWait(millisec);
mbedAustin 11:cada08fc8a70 981 #endif
mbedAustin 11:cada08fc8a70 982 }
mbedAustin 11:cada08fc8a70 983
mbedAustin 11:cada08fc8a70 984
mbedAustin 11:cada08fc8a70 985 // ==== Timer Management ====
mbedAustin 11:cada08fc8a70 986
mbedAustin 11:cada08fc8a70 987 // Timer definitions
mbedAustin 11:cada08fc8a70 988 #define osTimerInvalid 0
mbedAustin 11:cada08fc8a70 989 #define osTimerStopped 1
mbedAustin 11:cada08fc8a70 990 #define osTimerRunning 2
mbedAustin 11:cada08fc8a70 991
mbedAustin 11:cada08fc8a70 992 // Timer structures
mbedAustin 11:cada08fc8a70 993
mbedAustin 11:cada08fc8a70 994 typedef struct os_timer_cb_ { // Timer Control Block
mbedAustin 11:cada08fc8a70 995 struct os_timer_cb_ *next; // Pointer to next active Timer
mbedAustin 11:cada08fc8a70 996 uint8_t state; // Timer State
mbedAustin 11:cada08fc8a70 997 uint8_t type; // Timer Type (Periodic/One-shot)
mbedAustin 11:cada08fc8a70 998 uint16_t reserved; // Reserved
mbedAustin 11:cada08fc8a70 999 uint16_t tcnt; // Timer Delay Count
mbedAustin 11:cada08fc8a70 1000 uint16_t icnt; // Timer Initial Count
mbedAustin 11:cada08fc8a70 1001 void *arg; // Timer Function Argument
mbedAustin 11:cada08fc8a70 1002 const osTimerDef_t *timer; // Pointer to Timer definition
mbedAustin 11:cada08fc8a70 1003 } os_timer_cb;
mbedAustin 11:cada08fc8a70 1004
mbedAustin 11:cada08fc8a70 1005 // Timer variables
mbedAustin 11:cada08fc8a70 1006 os_timer_cb *os_timer_head; // Pointer to first active Timer
mbedAustin 11:cada08fc8a70 1007
mbedAustin 11:cada08fc8a70 1008
mbedAustin 11:cada08fc8a70 1009 // Timer Helper Functions
mbedAustin 11:cada08fc8a70 1010
mbedAustin 11:cada08fc8a70 1011 // Insert Timer into the list sorted by time
mbedAustin 11:cada08fc8a70 1012 static void rt_timer_insert (os_timer_cb *pt, uint32_t tcnt) {
mbedAustin 11:cada08fc8a70 1013 os_timer_cb *p, *prev;
mbedAustin 11:cada08fc8a70 1014
mbedAustin 11:cada08fc8a70 1015 prev = NULL;
mbedAustin 11:cada08fc8a70 1016 p = os_timer_head;
mbedAustin 11:cada08fc8a70 1017 while (p != NULL) {
mbedAustin 11:cada08fc8a70 1018 if (tcnt < p->tcnt) break;
mbedAustin 11:cada08fc8a70 1019 tcnt -= p->tcnt;
mbedAustin 11:cada08fc8a70 1020 prev = p;
mbedAustin 11:cada08fc8a70 1021 p = p->next;
mbedAustin 11:cada08fc8a70 1022 }
mbedAustin 11:cada08fc8a70 1023 pt->next = p;
mbedAustin 11:cada08fc8a70 1024 pt->tcnt = (uint16_t)tcnt;
mbedAustin 11:cada08fc8a70 1025 if (p != NULL) {
mbedAustin 11:cada08fc8a70 1026 p->tcnt -= pt->tcnt;
mbedAustin 11:cada08fc8a70 1027 }
mbedAustin 11:cada08fc8a70 1028 if (prev != NULL) {
mbedAustin 11:cada08fc8a70 1029 prev->next = pt;
mbedAustin 11:cada08fc8a70 1030 } else {
mbedAustin 11:cada08fc8a70 1031 os_timer_head = pt;
mbedAustin 11:cada08fc8a70 1032 }
mbedAustin 11:cada08fc8a70 1033 }
mbedAustin 11:cada08fc8a70 1034
mbedAustin 11:cada08fc8a70 1035 // Remove Timer from the list
mbedAustin 11:cada08fc8a70 1036 static int rt_timer_remove (os_timer_cb *pt) {
mbedAustin 11:cada08fc8a70 1037 os_timer_cb *p, *prev;
mbedAustin 11:cada08fc8a70 1038
mbedAustin 11:cada08fc8a70 1039 prev = NULL;
mbedAustin 11:cada08fc8a70 1040 p = os_timer_head;
mbedAustin 11:cada08fc8a70 1041 while (p != NULL) {
mbedAustin 11:cada08fc8a70 1042 if (p == pt) break;
mbedAustin 11:cada08fc8a70 1043 prev = p;
mbedAustin 11:cada08fc8a70 1044 p = p->next;
mbedAustin 11:cada08fc8a70 1045 }
mbedAustin 11:cada08fc8a70 1046 if (p == NULL) return -1;
mbedAustin 11:cada08fc8a70 1047 if (prev != NULL) {
mbedAustin 11:cada08fc8a70 1048 prev->next = pt->next;
mbedAustin 11:cada08fc8a70 1049 } else {
mbedAustin 11:cada08fc8a70 1050 os_timer_head = pt->next;
mbedAustin 11:cada08fc8a70 1051 }
mbedAustin 11:cada08fc8a70 1052 if (pt->next != NULL) {
mbedAustin 11:cada08fc8a70 1053 pt->next->tcnt += pt->tcnt;
mbedAustin 11:cada08fc8a70 1054 }
mbedAustin 11:cada08fc8a70 1055
mbedAustin 11:cada08fc8a70 1056 return 0;
mbedAustin 11:cada08fc8a70 1057 }
mbedAustin 11:cada08fc8a70 1058
mbedAustin 11:cada08fc8a70 1059
mbedAustin 11:cada08fc8a70 1060 // Timer Service Calls declarations
mbedAustin 11:cada08fc8a70 1061 SVC_3_1(svcTimerCreate, osTimerId, const osTimerDef_t *, os_timer_type, void *, RET_pointer)
mbedAustin 11:cada08fc8a70 1062 SVC_2_1(svcTimerStart, osStatus, osTimerId, uint32_t, RET_osStatus)
mbedAustin 11:cada08fc8a70 1063 SVC_1_1(svcTimerStop, osStatus, osTimerId, RET_osStatus)
mbedAustin 11:cada08fc8a70 1064 SVC_1_1(svcTimerDelete, osStatus, osTimerId, RET_osStatus)
mbedAustin 11:cada08fc8a70 1065 SVC_1_2(svcTimerCall, os_InRegs osCallback, osTimerId, RET_osCallback)
mbedAustin 11:cada08fc8a70 1066
mbedAustin 11:cada08fc8a70 1067 // Timer Management Service Calls
mbedAustin 11:cada08fc8a70 1068
mbedAustin 11:cada08fc8a70 1069 /// Create timer
mbedAustin 11:cada08fc8a70 1070 osTimerId svcTimerCreate (const osTimerDef_t *timer_def, os_timer_type type, void *argument) {
mbedAustin 11:cada08fc8a70 1071 os_timer_cb *pt;
mbedAustin 11:cada08fc8a70 1072
mbedAustin 11:cada08fc8a70 1073 if ((timer_def == NULL) || (timer_def->ptimer == NULL)) {
mbedAustin 11:cada08fc8a70 1074 sysThreadError(osErrorParameter);
mbedAustin 11:cada08fc8a70 1075 return NULL;
mbedAustin 11:cada08fc8a70 1076 }
mbedAustin 11:cada08fc8a70 1077
mbedAustin 11:cada08fc8a70 1078 pt = timer_def->timer;
mbedAustin 11:cada08fc8a70 1079 if (pt == NULL) {
mbedAustin 11:cada08fc8a70 1080 sysThreadError(osErrorParameter);
mbedAustin 11:cada08fc8a70 1081 return NULL;
mbedAustin 11:cada08fc8a70 1082 }
mbedAustin 11:cada08fc8a70 1083
mbedAustin 11:cada08fc8a70 1084 if ((type != osTimerOnce) && (type != osTimerPeriodic)) {
mbedAustin 11:cada08fc8a70 1085 sysThreadError(osErrorValue);
mbedAustin 11:cada08fc8a70 1086 return NULL;
mbedAustin 11:cada08fc8a70 1087 }
mbedAustin 11:cada08fc8a70 1088
mbedAustin 11:cada08fc8a70 1089 if (osThreadId_osTimerThread == NULL) {
mbedAustin 11:cada08fc8a70 1090 sysThreadError(osErrorResource);
mbedAustin 11:cada08fc8a70 1091 return NULL;
mbedAustin 11:cada08fc8a70 1092 }
mbedAustin 11:cada08fc8a70 1093
mbedAustin 11:cada08fc8a70 1094 if (pt->state != osTimerInvalid){
mbedAustin 11:cada08fc8a70 1095 sysThreadError(osErrorResource);
mbedAustin 11:cada08fc8a70 1096 return NULL;
mbedAustin 11:cada08fc8a70 1097 }
mbedAustin 11:cada08fc8a70 1098
mbedAustin 11:cada08fc8a70 1099 pt->next = NULL;
mbedAustin 11:cada08fc8a70 1100 pt->state = osTimerStopped;
mbedAustin 11:cada08fc8a70 1101 pt->type = (uint8_t)type;
mbedAustin 11:cada08fc8a70 1102 pt->arg = argument;
mbedAustin 11:cada08fc8a70 1103 pt->timer = timer_def;
mbedAustin 11:cada08fc8a70 1104
mbedAustin 11:cada08fc8a70 1105 return (osTimerId)pt;
mbedAustin 11:cada08fc8a70 1106 }
mbedAustin 11:cada08fc8a70 1107
mbedAustin 11:cada08fc8a70 1108 /// Start or restart timer
mbedAustin 11:cada08fc8a70 1109 osStatus svcTimerStart (osTimerId timer_id, uint32_t millisec) {
mbedAustin 11:cada08fc8a70 1110 os_timer_cb *pt;
mbedAustin 11:cada08fc8a70 1111 uint32_t tcnt;
mbedAustin 11:cada08fc8a70 1112
mbedAustin 11:cada08fc8a70 1113 pt = rt_id2obj(timer_id);
mbedAustin 11:cada08fc8a70 1114 if (pt == NULL) return osErrorParameter;
mbedAustin 11:cada08fc8a70 1115
mbedAustin 11:cada08fc8a70 1116 tcnt = rt_ms2tick(millisec);
mbedAustin 11:cada08fc8a70 1117 if (tcnt == 0) return osErrorValue;
mbedAustin 11:cada08fc8a70 1118
mbedAustin 11:cada08fc8a70 1119 switch (pt->state) {
mbedAustin 11:cada08fc8a70 1120 case osTimerRunning:
mbedAustin 11:cada08fc8a70 1121 if (rt_timer_remove(pt) != 0) {
mbedAustin 11:cada08fc8a70 1122 return osErrorResource;
mbedAustin 11:cada08fc8a70 1123 }
mbedAustin 11:cada08fc8a70 1124 break;
mbedAustin 11:cada08fc8a70 1125 case osTimerStopped:
mbedAustin 11:cada08fc8a70 1126 pt->state = osTimerRunning;
mbedAustin 11:cada08fc8a70 1127 pt->icnt = (uint16_t)tcnt;
mbedAustin 11:cada08fc8a70 1128 break;
mbedAustin 11:cada08fc8a70 1129 default:
mbedAustin 11:cada08fc8a70 1130 return osErrorResource;
mbedAustin 11:cada08fc8a70 1131 }
mbedAustin 11:cada08fc8a70 1132
mbedAustin 11:cada08fc8a70 1133 rt_timer_insert(pt, tcnt);
mbedAustin 11:cada08fc8a70 1134
mbedAustin 11:cada08fc8a70 1135 return osOK;
mbedAustin 11:cada08fc8a70 1136 }
mbedAustin 11:cada08fc8a70 1137
mbedAustin 11:cada08fc8a70 1138 /// Stop timer
mbedAustin 11:cada08fc8a70 1139 osStatus svcTimerStop (osTimerId timer_id) {
mbedAustin 11:cada08fc8a70 1140 os_timer_cb *pt;
mbedAustin 11:cada08fc8a70 1141
mbedAustin 11:cada08fc8a70 1142 pt = rt_id2obj(timer_id);
mbedAustin 11:cada08fc8a70 1143 if (pt == NULL) return osErrorParameter;
mbedAustin 11:cada08fc8a70 1144
mbedAustin 11:cada08fc8a70 1145 if (pt->state != osTimerRunning) return osErrorResource;
mbedAustin 11:cada08fc8a70 1146
mbedAustin 11:cada08fc8a70 1147 pt->state = osTimerStopped;
mbedAustin 11:cada08fc8a70 1148
mbedAustin 11:cada08fc8a70 1149 if (rt_timer_remove(pt) != 0) {
mbedAustin 11:cada08fc8a70 1150 return osErrorResource;
mbedAustin 11:cada08fc8a70 1151 }
mbedAustin 11:cada08fc8a70 1152
mbedAustin 11:cada08fc8a70 1153 return osOK;
mbedAustin 11:cada08fc8a70 1154 }
mbedAustin 11:cada08fc8a70 1155
mbedAustin 11:cada08fc8a70 1156 /// Delete timer
mbedAustin 11:cada08fc8a70 1157 osStatus svcTimerDelete (osTimerId timer_id) {
mbedAustin 11:cada08fc8a70 1158 os_timer_cb *pt;
mbedAustin 11:cada08fc8a70 1159
mbedAustin 11:cada08fc8a70 1160 pt = rt_id2obj(timer_id);
mbedAustin 11:cada08fc8a70 1161 if (pt == NULL) return osErrorParameter;
mbedAustin 11:cada08fc8a70 1162
mbedAustin 11:cada08fc8a70 1163 switch (pt->state) {
mbedAustin 11:cada08fc8a70 1164 case osTimerRunning:
mbedAustin 11:cada08fc8a70 1165 rt_timer_remove(pt);
mbedAustin 11:cada08fc8a70 1166 break;
mbedAustin 11:cada08fc8a70 1167 case osTimerStopped:
mbedAustin 11:cada08fc8a70 1168 break;
mbedAustin 11:cada08fc8a70 1169 default:
mbedAustin 11:cada08fc8a70 1170 return osErrorResource;
mbedAustin 11:cada08fc8a70 1171 }
mbedAustin 11:cada08fc8a70 1172
mbedAustin 11:cada08fc8a70 1173 pt->state = osTimerInvalid;
mbedAustin 11:cada08fc8a70 1174
mbedAustin 11:cada08fc8a70 1175 return osOK;
mbedAustin 11:cada08fc8a70 1176 }
mbedAustin 11:cada08fc8a70 1177
mbedAustin 11:cada08fc8a70 1178 /// Get timer callback parameters
mbedAustin 11:cada08fc8a70 1179 os_InRegs osCallback_type svcTimerCall (osTimerId timer_id) {
mbedAustin 11:cada08fc8a70 1180 os_timer_cb *pt;
mbedAustin 11:cada08fc8a70 1181 osCallback ret;
mbedAustin 11:cada08fc8a70 1182
mbedAustin 11:cada08fc8a70 1183 pt = rt_id2obj(timer_id);
mbedAustin 11:cada08fc8a70 1184 if (pt == NULL) {
mbedAustin 11:cada08fc8a70 1185 ret.fp = NULL;
mbedAustin 11:cada08fc8a70 1186 ret.arg = NULL;
mbedAustin 11:cada08fc8a70 1187 #if defined (__GNUC__) && defined (__ARM_PCS_VFP)
mbedAustin 11:cada08fc8a70 1188 osCallback_ret;
mbedAustin 11:cada08fc8a70 1189 return;
mbedAustin 11:cada08fc8a70 1190 #else
mbedAustin 11:cada08fc8a70 1191 return osCallback_ret;
mbedAustin 11:cada08fc8a70 1192 #endif
mbedAustin 11:cada08fc8a70 1193 }
mbedAustin 11:cada08fc8a70 1194
mbedAustin 11:cada08fc8a70 1195 ret.fp = (void *)pt->timer->ptimer;
mbedAustin 11:cada08fc8a70 1196 ret.arg = pt->arg;
mbedAustin 11:cada08fc8a70 1197
mbedAustin 11:cada08fc8a70 1198 #if defined (__GNUC__) && defined (__ARM_PCS_VFP)
mbedAustin 11:cada08fc8a70 1199 osCallback_ret;
mbedAustin 11:cada08fc8a70 1200 return;
mbedAustin 11:cada08fc8a70 1201 #else
mbedAustin 11:cada08fc8a70 1202 return osCallback_ret;
mbedAustin 11:cada08fc8a70 1203 #endif
mbedAustin 11:cada08fc8a70 1204 }
mbedAustin 11:cada08fc8a70 1205
mbedAustin 11:cada08fc8a70 1206 static __INLINE osStatus isrMessagePut (osMessageQId queue_id, uint32_t info, uint32_t millisec);
mbedAustin 11:cada08fc8a70 1207
mbedAustin 11:cada08fc8a70 1208 /// Timer Tick (called each SysTick)
mbedAustin 11:cada08fc8a70 1209 void sysTimerTick (void) {
mbedAustin 11:cada08fc8a70 1210 os_timer_cb *pt, *p;
mbedAustin 11:cada08fc8a70 1211
mbedAustin 11:cada08fc8a70 1212 p = os_timer_head;
mbedAustin 11:cada08fc8a70 1213 if (p == NULL) return;
mbedAustin 11:cada08fc8a70 1214
mbedAustin 11:cada08fc8a70 1215 p->tcnt--;
mbedAustin 11:cada08fc8a70 1216 while ((p != NULL) && (p->tcnt == 0)) {
mbedAustin 11:cada08fc8a70 1217 pt = p;
mbedAustin 11:cada08fc8a70 1218 p = p->next;
mbedAustin 11:cada08fc8a70 1219 os_timer_head = p;
mbedAustin 11:cada08fc8a70 1220 isrMessagePut(osMessageQId_osTimerMessageQ, (uint32_t)pt, 0);
mbedAustin 11:cada08fc8a70 1221 if (pt->type == osTimerPeriodic) {
mbedAustin 11:cada08fc8a70 1222 rt_timer_insert(pt, pt->icnt);
mbedAustin 11:cada08fc8a70 1223 } else {
mbedAustin 11:cada08fc8a70 1224 pt->state = osTimerStopped;
mbedAustin 11:cada08fc8a70 1225 }
mbedAustin 11:cada08fc8a70 1226 }
mbedAustin 11:cada08fc8a70 1227 }
mbedAustin 11:cada08fc8a70 1228
mbedAustin 11:cada08fc8a70 1229 /// Get user timers wake-up time
mbedAustin 11:cada08fc8a70 1230 uint32_t sysUserTimerWakeupTime (void) {
mbedAustin 11:cada08fc8a70 1231
mbedAustin 11:cada08fc8a70 1232 if (os_timer_head) {
mbedAustin 11:cada08fc8a70 1233 return os_timer_head->tcnt;
mbedAustin 11:cada08fc8a70 1234 }
mbedAustin 11:cada08fc8a70 1235 return 0xFFFF;
mbedAustin 11:cada08fc8a70 1236 }
mbedAustin 11:cada08fc8a70 1237
mbedAustin 11:cada08fc8a70 1238 /// Update user timers on resume
mbedAustin 11:cada08fc8a70 1239 void sysUserTimerUpdate (uint32_t sleep_time) {
mbedAustin 11:cada08fc8a70 1240
mbedAustin 11:cada08fc8a70 1241 while (os_timer_head && sleep_time) {
mbedAustin 11:cada08fc8a70 1242 if (sleep_time >= os_timer_head->tcnt) {
mbedAustin 11:cada08fc8a70 1243 sleep_time -= os_timer_head->tcnt;
mbedAustin 11:cada08fc8a70 1244 os_timer_head->tcnt = 1;
mbedAustin 11:cada08fc8a70 1245 sysTimerTick();
mbedAustin 11:cada08fc8a70 1246 } else {
mbedAustin 11:cada08fc8a70 1247 os_timer_head->tcnt -= sleep_time;
mbedAustin 11:cada08fc8a70 1248 break;
mbedAustin 11:cada08fc8a70 1249 }
mbedAustin 11:cada08fc8a70 1250 }
mbedAustin 11:cada08fc8a70 1251 }
mbedAustin 11:cada08fc8a70 1252
mbedAustin 11:cada08fc8a70 1253
mbedAustin 11:cada08fc8a70 1254 // Timer Management Public API
mbedAustin 11:cada08fc8a70 1255
mbedAustin 11:cada08fc8a70 1256 /// Create timer
mbedAustin 11:cada08fc8a70 1257 osTimerId osTimerCreate (const osTimerDef_t *timer_def, os_timer_type type, void *argument) {
mbedAustin 11:cada08fc8a70 1258 if (__exceptional_mode()) return NULL; // Not allowed in ISR
mbedAustin 11:cada08fc8a70 1259 if ((__get_mode() != MODE_USR) && (os_running == 0)) {
mbedAustin 11:cada08fc8a70 1260 // Privileged and not running
mbedAustin 11:cada08fc8a70 1261 return svcTimerCreate(timer_def, type, argument);
mbedAustin 11:cada08fc8a70 1262 } else {
mbedAustin 11:cada08fc8a70 1263 return __svcTimerCreate(timer_def, type, argument);
mbedAustin 11:cada08fc8a70 1264 }
mbedAustin 11:cada08fc8a70 1265 }
mbedAustin 11:cada08fc8a70 1266
mbedAustin 11:cada08fc8a70 1267 /// Start or restart timer
mbedAustin 11:cada08fc8a70 1268 osStatus osTimerStart (osTimerId timer_id, uint32_t millisec) {
mbedAustin 11:cada08fc8a70 1269 if (__exceptional_mode()) return osErrorISR; // Not allowed in ISR
mbedAustin 11:cada08fc8a70 1270 return __svcTimerStart(timer_id, millisec);
mbedAustin 11:cada08fc8a70 1271 }
mbedAustin 11:cada08fc8a70 1272
mbedAustin 11:cada08fc8a70 1273 /// Stop timer
mbedAustin 11:cada08fc8a70 1274 osStatus osTimerStop (osTimerId timer_id) {
mbedAustin 11:cada08fc8a70 1275 if (__exceptional_mode()) return osErrorISR; // Not allowed in ISR
mbedAustin 11:cada08fc8a70 1276 return __svcTimerStop(timer_id);
mbedAustin 11:cada08fc8a70 1277 }
mbedAustin 11:cada08fc8a70 1278
mbedAustin 11:cada08fc8a70 1279 /// Delete timer
mbedAustin 11:cada08fc8a70 1280 osStatus osTimerDelete (osTimerId timer_id) {
mbedAustin 11:cada08fc8a70 1281 if (__exceptional_mode()) return osErrorISR; // Not allowed in ISR
mbedAustin 11:cada08fc8a70 1282 return __svcTimerDelete(timer_id);
mbedAustin 11:cada08fc8a70 1283 }
mbedAustin 11:cada08fc8a70 1284
mbedAustin 11:cada08fc8a70 1285 /// INTERNAL - Not Public
mbedAustin 11:cada08fc8a70 1286 /// Get timer callback parameters (used by OS Timer Thread)
mbedAustin 11:cada08fc8a70 1287 os_InRegs osCallback osTimerCall (osTimerId timer_id) {
mbedAustin 11:cada08fc8a70 1288 return __svcTimerCall(timer_id);
mbedAustin 11:cada08fc8a70 1289 }
mbedAustin 11:cada08fc8a70 1290
mbedAustin 11:cada08fc8a70 1291
mbedAustin 11:cada08fc8a70 1292 // Timer Thread
mbedAustin 11:cada08fc8a70 1293 __NO_RETURN void osTimerThread (void const *argument) {
mbedAustin 11:cada08fc8a70 1294 osCallback cb;
mbedAustin 11:cada08fc8a70 1295 osEvent evt;
mbedAustin 11:cada08fc8a70 1296
mbedAustin 11:cada08fc8a70 1297 for (;;) {
mbedAustin 11:cada08fc8a70 1298 evt = osMessageGet(osMessageQId_osTimerMessageQ, osWaitForever);
mbedAustin 11:cada08fc8a70 1299 if (evt.status == osEventMessage) {
mbedAustin 11:cada08fc8a70 1300 cb = osTimerCall(evt.value.p);
mbedAustin 11:cada08fc8a70 1301 if (cb.fp != NULL) {
mbedAustin 11:cada08fc8a70 1302 (*(os_ptimer)cb.fp)(cb.arg);
mbedAustin 11:cada08fc8a70 1303 }
mbedAustin 11:cada08fc8a70 1304 }
mbedAustin 11:cada08fc8a70 1305 }
mbedAustin 11:cada08fc8a70 1306 }
mbedAustin 11:cada08fc8a70 1307
mbedAustin 11:cada08fc8a70 1308
mbedAustin 11:cada08fc8a70 1309 // ==== Signal Management ====
mbedAustin 11:cada08fc8a70 1310
mbedAustin 11:cada08fc8a70 1311 // Signal Service Calls declarations
mbedAustin 11:cada08fc8a70 1312 SVC_2_1(svcSignalSet, int32_t, osThreadId, int32_t, RET_int32_t)
mbedAustin 11:cada08fc8a70 1313 SVC_2_1(svcSignalClear, int32_t, osThreadId, int32_t, RET_int32_t)
mbedAustin 11:cada08fc8a70 1314 SVC_2_3(svcSignalWait, os_InRegs osEvent, int32_t, uint32_t, RET_osEvent)
mbedAustin 11:cada08fc8a70 1315
mbedAustin 11:cada08fc8a70 1316 // Signal Service Calls
mbedAustin 11:cada08fc8a70 1317
mbedAustin 11:cada08fc8a70 1318 /// Set the specified Signal Flags of an active thread
mbedAustin 11:cada08fc8a70 1319 int32_t svcSignalSet (osThreadId thread_id, int32_t signals) {
mbedAustin 11:cada08fc8a70 1320 P_TCB ptcb;
mbedAustin 11:cada08fc8a70 1321 int32_t sig;
mbedAustin 11:cada08fc8a70 1322
mbedAustin 11:cada08fc8a70 1323 ptcb = rt_tid2ptcb(thread_id); // Get TCB pointer
mbedAustin 11:cada08fc8a70 1324 if (ptcb == NULL) return 0x80000000;
mbedAustin 11:cada08fc8a70 1325
mbedAustin 11:cada08fc8a70 1326 if (signals & (0xFFFFFFFF << osFeature_Signals)) return 0x80000000;
mbedAustin 11:cada08fc8a70 1327
mbedAustin 11:cada08fc8a70 1328 sig = ptcb->events; // Previous signal flags
mbedAustin 11:cada08fc8a70 1329
mbedAustin 11:cada08fc8a70 1330 rt_evt_set(signals, ptcb->task_id); // Set event flags
mbedAustin 11:cada08fc8a70 1331
mbedAustin 11:cada08fc8a70 1332 return sig;
mbedAustin 11:cada08fc8a70 1333 }
mbedAustin 11:cada08fc8a70 1334
mbedAustin 11:cada08fc8a70 1335 /// Clear the specified Signal Flags of an active thread
mbedAustin 11:cada08fc8a70 1336 int32_t svcSignalClear (osThreadId thread_id, int32_t signals) {
mbedAustin 11:cada08fc8a70 1337 P_TCB ptcb;
mbedAustin 11:cada08fc8a70 1338 int32_t sig;
mbedAustin 11:cada08fc8a70 1339
mbedAustin 11:cada08fc8a70 1340 ptcb = rt_tid2ptcb(thread_id); // Get TCB pointer
mbedAustin 11:cada08fc8a70 1341 if (ptcb == NULL) return 0x80000000;
mbedAustin 11:cada08fc8a70 1342
mbedAustin 11:cada08fc8a70 1343 if (signals & (0xFFFFFFFF << osFeature_Signals)) return 0x80000000;
mbedAustin 11:cada08fc8a70 1344
mbedAustin 11:cada08fc8a70 1345 sig = ptcb->events; // Previous signal flags
mbedAustin 11:cada08fc8a70 1346
mbedAustin 11:cada08fc8a70 1347 rt_evt_clr(signals, ptcb->task_id); // Clear event flags
mbedAustin 11:cada08fc8a70 1348
mbedAustin 11:cada08fc8a70 1349 return sig;
mbedAustin 11:cada08fc8a70 1350 }
mbedAustin 11:cada08fc8a70 1351
mbedAustin 11:cada08fc8a70 1352 /// Wait for one or more Signal Flags to become signaled for the current RUNNING thread
mbedAustin 11:cada08fc8a70 1353 os_InRegs osEvent_type svcSignalWait (int32_t signals, uint32_t millisec) {
mbedAustin 11:cada08fc8a70 1354 OS_RESULT res;
mbedAustin 11:cada08fc8a70 1355 osEvent ret;
mbedAustin 11:cada08fc8a70 1356
mbedAustin 11:cada08fc8a70 1357 if (signals & (0xFFFFFFFF << osFeature_Signals)) {
mbedAustin 11:cada08fc8a70 1358 ret.status = osErrorValue;
mbedAustin 11:cada08fc8a70 1359 #if defined (__GNUC__) && defined (__ARM_PCS_VFP)
mbedAustin 11:cada08fc8a70 1360 osEvent_ret_status;
mbedAustin 11:cada08fc8a70 1361 return;
mbedAustin 11:cada08fc8a70 1362 #else
mbedAustin 11:cada08fc8a70 1363 return osEvent_ret_status;
mbedAustin 11:cada08fc8a70 1364 #endif
mbedAustin 11:cada08fc8a70 1365 }
mbedAustin 11:cada08fc8a70 1366
mbedAustin 11:cada08fc8a70 1367 if (signals != 0) { // Wait for all specified signals
mbedAustin 11:cada08fc8a70 1368 res = rt_evt_wait(signals, rt_ms2tick(millisec), __TRUE);
mbedAustin 11:cada08fc8a70 1369 } else { // Wait for any signal
mbedAustin 11:cada08fc8a70 1370 res = rt_evt_wait(0xFFFF, rt_ms2tick(millisec), __FALSE);
mbedAustin 11:cada08fc8a70 1371 }
mbedAustin 11:cada08fc8a70 1372
mbedAustin 11:cada08fc8a70 1373 if (res == OS_R_EVT) {
mbedAustin 11:cada08fc8a70 1374 ret.status = osEventSignal;
mbedAustin 11:cada08fc8a70 1375 ret.value.signals = signals ? signals : os_tsk.run->waits;
mbedAustin 11:cada08fc8a70 1376 } else {
mbedAustin 11:cada08fc8a70 1377 ret.status = millisec ? osEventTimeout : osOK;
mbedAustin 11:cada08fc8a70 1378 ret.value.signals = 0;
mbedAustin 11:cada08fc8a70 1379 }
mbedAustin 11:cada08fc8a70 1380
mbedAustin 11:cada08fc8a70 1381 #if defined (__GNUC__) && defined (__ARM_PCS_VFP)
mbedAustin 11:cada08fc8a70 1382 osEvent_ret_value;
mbedAustin 11:cada08fc8a70 1383 return;
mbedAustin 11:cada08fc8a70 1384 #else
mbedAustin 11:cada08fc8a70 1385 return osEvent_ret_value;
mbedAustin 11:cada08fc8a70 1386 #endif
mbedAustin 11:cada08fc8a70 1387 }
mbedAustin 11:cada08fc8a70 1388
mbedAustin 11:cada08fc8a70 1389
mbedAustin 11:cada08fc8a70 1390 // Signal ISR Calls
mbedAustin 11:cada08fc8a70 1391
mbedAustin 11:cada08fc8a70 1392 /// Set the specified Signal Flags of an active thread
mbedAustin 11:cada08fc8a70 1393 static __INLINE int32_t isrSignalSet (osThreadId thread_id, int32_t signals) {
mbedAustin 11:cada08fc8a70 1394 P_TCB ptcb;
mbedAustin 11:cada08fc8a70 1395 int32_t sig;
mbedAustin 11:cada08fc8a70 1396
mbedAustin 11:cada08fc8a70 1397 ptcb = rt_tid2ptcb(thread_id); // Get TCB pointer
mbedAustin 11:cada08fc8a70 1398 if (ptcb == NULL) return 0x80000000;
mbedAustin 11:cada08fc8a70 1399
mbedAustin 11:cada08fc8a70 1400 if (signals & (0xFFFFFFFF << osFeature_Signals)) return 0x80000000;
mbedAustin 11:cada08fc8a70 1401
mbedAustin 11:cada08fc8a70 1402 sig = ptcb->events; // Previous signal flags
mbedAustin 11:cada08fc8a70 1403
mbedAustin 11:cada08fc8a70 1404 isr_evt_set(signals, ptcb->task_id); // Set event flags
mbedAustin 11:cada08fc8a70 1405
mbedAustin 11:cada08fc8a70 1406 return sig;
mbedAustin 11:cada08fc8a70 1407 }
mbedAustin 11:cada08fc8a70 1408
mbedAustin 11:cada08fc8a70 1409
mbedAustin 11:cada08fc8a70 1410 // Signal Public API
mbedAustin 11:cada08fc8a70 1411
mbedAustin 11:cada08fc8a70 1412 /// Set the specified Signal Flags of an active thread
mbedAustin 11:cada08fc8a70 1413 int32_t osSignalSet (osThreadId thread_id, int32_t signals) {
mbedAustin 11:cada08fc8a70 1414 if (__exceptional_mode()) { // in ISR
mbedAustin 11:cada08fc8a70 1415 return isrSignalSet(thread_id, signals);
mbedAustin 11:cada08fc8a70 1416 } else { // in Thread
mbedAustin 11:cada08fc8a70 1417 return __svcSignalSet(thread_id, signals);
mbedAustin 11:cada08fc8a70 1418 }
mbedAustin 11:cada08fc8a70 1419 }
mbedAustin 11:cada08fc8a70 1420
mbedAustin 11:cada08fc8a70 1421 /// Clear the specified Signal Flags of an active thread
mbedAustin 11:cada08fc8a70 1422 int32_t osSignalClear (osThreadId thread_id, int32_t signals) {
mbedAustin 11:cada08fc8a70 1423 if (__exceptional_mode()) return osErrorISR; // Not allowed in ISR
mbedAustin 11:cada08fc8a70 1424 return __svcSignalClear(thread_id, signals);
mbedAustin 11:cada08fc8a70 1425 }
mbedAustin 11:cada08fc8a70 1426
mbedAustin 11:cada08fc8a70 1427 /// Wait for one or more Signal Flags to become signaled for the current RUNNING thread
mbedAustin 11:cada08fc8a70 1428 os_InRegs osEvent osSignalWait (int32_t signals, uint32_t millisec) {
mbedAustin 11:cada08fc8a70 1429 osEvent ret;
mbedAustin 11:cada08fc8a70 1430
mbedAustin 11:cada08fc8a70 1431 if (__exceptional_mode()) { // Not allowed in ISR
mbedAustin 11:cada08fc8a70 1432 ret.status = osErrorISR;
mbedAustin 11:cada08fc8a70 1433 return ret;
mbedAustin 11:cada08fc8a70 1434 }
mbedAustin 11:cada08fc8a70 1435 return __svcSignalWait(signals, millisec);
mbedAustin 11:cada08fc8a70 1436 }
mbedAustin 11:cada08fc8a70 1437
mbedAustin 11:cada08fc8a70 1438
mbedAustin 11:cada08fc8a70 1439 // ==== Mutex Management ====
mbedAustin 11:cada08fc8a70 1440
mbedAustin 11:cada08fc8a70 1441 // Mutex Service Calls declarations
mbedAustin 11:cada08fc8a70 1442 SVC_1_1(svcMutexCreate, osMutexId, const osMutexDef_t *, RET_pointer)
mbedAustin 11:cada08fc8a70 1443 SVC_2_1(svcMutexWait, osStatus, osMutexId, uint32_t, RET_osStatus)
mbedAustin 11:cada08fc8a70 1444 SVC_1_1(svcMutexRelease, osStatus, osMutexId, RET_osStatus)
mbedAustin 11:cada08fc8a70 1445 SVC_1_1(svcMutexDelete, osStatus, osMutexId, RET_osStatus)
mbedAustin 11:cada08fc8a70 1446
mbedAustin 11:cada08fc8a70 1447 // Mutex Service Calls
mbedAustin 11:cada08fc8a70 1448
mbedAustin 11:cada08fc8a70 1449 /// Create and Initialize a Mutex object
mbedAustin 11:cada08fc8a70 1450 osMutexId svcMutexCreate (const osMutexDef_t *mutex_def) {
mbedAustin 11:cada08fc8a70 1451 OS_ID mut;
mbedAustin 11:cada08fc8a70 1452
mbedAustin 11:cada08fc8a70 1453 if (mutex_def == NULL) {
mbedAustin 11:cada08fc8a70 1454 sysThreadError(osErrorParameter);
mbedAustin 11:cada08fc8a70 1455 return NULL;
mbedAustin 11:cada08fc8a70 1456 }
mbedAustin 11:cada08fc8a70 1457
mbedAustin 11:cada08fc8a70 1458 mut = mutex_def->mutex;
mbedAustin 11:cada08fc8a70 1459 if (mut == NULL) {
mbedAustin 11:cada08fc8a70 1460 sysThreadError(osErrorParameter);
mbedAustin 11:cada08fc8a70 1461 return NULL;
mbedAustin 11:cada08fc8a70 1462 }
mbedAustin 11:cada08fc8a70 1463
mbedAustin 11:cada08fc8a70 1464 if (((P_MUCB)mut)->cb_type != 0) {
mbedAustin 11:cada08fc8a70 1465 sysThreadError(osErrorParameter);
mbedAustin 11:cada08fc8a70 1466 return NULL;
mbedAustin 11:cada08fc8a70 1467 }
mbedAustin 11:cada08fc8a70 1468
mbedAustin 11:cada08fc8a70 1469 rt_mut_init(mut); // Initialize Mutex
mbedAustin 11:cada08fc8a70 1470
mbedAustin 11:cada08fc8a70 1471 return mut;
mbedAustin 11:cada08fc8a70 1472 }
mbedAustin 11:cada08fc8a70 1473
mbedAustin 11:cada08fc8a70 1474 /// Wait until a Mutex becomes available
mbedAustin 11:cada08fc8a70 1475 osStatus svcMutexWait (osMutexId mutex_id, uint32_t millisec) {
mbedAustin 11:cada08fc8a70 1476 OS_ID mut;
mbedAustin 11:cada08fc8a70 1477 OS_RESULT res;
mbedAustin 11:cada08fc8a70 1478
mbedAustin 11:cada08fc8a70 1479 mut = rt_id2obj(mutex_id);
mbedAustin 11:cada08fc8a70 1480 if (mut == NULL) return osErrorParameter;
mbedAustin 11:cada08fc8a70 1481
mbedAustin 11:cada08fc8a70 1482 if (((P_MUCB)mut)->cb_type != MUCB) return osErrorParameter;
mbedAustin 11:cada08fc8a70 1483
mbedAustin 11:cada08fc8a70 1484 res = rt_mut_wait(mut, rt_ms2tick(millisec)); // Wait for Mutex
mbedAustin 11:cada08fc8a70 1485
mbedAustin 11:cada08fc8a70 1486 if (res == OS_R_TMO) {
mbedAustin 11:cada08fc8a70 1487 return (millisec ? osErrorTimeoutResource : osErrorResource);
mbedAustin 11:cada08fc8a70 1488 }
mbedAustin 11:cada08fc8a70 1489
mbedAustin 11:cada08fc8a70 1490 return osOK;
mbedAustin 11:cada08fc8a70 1491 }
mbedAustin 11:cada08fc8a70 1492
mbedAustin 11:cada08fc8a70 1493 /// Release a Mutex that was obtained with osMutexWait
mbedAustin 11:cada08fc8a70 1494 osStatus svcMutexRelease (osMutexId mutex_id) {
mbedAustin 11:cada08fc8a70 1495 OS_ID mut;
mbedAustin 11:cada08fc8a70 1496 OS_RESULT res;
mbedAustin 11:cada08fc8a70 1497
mbedAustin 11:cada08fc8a70 1498 mut = rt_id2obj(mutex_id);
mbedAustin 11:cada08fc8a70 1499 if (mut == NULL) return osErrorParameter;
mbedAustin 11:cada08fc8a70 1500
mbedAustin 11:cada08fc8a70 1501 if (((P_MUCB)mut)->cb_type != MUCB) return osErrorParameter;
mbedAustin 11:cada08fc8a70 1502
mbedAustin 11:cada08fc8a70 1503 res = rt_mut_release(mut); // Release Mutex
mbedAustin 11:cada08fc8a70 1504
mbedAustin 11:cada08fc8a70 1505 if (res == OS_R_NOK) return osErrorResource; // Thread not owner or Zero Counter
mbedAustin 11:cada08fc8a70 1506
mbedAustin 11:cada08fc8a70 1507 return osOK;
mbedAustin 11:cada08fc8a70 1508 }
mbedAustin 11:cada08fc8a70 1509
mbedAustin 11:cada08fc8a70 1510 /// Delete a Mutex that was created by osMutexCreate
mbedAustin 11:cada08fc8a70 1511 osStatus svcMutexDelete (osMutexId mutex_id) {
mbedAustin 11:cada08fc8a70 1512 OS_ID mut;
mbedAustin 11:cada08fc8a70 1513
mbedAustin 11:cada08fc8a70 1514 mut = rt_id2obj(mutex_id);
mbedAustin 11:cada08fc8a70 1515 if (mut == NULL) return osErrorParameter;
mbedAustin 11:cada08fc8a70 1516
mbedAustin 11:cada08fc8a70 1517 if (((P_MUCB)mut)->cb_type != MUCB) return osErrorParameter;
mbedAustin 11:cada08fc8a70 1518
mbedAustin 11:cada08fc8a70 1519 rt_mut_delete(mut); // Release Mutex
mbedAustin 11:cada08fc8a70 1520
mbedAustin 11:cada08fc8a70 1521 return osOK;
mbedAustin 11:cada08fc8a70 1522 }
mbedAustin 11:cada08fc8a70 1523
mbedAustin 11:cada08fc8a70 1524
mbedAustin 11:cada08fc8a70 1525 // Mutex Public API
mbedAustin 11:cada08fc8a70 1526
mbedAustin 11:cada08fc8a70 1527 /// Create and Initialize a Mutex object
mbedAustin 11:cada08fc8a70 1528 osMutexId osMutexCreate (const osMutexDef_t *mutex_def) {
mbedAustin 11:cada08fc8a70 1529 if (__exceptional_mode()) return NULL; // Not allowed in ISR
mbedAustin 11:cada08fc8a70 1530 if ((__get_mode() != MODE_USR) && (os_running == 0)) {
mbedAustin 11:cada08fc8a70 1531 // Privileged and not running
mbedAustin 11:cada08fc8a70 1532 return svcMutexCreate(mutex_def);
mbedAustin 11:cada08fc8a70 1533 } else {
mbedAustin 11:cada08fc8a70 1534 return __svcMutexCreate(mutex_def);
mbedAustin 11:cada08fc8a70 1535 }
mbedAustin 11:cada08fc8a70 1536 }
mbedAustin 11:cada08fc8a70 1537
mbedAustin 11:cada08fc8a70 1538 /// Wait until a Mutex becomes available
mbedAustin 11:cada08fc8a70 1539 osStatus osMutexWait (osMutexId mutex_id, uint32_t millisec) {
mbedAustin 11:cada08fc8a70 1540 if (__exceptional_mode()) return osErrorISR; // Not allowed in ISR
mbedAustin 11:cada08fc8a70 1541 return __svcMutexWait(mutex_id, millisec);
mbedAustin 11:cada08fc8a70 1542 }
mbedAustin 11:cada08fc8a70 1543
mbedAustin 11:cada08fc8a70 1544 /// Release a Mutex that was obtained with osMutexWait
mbedAustin 11:cada08fc8a70 1545 osStatus osMutexRelease (osMutexId mutex_id) {
mbedAustin 11:cada08fc8a70 1546 if (__exceptional_mode()) return osErrorISR; // Not allowed in ISR
mbedAustin 11:cada08fc8a70 1547 return __svcMutexRelease(mutex_id);
mbedAustin 11:cada08fc8a70 1548 }
mbedAustin 11:cada08fc8a70 1549
mbedAustin 11:cada08fc8a70 1550 /// Delete a Mutex that was created by osMutexCreate
mbedAustin 11:cada08fc8a70 1551 osStatus osMutexDelete (osMutexId mutex_id) {
mbedAustin 11:cada08fc8a70 1552 if (__exceptional_mode()) return osErrorISR; // Not allowed in ISR
mbedAustin 11:cada08fc8a70 1553 return __svcMutexDelete(mutex_id);
mbedAustin 11:cada08fc8a70 1554 }
mbedAustin 11:cada08fc8a70 1555
mbedAustin 11:cada08fc8a70 1556
mbedAustin 11:cada08fc8a70 1557 // ==== Semaphore Management ====
mbedAustin 11:cada08fc8a70 1558
mbedAustin 11:cada08fc8a70 1559 // Semaphore Service Calls declarations
mbedAustin 11:cada08fc8a70 1560 SVC_2_1(svcSemaphoreCreate, osSemaphoreId, const osSemaphoreDef_t *, int32_t, RET_pointer)
mbedAustin 11:cada08fc8a70 1561 SVC_2_1(svcSemaphoreWait, int32_t, osSemaphoreId, uint32_t, RET_int32_t)
mbedAustin 11:cada08fc8a70 1562 SVC_1_1(svcSemaphoreRelease, osStatus, osSemaphoreId, RET_osStatus)
mbedAustin 11:cada08fc8a70 1563 SVC_1_1(svcSemaphoreDelete, osStatus, osSemaphoreId, RET_osStatus)
mbedAustin 11:cada08fc8a70 1564
mbedAustin 11:cada08fc8a70 1565 // Semaphore Service Calls
mbedAustin 11:cada08fc8a70 1566
mbedAustin 11:cada08fc8a70 1567 /// Create and Initialize a Semaphore object
mbedAustin 11:cada08fc8a70 1568 osSemaphoreId svcSemaphoreCreate (const osSemaphoreDef_t *semaphore_def, int32_t count) {
mbedAustin 11:cada08fc8a70 1569 OS_ID sem;
mbedAustin 11:cada08fc8a70 1570
mbedAustin 11:cada08fc8a70 1571 if (semaphore_def == NULL) {
mbedAustin 11:cada08fc8a70 1572 sysThreadError(osErrorParameter);
mbedAustin 11:cada08fc8a70 1573 return NULL;
mbedAustin 11:cada08fc8a70 1574 }
mbedAustin 11:cada08fc8a70 1575
mbedAustin 11:cada08fc8a70 1576 sem = semaphore_def->semaphore;
mbedAustin 11:cada08fc8a70 1577 if (sem == NULL) {
mbedAustin 11:cada08fc8a70 1578 sysThreadError(osErrorParameter);
mbedAustin 11:cada08fc8a70 1579 return NULL;
mbedAustin 11:cada08fc8a70 1580 }
mbedAustin 11:cada08fc8a70 1581
mbedAustin 11:cada08fc8a70 1582 if (((P_SCB)sem)->cb_type != 0) {
mbedAustin 11:cada08fc8a70 1583 sysThreadError(osErrorParameter);
mbedAustin 11:cada08fc8a70 1584 return NULL;
mbedAustin 11:cada08fc8a70 1585 }
mbedAustin 11:cada08fc8a70 1586
mbedAustin 11:cada08fc8a70 1587 if (count > osFeature_Semaphore) {
mbedAustin 11:cada08fc8a70 1588 sysThreadError(osErrorValue);
mbedAustin 11:cada08fc8a70 1589 return NULL;
mbedAustin 11:cada08fc8a70 1590 }
mbedAustin 11:cada08fc8a70 1591
mbedAustin 11:cada08fc8a70 1592 rt_sem_init(sem, count); // Initialize Semaphore
mbedAustin 11:cada08fc8a70 1593
mbedAustin 11:cada08fc8a70 1594 return sem;
mbedAustin 11:cada08fc8a70 1595 }
mbedAustin 11:cada08fc8a70 1596
mbedAustin 11:cada08fc8a70 1597 /// Wait until a Semaphore becomes available
mbedAustin 11:cada08fc8a70 1598 int32_t svcSemaphoreWait (osSemaphoreId semaphore_id, uint32_t millisec) {
mbedAustin 11:cada08fc8a70 1599 OS_ID sem;
mbedAustin 11:cada08fc8a70 1600 OS_RESULT res;
mbedAustin 11:cada08fc8a70 1601
mbedAustin 11:cada08fc8a70 1602 sem = rt_id2obj(semaphore_id);
mbedAustin 11:cada08fc8a70 1603 if (sem == NULL) return -1;
mbedAustin 11:cada08fc8a70 1604
mbedAustin 11:cada08fc8a70 1605 if (((P_SCB)sem)->cb_type != SCB) return -1;
mbedAustin 11:cada08fc8a70 1606
mbedAustin 11:cada08fc8a70 1607 res = rt_sem_wait(sem, rt_ms2tick(millisec)); // Wait for Semaphore
mbedAustin 11:cada08fc8a70 1608
mbedAustin 11:cada08fc8a70 1609 if (res == OS_R_TMO) return 0; // Timeout
mbedAustin 11:cada08fc8a70 1610
mbedAustin 11:cada08fc8a70 1611 return (((P_SCB)sem)->tokens + 1);
mbedAustin 11:cada08fc8a70 1612 }
mbedAustin 11:cada08fc8a70 1613
mbedAustin 11:cada08fc8a70 1614 /// Release a Semaphore
mbedAustin 11:cada08fc8a70 1615 osStatus svcSemaphoreRelease (osSemaphoreId semaphore_id) {
mbedAustin 11:cada08fc8a70 1616 OS_ID sem;
mbedAustin 11:cada08fc8a70 1617
mbedAustin 11:cada08fc8a70 1618 sem = rt_id2obj(semaphore_id);
mbedAustin 11:cada08fc8a70 1619 if (sem == NULL) return osErrorParameter;
mbedAustin 11:cada08fc8a70 1620
mbedAustin 11:cada08fc8a70 1621 if (((P_SCB)sem)->cb_type != SCB) return osErrorParameter;
mbedAustin 11:cada08fc8a70 1622
mbedAustin 11:cada08fc8a70 1623 if (((P_SCB)sem)->tokens == osFeature_Semaphore) return osErrorResource;
mbedAustin 11:cada08fc8a70 1624
mbedAustin 11:cada08fc8a70 1625 rt_sem_send(sem); // Release Semaphore
mbedAustin 11:cada08fc8a70 1626
mbedAustin 11:cada08fc8a70 1627 return osOK;
mbedAustin 11:cada08fc8a70 1628 }
mbedAustin 11:cada08fc8a70 1629
mbedAustin 11:cada08fc8a70 1630 /// Delete a Semaphore that was created by osSemaphoreCreate
mbedAustin 11:cada08fc8a70 1631 osStatus svcSemaphoreDelete (osSemaphoreId semaphore_id) {
mbedAustin 11:cada08fc8a70 1632 OS_ID sem;
mbedAustin 11:cada08fc8a70 1633
mbedAustin 11:cada08fc8a70 1634 sem = rt_id2obj(semaphore_id);
mbedAustin 11:cada08fc8a70 1635 if (sem == NULL) return osErrorParameter;
mbedAustin 11:cada08fc8a70 1636
mbedAustin 11:cada08fc8a70 1637 if (((P_SCB)sem)->cb_type != SCB) return osErrorParameter;
mbedAustin 11:cada08fc8a70 1638
mbedAustin 11:cada08fc8a70 1639 rt_sem_delete(sem); // Delete Semaphore
mbedAustin 11:cada08fc8a70 1640
mbedAustin 11:cada08fc8a70 1641 return osOK;
mbedAustin 11:cada08fc8a70 1642 }
mbedAustin 11:cada08fc8a70 1643
mbedAustin 11:cada08fc8a70 1644
mbedAustin 11:cada08fc8a70 1645 // Semaphore ISR Calls
mbedAustin 11:cada08fc8a70 1646
mbedAustin 11:cada08fc8a70 1647 /// Release a Semaphore
mbedAustin 11:cada08fc8a70 1648 static __INLINE osStatus isrSemaphoreRelease (osSemaphoreId semaphore_id) {
mbedAustin 11:cada08fc8a70 1649 OS_ID sem;
mbedAustin 11:cada08fc8a70 1650
mbedAustin 11:cada08fc8a70 1651 sem = rt_id2obj(semaphore_id);
mbedAustin 11:cada08fc8a70 1652 if (sem == NULL) return osErrorParameter;
mbedAustin 11:cada08fc8a70 1653
mbedAustin 11:cada08fc8a70 1654 if (((P_SCB)sem)->cb_type != SCB) return osErrorParameter;
mbedAustin 11:cada08fc8a70 1655
mbedAustin 11:cada08fc8a70 1656 if (((P_SCB)sem)->tokens == osFeature_Semaphore) return osErrorResource;
mbedAustin 11:cada08fc8a70 1657
mbedAustin 11:cada08fc8a70 1658 isr_sem_send(sem); // Release Semaphore
mbedAustin 11:cada08fc8a70 1659
mbedAustin 11:cada08fc8a70 1660 return osOK;
mbedAustin 11:cada08fc8a70 1661 }
mbedAustin 11:cada08fc8a70 1662
mbedAustin 11:cada08fc8a70 1663
mbedAustin 11:cada08fc8a70 1664 // Semaphore Public API
mbedAustin 11:cada08fc8a70 1665
mbedAustin 11:cada08fc8a70 1666 /// Create and Initialize a Semaphore object
mbedAustin 11:cada08fc8a70 1667 osSemaphoreId osSemaphoreCreate (const osSemaphoreDef_t *semaphore_def, int32_t count) {
mbedAustin 11:cada08fc8a70 1668 if (__exceptional_mode()) return NULL; // Not allowed in ISR
mbedAustin 11:cada08fc8a70 1669 if ((__get_mode() != MODE_USR) && (os_running == 0)) {
mbedAustin 11:cada08fc8a70 1670 // Privileged and not running
mbedAustin 11:cada08fc8a70 1671 return svcSemaphoreCreate(semaphore_def, count);
mbedAustin 11:cada08fc8a70 1672 } else {
mbedAustin 11:cada08fc8a70 1673 return __svcSemaphoreCreate(semaphore_def, count);
mbedAustin 11:cada08fc8a70 1674 }
mbedAustin 11:cada08fc8a70 1675 }
mbedAustin 11:cada08fc8a70 1676
mbedAustin 11:cada08fc8a70 1677 /// Wait until a Semaphore becomes available
mbedAustin 11:cada08fc8a70 1678 int32_t osSemaphoreWait (osSemaphoreId semaphore_id, uint32_t millisec) {
mbedAustin 11:cada08fc8a70 1679 if (__exceptional_mode()) return -1; // Not allowed in ISR
mbedAustin 11:cada08fc8a70 1680 return __svcSemaphoreWait(semaphore_id, millisec);
mbedAustin 11:cada08fc8a70 1681 }
mbedAustin 11:cada08fc8a70 1682
mbedAustin 11:cada08fc8a70 1683 /// Release a Semaphore
mbedAustin 11:cada08fc8a70 1684 osStatus osSemaphoreRelease (osSemaphoreId semaphore_id) {
mbedAustin 11:cada08fc8a70 1685 if (__exceptional_mode()) { // in ISR
mbedAustin 11:cada08fc8a70 1686 return isrSemaphoreRelease(semaphore_id);
mbedAustin 11:cada08fc8a70 1687 } else { // in Thread
mbedAustin 11:cada08fc8a70 1688 return __svcSemaphoreRelease(semaphore_id);
mbedAustin 11:cada08fc8a70 1689 }
mbedAustin 11:cada08fc8a70 1690 }
mbedAustin 11:cada08fc8a70 1691
mbedAustin 11:cada08fc8a70 1692 /// Delete a Semaphore that was created by osSemaphoreCreate
mbedAustin 11:cada08fc8a70 1693 osStatus osSemaphoreDelete (osSemaphoreId semaphore_id) {
mbedAustin 11:cada08fc8a70 1694 if (__exceptional_mode()) return osErrorISR; // Not allowed in ISR
mbedAustin 11:cada08fc8a70 1695 return __svcSemaphoreDelete(semaphore_id);
mbedAustin 11:cada08fc8a70 1696 }
mbedAustin 11:cada08fc8a70 1697
mbedAustin 11:cada08fc8a70 1698
mbedAustin 11:cada08fc8a70 1699 // ==== Memory Management Functions ====
mbedAustin 11:cada08fc8a70 1700
mbedAustin 11:cada08fc8a70 1701 // Memory Management Helper Functions
mbedAustin 11:cada08fc8a70 1702
mbedAustin 11:cada08fc8a70 1703 // Clear Memory Box (Zero init)
mbedAustin 11:cada08fc8a70 1704 static void rt_clr_box (void *box_mem, void *box) {
mbedAustin 11:cada08fc8a70 1705 uint32_t *p, n;
mbedAustin 11:cada08fc8a70 1706
mbedAustin 11:cada08fc8a70 1707 if (box) {
mbedAustin 11:cada08fc8a70 1708 p = box;
mbedAustin 11:cada08fc8a70 1709 for (n = ((P_BM)box_mem)->blk_size; n; n -= 4) {
mbedAustin 11:cada08fc8a70 1710 *p++ = 0;
mbedAustin 11:cada08fc8a70 1711 }
mbedAustin 11:cada08fc8a70 1712 }
mbedAustin 11:cada08fc8a70 1713 }
mbedAustin 11:cada08fc8a70 1714
mbedAustin 11:cada08fc8a70 1715 // Memory Management Service Calls declarations
mbedAustin 11:cada08fc8a70 1716 SVC_1_1(svcPoolCreate, osPoolId, const osPoolDef_t *, RET_pointer)
mbedAustin 11:cada08fc8a70 1717 SVC_2_1(sysPoolAlloc, void *, osPoolId, uint32_t, RET_pointer)
mbedAustin 11:cada08fc8a70 1718 SVC_2_1(sysPoolFree, osStatus, osPoolId, void *, RET_osStatus)
mbedAustin 11:cada08fc8a70 1719
mbedAustin 11:cada08fc8a70 1720 // Memory Management Service & ISR Calls
mbedAustin 11:cada08fc8a70 1721
mbedAustin 11:cada08fc8a70 1722 /// Create and Initialize memory pool
mbedAustin 11:cada08fc8a70 1723 osPoolId svcPoolCreate (const osPoolDef_t *pool_def) {
mbedAustin 11:cada08fc8a70 1724 uint32_t blk_sz;
mbedAustin 11:cada08fc8a70 1725
mbedAustin 11:cada08fc8a70 1726 if ((pool_def == NULL) ||
mbedAustin 11:cada08fc8a70 1727 (pool_def->pool_sz == 0) ||
mbedAustin 11:cada08fc8a70 1728 (pool_def->item_sz == 0) ||
mbedAustin 11:cada08fc8a70 1729 (pool_def->pool == NULL)) {
mbedAustin 11:cada08fc8a70 1730 sysThreadError(osErrorParameter);
mbedAustin 11:cada08fc8a70 1731 return NULL;
mbedAustin 11:cada08fc8a70 1732 }
mbedAustin 11:cada08fc8a70 1733
mbedAustin 11:cada08fc8a70 1734 blk_sz = (pool_def->item_sz + 3) & ~3;
mbedAustin 11:cada08fc8a70 1735
mbedAustin 11:cada08fc8a70 1736 _init_box(pool_def->pool, sizeof(struct OS_BM) + pool_def->pool_sz * blk_sz, blk_sz);
mbedAustin 11:cada08fc8a70 1737
mbedAustin 11:cada08fc8a70 1738 return pool_def->pool;
mbedAustin 11:cada08fc8a70 1739 }
mbedAustin 11:cada08fc8a70 1740
mbedAustin 11:cada08fc8a70 1741 /// Allocate a memory block from a memory pool
mbedAustin 11:cada08fc8a70 1742 void *sysPoolAlloc (osPoolId pool_id, uint32_t clr) {
mbedAustin 11:cada08fc8a70 1743 void *ptr;
mbedAustin 11:cada08fc8a70 1744
mbedAustin 11:cada08fc8a70 1745 if (pool_id == NULL) return NULL;
mbedAustin 11:cada08fc8a70 1746
mbedAustin 11:cada08fc8a70 1747 ptr = rt_alloc_box(pool_id);
mbedAustin 11:cada08fc8a70 1748 if (clr) {
mbedAustin 11:cada08fc8a70 1749 rt_clr_box(pool_id, ptr);
mbedAustin 11:cada08fc8a70 1750 }
mbedAustin 11:cada08fc8a70 1751
mbedAustin 11:cada08fc8a70 1752 return ptr;
mbedAustin 11:cada08fc8a70 1753 }
mbedAustin 11:cada08fc8a70 1754
mbedAustin 11:cada08fc8a70 1755 /// Return an allocated memory block back to a specific memory pool
mbedAustin 11:cada08fc8a70 1756 osStatus sysPoolFree (osPoolId pool_id, void *block) {
mbedAustin 11:cada08fc8a70 1757 int32_t res;
mbedAustin 11:cada08fc8a70 1758
mbedAustin 11:cada08fc8a70 1759 if (pool_id == NULL) return osErrorParameter;
mbedAustin 11:cada08fc8a70 1760
mbedAustin 11:cada08fc8a70 1761 res = rt_free_box(pool_id, block);
mbedAustin 11:cada08fc8a70 1762 if (res != 0) return osErrorValue;
mbedAustin 11:cada08fc8a70 1763
mbedAustin 11:cada08fc8a70 1764 return osOK;
mbedAustin 11:cada08fc8a70 1765 }
mbedAustin 11:cada08fc8a70 1766
mbedAustin 11:cada08fc8a70 1767
mbedAustin 11:cada08fc8a70 1768 // Memory Management Public API
mbedAustin 11:cada08fc8a70 1769
mbedAustin 11:cada08fc8a70 1770 /// Create and Initialize memory pool
mbedAustin 11:cada08fc8a70 1771 osPoolId osPoolCreate (const osPoolDef_t *pool_def) {
mbedAustin 11:cada08fc8a70 1772 if (__exceptional_mode()) return NULL; // Not allowed in ISR
mbedAustin 11:cada08fc8a70 1773 if ((__get_mode() != MODE_USR) && (os_running == 0)) {
mbedAustin 11:cada08fc8a70 1774 // Privileged and not running
mbedAustin 11:cada08fc8a70 1775 return svcPoolCreate(pool_def);
mbedAustin 11:cada08fc8a70 1776 } else {
mbedAustin 11:cada08fc8a70 1777 return __svcPoolCreate(pool_def);
mbedAustin 11:cada08fc8a70 1778 }
mbedAustin 11:cada08fc8a70 1779 }
mbedAustin 11:cada08fc8a70 1780
mbedAustin 11:cada08fc8a70 1781 /// Allocate a memory block from a memory pool
mbedAustin 11:cada08fc8a70 1782 void *osPoolAlloc (osPoolId pool_id) {
mbedAustin 11:cada08fc8a70 1783 if (__get_mode() != MODE_USR) { // in ISR or Privileged
mbedAustin 11:cada08fc8a70 1784 return sysPoolAlloc(pool_id, 0);
mbedAustin 11:cada08fc8a70 1785 } else { // in Thread
mbedAustin 11:cada08fc8a70 1786 return __sysPoolAlloc(pool_id, 0);
mbedAustin 11:cada08fc8a70 1787 }
mbedAustin 11:cada08fc8a70 1788 }
mbedAustin 11:cada08fc8a70 1789
mbedAustin 11:cada08fc8a70 1790 /// Allocate a memory block from a memory pool and set memory block to zero
mbedAustin 11:cada08fc8a70 1791 void *osPoolCAlloc (osPoolId pool_id) {
mbedAustin 11:cada08fc8a70 1792 if (__get_mode() != MODE_USR) { // in ISR or Privileged
mbedAustin 11:cada08fc8a70 1793 return sysPoolAlloc(pool_id, 1);
mbedAustin 11:cada08fc8a70 1794 } else { // in Thread
mbedAustin 11:cada08fc8a70 1795 return __sysPoolAlloc(pool_id, 1);
mbedAustin 11:cada08fc8a70 1796 }
mbedAustin 11:cada08fc8a70 1797 }
mbedAustin 11:cada08fc8a70 1798
mbedAustin 11:cada08fc8a70 1799 /// Return an allocated memory block back to a specific memory pool
mbedAustin 11:cada08fc8a70 1800 osStatus osPoolFree (osPoolId pool_id, void *block) {
mbedAustin 11:cada08fc8a70 1801 if (__get_mode() != MODE_USR) { // in ISR or Privileged
mbedAustin 11:cada08fc8a70 1802 return sysPoolFree(pool_id, block);
mbedAustin 11:cada08fc8a70 1803 } else { // in Thread
mbedAustin 11:cada08fc8a70 1804 return __sysPoolFree(pool_id, block);
mbedAustin 11:cada08fc8a70 1805 }
mbedAustin 11:cada08fc8a70 1806 }
mbedAustin 11:cada08fc8a70 1807
mbedAustin 11:cada08fc8a70 1808
mbedAustin 11:cada08fc8a70 1809 // ==== Message Queue Management Functions ====
mbedAustin 11:cada08fc8a70 1810
mbedAustin 11:cada08fc8a70 1811 // Message Queue Management Service Calls declarations
mbedAustin 11:cada08fc8a70 1812 SVC_2_1(svcMessageCreate, osMessageQId, const osMessageQDef_t *, osThreadId, RET_pointer)
mbedAustin 11:cada08fc8a70 1813 SVC_3_1(svcMessagePut, osStatus, osMessageQId, uint32_t, uint32_t, RET_osStatus)
mbedAustin 11:cada08fc8a70 1814 SVC_2_3(svcMessageGet, os_InRegs osEvent, osMessageQId, uint32_t, RET_osEvent)
mbedAustin 11:cada08fc8a70 1815
mbedAustin 11:cada08fc8a70 1816 // Message Queue Service Calls
mbedAustin 11:cada08fc8a70 1817
mbedAustin 11:cada08fc8a70 1818 /// Create and Initialize Message Queue
mbedAustin 11:cada08fc8a70 1819 osMessageQId svcMessageCreate (const osMessageQDef_t *queue_def, osThreadId thread_id) {
mbedAustin 11:cada08fc8a70 1820
mbedAustin 11:cada08fc8a70 1821 if ((queue_def == NULL) ||
mbedAustin 11:cada08fc8a70 1822 (queue_def->queue_sz == 0) ||
mbedAustin 11:cada08fc8a70 1823 (queue_def->pool == NULL)) {
mbedAustin 11:cada08fc8a70 1824 sysThreadError(osErrorParameter);
mbedAustin 11:cada08fc8a70 1825 return NULL;
mbedAustin 11:cada08fc8a70 1826 }
mbedAustin 11:cada08fc8a70 1827
mbedAustin 11:cada08fc8a70 1828 if (((P_MCB)queue_def->pool)->cb_type != 0) {
mbedAustin 11:cada08fc8a70 1829 sysThreadError(osErrorParameter);
mbedAustin 11:cada08fc8a70 1830 return NULL;
mbedAustin 11:cada08fc8a70 1831 }
mbedAustin 11:cada08fc8a70 1832
mbedAustin 11:cada08fc8a70 1833 rt_mbx_init(queue_def->pool, 4*(queue_def->queue_sz + 4));
mbedAustin 11:cada08fc8a70 1834
mbedAustin 11:cada08fc8a70 1835 return queue_def->pool;
mbedAustin 11:cada08fc8a70 1836 }
mbedAustin 11:cada08fc8a70 1837
mbedAustin 11:cada08fc8a70 1838 /// Put a Message to a Queue
mbedAustin 11:cada08fc8a70 1839 osStatus svcMessagePut (osMessageQId queue_id, uint32_t info, uint32_t millisec) {
mbedAustin 11:cada08fc8a70 1840 OS_RESULT res;
mbedAustin 11:cada08fc8a70 1841
mbedAustin 11:cada08fc8a70 1842 if (queue_id == NULL) return osErrorParameter;
mbedAustin 11:cada08fc8a70 1843
mbedAustin 11:cada08fc8a70 1844 if (((P_MCB)queue_id)->cb_type != MCB) return osErrorParameter;
mbedAustin 11:cada08fc8a70 1845
mbedAustin 11:cada08fc8a70 1846 res = rt_mbx_send(queue_id, (void *)info, rt_ms2tick(millisec));
mbedAustin 11:cada08fc8a70 1847
mbedAustin 11:cada08fc8a70 1848 if (res == OS_R_TMO) {
mbedAustin 11:cada08fc8a70 1849 return (millisec ? osErrorTimeoutResource : osErrorResource);
mbedAustin 11:cada08fc8a70 1850 }
mbedAustin 11:cada08fc8a70 1851
mbedAustin 11:cada08fc8a70 1852 return osOK;
mbedAustin 11:cada08fc8a70 1853 }
mbedAustin 11:cada08fc8a70 1854
mbedAustin 11:cada08fc8a70 1855 /// Get a Message or Wait for a Message from a Queue
mbedAustin 11:cada08fc8a70 1856 os_InRegs osEvent_type svcMessageGet (osMessageQId queue_id, uint32_t millisec) {
mbedAustin 11:cada08fc8a70 1857 OS_RESULT res;
mbedAustin 11:cada08fc8a70 1858 osEvent ret;
mbedAustin 11:cada08fc8a70 1859
mbedAustin 11:cada08fc8a70 1860 if (queue_id == NULL) {
mbedAustin 11:cada08fc8a70 1861 ret.status = osErrorParameter;
mbedAustin 11:cada08fc8a70 1862 #if defined (__GNUC__) && defined (__ARM_PCS_VFP)
mbedAustin 11:cada08fc8a70 1863 osEvent_ret_status;
mbedAustin 11:cada08fc8a70 1864 return;
mbedAustin 11:cada08fc8a70 1865 #else
mbedAustin 11:cada08fc8a70 1866 return osEvent_ret_status;
mbedAustin 11:cada08fc8a70 1867 #endif
mbedAustin 11:cada08fc8a70 1868 }
mbedAustin 11:cada08fc8a70 1869
mbedAustin 11:cada08fc8a70 1870 if (((P_MCB)queue_id)->cb_type != MCB) {
mbedAustin 11:cada08fc8a70 1871 ret.status = osErrorParameter;
mbedAustin 11:cada08fc8a70 1872 #if defined (__GNUC__) && defined (__ARM_PCS_VFP)
mbedAustin 11:cada08fc8a70 1873 osEvent_ret_status;
mbedAustin 11:cada08fc8a70 1874 return;
mbedAustin 11:cada08fc8a70 1875 #else
mbedAustin 11:cada08fc8a70 1876 return osEvent_ret_status;
mbedAustin 11:cada08fc8a70 1877 #endif
mbedAustin 11:cada08fc8a70 1878 }
mbedAustin 11:cada08fc8a70 1879
mbedAustin 11:cada08fc8a70 1880 res = rt_mbx_wait(queue_id, &ret.value.p, rt_ms2tick(millisec));
mbedAustin 11:cada08fc8a70 1881
mbedAustin 11:cada08fc8a70 1882 if (res == OS_R_TMO) {
mbedAustin 11:cada08fc8a70 1883 ret.status = millisec ? osEventTimeout : osOK;
mbedAustin 11:cada08fc8a70 1884 #if defined (__GNUC__) && defined (__ARM_PCS_VFP)
mbedAustin 11:cada08fc8a70 1885 osEvent_ret_value;
mbedAustin 11:cada08fc8a70 1886 return;
mbedAustin 11:cada08fc8a70 1887 #else
mbedAustin 11:cada08fc8a70 1888 return osEvent_ret_value;
mbedAustin 11:cada08fc8a70 1889 #endif
mbedAustin 11:cada08fc8a70 1890 }
mbedAustin 11:cada08fc8a70 1891
mbedAustin 11:cada08fc8a70 1892 ret.status = osEventMessage;
mbedAustin 11:cada08fc8a70 1893
mbedAustin 11:cada08fc8a70 1894 #if defined (__GNUC__) && defined (__ARM_PCS_VFP)
mbedAustin 11:cada08fc8a70 1895 osEvent_ret_value;
mbedAustin 11:cada08fc8a70 1896 return;
mbedAustin 11:cada08fc8a70 1897 #else
mbedAustin 11:cada08fc8a70 1898 return osEvent_ret_value;
mbedAustin 11:cada08fc8a70 1899 #endif
mbedAustin 11:cada08fc8a70 1900 }
mbedAustin 11:cada08fc8a70 1901
mbedAustin 11:cada08fc8a70 1902
mbedAustin 11:cada08fc8a70 1903 // Message Queue ISR Calls
mbedAustin 11:cada08fc8a70 1904
mbedAustin 11:cada08fc8a70 1905 /// Put a Message to a Queue
mbedAustin 11:cada08fc8a70 1906 static __INLINE osStatus isrMessagePut (osMessageQId queue_id, uint32_t info, uint32_t millisec) {
mbedAustin 11:cada08fc8a70 1907
mbedAustin 11:cada08fc8a70 1908 if ((queue_id == NULL) || (millisec != 0)) {
mbedAustin 11:cada08fc8a70 1909 return osErrorParameter;
mbedAustin 11:cada08fc8a70 1910 }
mbedAustin 11:cada08fc8a70 1911
mbedAustin 11:cada08fc8a70 1912 if (((P_MCB)queue_id)->cb_type != MCB) return osErrorParameter;
mbedAustin 11:cada08fc8a70 1913
mbedAustin 11:cada08fc8a70 1914 if (rt_mbx_check(queue_id) == 0) { // Check if Queue is full
mbedAustin 11:cada08fc8a70 1915 return osErrorResource;
mbedAustin 11:cada08fc8a70 1916 }
mbedAustin 11:cada08fc8a70 1917
mbedAustin 11:cada08fc8a70 1918 isr_mbx_send(queue_id, (void *)info);
mbedAustin 11:cada08fc8a70 1919
mbedAustin 11:cada08fc8a70 1920 return osOK;
mbedAustin 11:cada08fc8a70 1921 }
mbedAustin 11:cada08fc8a70 1922
mbedAustin 11:cada08fc8a70 1923 /// Get a Message or Wait for a Message from a Queue
mbedAustin 11:cada08fc8a70 1924 static __INLINE os_InRegs osEvent isrMessageGet (osMessageQId queue_id, uint32_t millisec) {
mbedAustin 11:cada08fc8a70 1925 OS_RESULT res;
mbedAustin 11:cada08fc8a70 1926 osEvent ret;
mbedAustin 11:cada08fc8a70 1927
mbedAustin 11:cada08fc8a70 1928 if ((queue_id == NULL) || (millisec != 0)) {
mbedAustin 11:cada08fc8a70 1929 ret.status = osErrorParameter;
mbedAustin 11:cada08fc8a70 1930 return ret;
mbedAustin 11:cada08fc8a70 1931 }
mbedAustin 11:cada08fc8a70 1932
mbedAustin 11:cada08fc8a70 1933 if (((P_MCB)queue_id)->cb_type != MCB) {
mbedAustin 11:cada08fc8a70 1934 ret.status = osErrorParameter;
mbedAustin 11:cada08fc8a70 1935 return ret;
mbedAustin 11:cada08fc8a70 1936 }
mbedAustin 11:cada08fc8a70 1937
mbedAustin 11:cada08fc8a70 1938 res = isr_mbx_receive(queue_id, &ret.value.p);
mbedAustin 11:cada08fc8a70 1939
mbedAustin 11:cada08fc8a70 1940 if (res != OS_R_MBX) {
mbedAustin 11:cada08fc8a70 1941 ret.status = osOK;
mbedAustin 11:cada08fc8a70 1942 return ret;
mbedAustin 11:cada08fc8a70 1943 }
mbedAustin 11:cada08fc8a70 1944
mbedAustin 11:cada08fc8a70 1945 ret.status = osEventMessage;
mbedAustin 11:cada08fc8a70 1946
mbedAustin 11:cada08fc8a70 1947 return ret;
mbedAustin 11:cada08fc8a70 1948 }
mbedAustin 11:cada08fc8a70 1949
mbedAustin 11:cada08fc8a70 1950
mbedAustin 11:cada08fc8a70 1951 // Message Queue Management Public API
mbedAustin 11:cada08fc8a70 1952
mbedAustin 11:cada08fc8a70 1953 /// Create and Initialize Message Queue
mbedAustin 11:cada08fc8a70 1954 osMessageQId osMessageCreate (const osMessageQDef_t *queue_def, osThreadId thread_id) {
mbedAustin 11:cada08fc8a70 1955 if (__exceptional_mode()) return NULL; // Not allowed in ISR
mbedAustin 11:cada08fc8a70 1956 if ((__get_mode() != MODE_USR) && (os_running == 0)) {
mbedAustin 11:cada08fc8a70 1957 // Privileged and not running
mbedAustin 11:cada08fc8a70 1958 return svcMessageCreate(queue_def, thread_id);
mbedAustin 11:cada08fc8a70 1959 } else {
mbedAustin 11:cada08fc8a70 1960 return __svcMessageCreate(queue_def, thread_id);
mbedAustin 11:cada08fc8a70 1961 }
mbedAustin 11:cada08fc8a70 1962 }
mbedAustin 11:cada08fc8a70 1963
mbedAustin 11:cada08fc8a70 1964 /// Put a Message to a Queue
mbedAustin 11:cada08fc8a70 1965 osStatus osMessagePut (osMessageQId queue_id, uint32_t info, uint32_t millisec) {
mbedAustin 11:cada08fc8a70 1966 if (__exceptional_mode()) { // in ISR
mbedAustin 11:cada08fc8a70 1967 return isrMessagePut(queue_id, info, millisec);
mbedAustin 11:cada08fc8a70 1968 } else { // in Thread
mbedAustin 11:cada08fc8a70 1969 return __svcMessagePut(queue_id, info, millisec);
mbedAustin 11:cada08fc8a70 1970 }
mbedAustin 11:cada08fc8a70 1971 }
mbedAustin 11:cada08fc8a70 1972
mbedAustin 11:cada08fc8a70 1973 /// Get a Message or Wait for a Message from a Queue
mbedAustin 11:cada08fc8a70 1974 os_InRegs osEvent osMessageGet (osMessageQId queue_id, uint32_t millisec) {
mbedAustin 11:cada08fc8a70 1975 if (__exceptional_mode()) { // in ISR
mbedAustin 11:cada08fc8a70 1976 return isrMessageGet(queue_id, millisec);
mbedAustin 11:cada08fc8a70 1977 } else { // in Thread
mbedAustin 11:cada08fc8a70 1978 return __svcMessageGet(queue_id, millisec);
mbedAustin 11:cada08fc8a70 1979 }
mbedAustin 11:cada08fc8a70 1980 }
mbedAustin 11:cada08fc8a70 1981
mbedAustin 11:cada08fc8a70 1982
mbedAustin 11:cada08fc8a70 1983 // ==== Mail Queue Management Functions ====
mbedAustin 11:cada08fc8a70 1984
mbedAustin 11:cada08fc8a70 1985 // Mail Queue Management Service Calls declarations
mbedAustin 11:cada08fc8a70 1986 SVC_2_1(svcMailCreate, osMailQId, const osMailQDef_t *, osThreadId, RET_pointer)
mbedAustin 11:cada08fc8a70 1987 SVC_4_1(sysMailAlloc, void *, osMailQId, uint32_t, uint32_t, uint32_t, RET_pointer)
mbedAustin 11:cada08fc8a70 1988 SVC_3_1(sysMailFree, osStatus, osMailQId, void *, uint32_t, RET_osStatus)
mbedAustin 11:cada08fc8a70 1989
mbedAustin 11:cada08fc8a70 1990 // Mail Queue Management Service & ISR Calls
mbedAustin 11:cada08fc8a70 1991
mbedAustin 11:cada08fc8a70 1992 /// Create and Initialize mail queue
mbedAustin 11:cada08fc8a70 1993 osMailQId svcMailCreate (const osMailQDef_t *queue_def, osThreadId thread_id) {
mbedAustin 11:cada08fc8a70 1994 uint32_t blk_sz;
mbedAustin 11:cada08fc8a70 1995 P_MCB pmcb;
mbedAustin 11:cada08fc8a70 1996 void *pool;
mbedAustin 11:cada08fc8a70 1997
mbedAustin 11:cada08fc8a70 1998 if ((queue_def == NULL) ||
mbedAustin 11:cada08fc8a70 1999 (queue_def->queue_sz == 0) ||
mbedAustin 11:cada08fc8a70 2000 (queue_def->item_sz == 0) ||
mbedAustin 11:cada08fc8a70 2001 (queue_def->pool == NULL)) {
mbedAustin 11:cada08fc8a70 2002 sysThreadError(osErrorParameter);
mbedAustin 11:cada08fc8a70 2003 return NULL;
mbedAustin 11:cada08fc8a70 2004 }
mbedAustin 11:cada08fc8a70 2005
mbedAustin 11:cada08fc8a70 2006 pmcb = *(((void **)queue_def->pool) + 0);
mbedAustin 11:cada08fc8a70 2007 pool = *(((void **)queue_def->pool) + 1);
mbedAustin 11:cada08fc8a70 2008
mbedAustin 11:cada08fc8a70 2009 if ((pool == NULL) || (pmcb == NULL) || (pmcb->cb_type != 0)) {
mbedAustin 11:cada08fc8a70 2010 sysThreadError(osErrorParameter);
mbedAustin 11:cada08fc8a70 2011 return NULL;
mbedAustin 11:cada08fc8a70 2012 }
mbedAustin 11:cada08fc8a70 2013
mbedAustin 11:cada08fc8a70 2014 blk_sz = (queue_def->item_sz + 3) & ~3;
mbedAustin 11:cada08fc8a70 2015
mbedAustin 11:cada08fc8a70 2016 _init_box(pool, sizeof(struct OS_BM) + queue_def->queue_sz * blk_sz, blk_sz);
mbedAustin 11:cada08fc8a70 2017
mbedAustin 11:cada08fc8a70 2018 rt_mbx_init(pmcb, 4*(queue_def->queue_sz + 4));
mbedAustin 11:cada08fc8a70 2019
mbedAustin 11:cada08fc8a70 2020 return queue_def->pool;
mbedAustin 11:cada08fc8a70 2021 }
mbedAustin 11:cada08fc8a70 2022
mbedAustin 11:cada08fc8a70 2023 /// Allocate a memory block from a mail
mbedAustin 11:cada08fc8a70 2024 void *sysMailAlloc (osMailQId queue_id, uint32_t millisec, uint32_t isr, uint32_t clr) {
mbedAustin 11:cada08fc8a70 2025 P_MCB pmcb;
mbedAustin 11:cada08fc8a70 2026 void *pool;
mbedAustin 11:cada08fc8a70 2027 void *mem;
mbedAustin 11:cada08fc8a70 2028
mbedAustin 11:cada08fc8a70 2029 if (queue_id == NULL) return NULL;
mbedAustin 11:cada08fc8a70 2030
mbedAustin 11:cada08fc8a70 2031 pmcb = *(((void **)queue_id) + 0);
mbedAustin 11:cada08fc8a70 2032 pool = *(((void **)queue_id) + 1);
mbedAustin 11:cada08fc8a70 2033
mbedAustin 11:cada08fc8a70 2034 if ((pool == NULL) || (pmcb == NULL)) return NULL;
mbedAustin 11:cada08fc8a70 2035
mbedAustin 11:cada08fc8a70 2036 if (isr && (millisec != 0)) return NULL;
mbedAustin 11:cada08fc8a70 2037
mbedAustin 11:cada08fc8a70 2038 mem = rt_alloc_box(pool);
mbedAustin 11:cada08fc8a70 2039 if (clr) {
mbedAustin 11:cada08fc8a70 2040 rt_clr_box(pool, mem);
mbedAustin 11:cada08fc8a70 2041 }
mbedAustin 11:cada08fc8a70 2042
mbedAustin 11:cada08fc8a70 2043 if ((mem == NULL) && (millisec != 0)) {
mbedAustin 11:cada08fc8a70 2044 // Put Task to sleep when Memory not available
mbedAustin 11:cada08fc8a70 2045 if (pmcb->p_lnk != NULL) {
mbedAustin 11:cada08fc8a70 2046 rt_put_prio((P_XCB)pmcb, os_tsk.run);
mbedAustin 11:cada08fc8a70 2047 } else {
mbedAustin 11:cada08fc8a70 2048 pmcb->p_lnk = os_tsk.run;
mbedAustin 11:cada08fc8a70 2049 os_tsk.run->p_lnk = NULL;
mbedAustin 11:cada08fc8a70 2050 os_tsk.run->p_rlnk = (P_TCB)pmcb;
mbedAustin 11:cada08fc8a70 2051 // Task is waiting to allocate a message
mbedAustin 11:cada08fc8a70 2052 pmcb->state = 3;
mbedAustin 11:cada08fc8a70 2053 }
mbedAustin 11:cada08fc8a70 2054 rt_block(rt_ms2tick(millisec), WAIT_MBX);
mbedAustin 11:cada08fc8a70 2055 }
mbedAustin 11:cada08fc8a70 2056
mbedAustin 11:cada08fc8a70 2057 return mem;
mbedAustin 11:cada08fc8a70 2058 }
mbedAustin 11:cada08fc8a70 2059
mbedAustin 11:cada08fc8a70 2060 /// Free a memory block from a mail
mbedAustin 11:cada08fc8a70 2061 osStatus sysMailFree (osMailQId queue_id, void *mail, uint32_t isr) {
mbedAustin 11:cada08fc8a70 2062 P_MCB pmcb;
mbedAustin 11:cada08fc8a70 2063 P_TCB ptcb;
mbedAustin 11:cada08fc8a70 2064 void *pool;
mbedAustin 11:cada08fc8a70 2065 void *mem;
mbedAustin 11:cada08fc8a70 2066 int32_t res;
mbedAustin 11:cada08fc8a70 2067
mbedAustin 11:cada08fc8a70 2068 if (queue_id == NULL) return osErrorParameter;
mbedAustin 11:cada08fc8a70 2069
mbedAustin 11:cada08fc8a70 2070 pmcb = *(((void **)queue_id) + 0);
mbedAustin 11:cada08fc8a70 2071 pool = *(((void **)queue_id) + 1);
mbedAustin 11:cada08fc8a70 2072
mbedAustin 11:cada08fc8a70 2073 if ((pmcb == NULL) || (pool == NULL)) return osErrorParameter;
mbedAustin 11:cada08fc8a70 2074
mbedAustin 11:cada08fc8a70 2075 res = rt_free_box(pool, mail);
mbedAustin 11:cada08fc8a70 2076
mbedAustin 11:cada08fc8a70 2077 if (res != 0) return osErrorValue;
mbedAustin 11:cada08fc8a70 2078
mbedAustin 11:cada08fc8a70 2079 if ((pmcb->p_lnk != NULL) && (pmcb->state == 3)) {
mbedAustin 11:cada08fc8a70 2080 // Task is waiting to allocate a message
mbedAustin 11:cada08fc8a70 2081 if (isr) {
mbedAustin 11:cada08fc8a70 2082 rt_psq_enq (pmcb, (U32)pool);
mbedAustin 11:cada08fc8a70 2083 rt_psh_req ();
mbedAustin 11:cada08fc8a70 2084 } else {
mbedAustin 11:cada08fc8a70 2085 mem = rt_alloc_box(pool);
mbedAustin 11:cada08fc8a70 2086 if (mem != NULL) {
mbedAustin 11:cada08fc8a70 2087 ptcb = rt_get_first((P_XCB)pmcb);
mbedAustin 11:cada08fc8a70 2088 rt_ret_val(ptcb, (U32)mem);
mbedAustin 11:cada08fc8a70 2089 rt_rmv_dly(ptcb);
mbedAustin 11:cada08fc8a70 2090 rt_dispatch(ptcb);
mbedAustin 11:cada08fc8a70 2091 }
mbedAustin 11:cada08fc8a70 2092 }
mbedAustin 11:cada08fc8a70 2093 }
mbedAustin 11:cada08fc8a70 2094
mbedAustin 11:cada08fc8a70 2095 return osOK;
mbedAustin 11:cada08fc8a70 2096 }
mbedAustin 11:cada08fc8a70 2097
mbedAustin 11:cada08fc8a70 2098
mbedAustin 11:cada08fc8a70 2099 // Mail Queue Management Public API
mbedAustin 11:cada08fc8a70 2100
mbedAustin 11:cada08fc8a70 2101 /// Create and Initialize mail queue
mbedAustin 11:cada08fc8a70 2102 osMailQId osMailCreate (const osMailQDef_t *queue_def, osThreadId thread_id) {
mbedAustin 11:cada08fc8a70 2103 if (__exceptional_mode()) return NULL; // Not allowed in ISR
mbedAustin 11:cada08fc8a70 2104 if ((__get_mode() != MODE_USR) && (os_running == 0)) {
mbedAustin 11:cada08fc8a70 2105 // Privileged and not running
mbedAustin 11:cada08fc8a70 2106 return svcMailCreate(queue_def, thread_id);
mbedAustin 11:cada08fc8a70 2107 } else {
mbedAustin 11:cada08fc8a70 2108 return __svcMailCreate(queue_def, thread_id);
mbedAustin 11:cada08fc8a70 2109 }
mbedAustin 11:cada08fc8a70 2110 }
mbedAustin 11:cada08fc8a70 2111
mbedAustin 11:cada08fc8a70 2112 /// Allocate a memory block from a mail
mbedAustin 11:cada08fc8a70 2113 void *osMailAlloc (osMailQId queue_id, uint32_t millisec) {
mbedAustin 11:cada08fc8a70 2114 if (__exceptional_mode()) { // in ISR
mbedAustin 11:cada08fc8a70 2115 return sysMailAlloc(queue_id, millisec, 1, 0);
mbedAustin 11:cada08fc8a70 2116 } else { // in Thread
mbedAustin 11:cada08fc8a70 2117 return __sysMailAlloc(queue_id, millisec, 0, 0);
mbedAustin 11:cada08fc8a70 2118 }
mbedAustin 11:cada08fc8a70 2119 }
mbedAustin 11:cada08fc8a70 2120
mbedAustin 11:cada08fc8a70 2121 /// Allocate a memory block from a mail and set memory block to zero
mbedAustin 11:cada08fc8a70 2122 void *osMailCAlloc (osMailQId queue_id, uint32_t millisec) {
mbedAustin 11:cada08fc8a70 2123 if (__exceptional_mode()) { // in ISR
mbedAustin 11:cada08fc8a70 2124 return sysMailAlloc(queue_id, millisec, 1, 1);
mbedAustin 11:cada08fc8a70 2125 } else { // in Thread
mbedAustin 11:cada08fc8a70 2126 return __sysMailAlloc(queue_id, millisec, 0, 1);
mbedAustin 11:cada08fc8a70 2127 }
mbedAustin 11:cada08fc8a70 2128 }
mbedAustin 11:cada08fc8a70 2129
mbedAustin 11:cada08fc8a70 2130 /// Free a memory block from a mail
mbedAustin 11:cada08fc8a70 2131 osStatus osMailFree (osMailQId queue_id, void *mail) {
mbedAustin 11:cada08fc8a70 2132 if (__exceptional_mode()) { // in ISR
mbedAustin 11:cada08fc8a70 2133 return sysMailFree(queue_id, mail, 1);
mbedAustin 11:cada08fc8a70 2134 } else { // in Thread
mbedAustin 11:cada08fc8a70 2135 return __sysMailFree(queue_id, mail, 0);
mbedAustin 11:cada08fc8a70 2136 }
mbedAustin 11:cada08fc8a70 2137 }
mbedAustin 11:cada08fc8a70 2138
mbedAustin 11:cada08fc8a70 2139 /// Put a mail to a queue
mbedAustin 11:cada08fc8a70 2140 osStatus osMailPut (osMailQId queue_id, void *mail) {
mbedAustin 11:cada08fc8a70 2141 if (queue_id == NULL) return osErrorParameter;
mbedAustin 11:cada08fc8a70 2142 if (mail == NULL) return osErrorValue;
mbedAustin 11:cada08fc8a70 2143 return osMessagePut(*((void **)queue_id), (uint32_t)mail, 0);
mbedAustin 11:cada08fc8a70 2144 }
mbedAustin 11:cada08fc8a70 2145
mbedAustin 11:cada08fc8a70 2146 #ifdef __CC_ARM
mbedAustin 11:cada08fc8a70 2147 #pragma push
mbedAustin 11:cada08fc8a70 2148 #pragma Ospace
mbedAustin 11:cada08fc8a70 2149 #endif // __arm__
mbedAustin 11:cada08fc8a70 2150 /// Get a mail from a queue
mbedAustin 11:cada08fc8a70 2151 os_InRegs osEvent osMailGet (osMailQId queue_id, uint32_t millisec) {
mbedAustin 11:cada08fc8a70 2152 osEvent ret;
mbedAustin 11:cada08fc8a70 2153
mbedAustin 11:cada08fc8a70 2154 if (queue_id == NULL) {
mbedAustin 11:cada08fc8a70 2155 ret.status = osErrorParameter;
mbedAustin 11:cada08fc8a70 2156 return ret;
mbedAustin 11:cada08fc8a70 2157 }
mbedAustin 11:cada08fc8a70 2158
mbedAustin 11:cada08fc8a70 2159 ret = osMessageGet(*((void **)queue_id), millisec);
mbedAustin 11:cada08fc8a70 2160 if (ret.status == osEventMessage) ret.status = osEventMail;
mbedAustin 11:cada08fc8a70 2161
mbedAustin 11:cada08fc8a70 2162 return ret;
mbedAustin 11:cada08fc8a70 2163 }
mbedAustin 11:cada08fc8a70 2164 #ifdef __CC_ARM
mbedAustin 11:cada08fc8a70 2165 #pragma pop
mbedAustin 11:cada08fc8a70 2166 #endif // __arm__
mbedAustin 11:cada08fc8a70 2167
mbedAustin 11:cada08fc8a70 2168
mbedAustin 11:cada08fc8a70 2169 // ==== RTX Extensions ====
mbedAustin 11:cada08fc8a70 2170
mbedAustin 11:cada08fc8a70 2171 // Service Calls declarations
mbedAustin 11:cada08fc8a70 2172 SVC_0_1(rt_suspend, uint32_t, RET_uint32_t)
mbedAustin 11:cada08fc8a70 2173 SVC_1_0(rt_resume, void, uint32_t)
mbedAustin 11:cada08fc8a70 2174
mbedAustin 11:cada08fc8a70 2175
mbedAustin 11:cada08fc8a70 2176 // Public API
mbedAustin 11:cada08fc8a70 2177
mbedAustin 11:cada08fc8a70 2178 /// Suspends the OS task scheduler
mbedAustin 11:cada08fc8a70 2179 uint32_t os_suspend (void) {
mbedAustin 11:cada08fc8a70 2180 return __rt_suspend();
mbedAustin 11:cada08fc8a70 2181 }
mbedAustin 11:cada08fc8a70 2182
mbedAustin 11:cada08fc8a70 2183 /// Resumes the OS task scheduler
mbedAustin 11:cada08fc8a70 2184 void os_resume (uint32_t sleep_time) {
mbedAustin 11:cada08fc8a70 2185 __rt_resume(sleep_time);
mbedAustin 11:cada08fc8a70 2186 }