OS2

Dependents:   GYRO_MPU6050 Bluetooth_Powered_Multimeter_Using_STM32F429_and_RTOS fyp

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

Who changed what in which revision?

UserRevisionLine numberNew contents of line
guilhemMBED 0:a7c449cd2d5a 1 /*----------------------------------------------------------------------------
guilhemMBED 0:a7c449cd2d5a 2 * RL-ARM - RTX
guilhemMBED 0:a7c449cd2d5a 3 *----------------------------------------------------------------------------
guilhemMBED 0:a7c449cd2d5a 4 * Name: RT_SYSTEM.C
guilhemMBED 0:a7c449cd2d5a 5 * Purpose: System Task Manager
guilhemMBED 0:a7c449cd2d5a 6 * Rev.: 8 April 2015
guilhemMBED 0:a7c449cd2d5a 7 *----------------------------------------------------------------------------
guilhemMBED 0:a7c449cd2d5a 8 *
guilhemMBED 0:a7c449cd2d5a 9 * Copyright (c) 1999-2009 KEIL, 2009-2015 ARM Germany GmbH
guilhemMBED 0:a7c449cd2d5a 10 * All rights reserved.
guilhemMBED 0:a7c449cd2d5a 11 * Redistribution and use in source and binary forms, with or without
guilhemMBED 0:a7c449cd2d5a 12 * modification, are permitted provided that the following conditions are met:
guilhemMBED 0:a7c449cd2d5a 13 * - Redistributions of source code must retain the above copyright
guilhemMBED 0:a7c449cd2d5a 14 * notice, this list of conditions and the following disclaimer.
guilhemMBED 0:a7c449cd2d5a 15 * - Redistributions in binary form must reproduce the above copyright
guilhemMBED 0:a7c449cd2d5a 16 * notice, this list of conditions and the following disclaimer in the
guilhemMBED 0:a7c449cd2d5a 17 * documentation and/or other materials provided with the distribution.
guilhemMBED 0:a7c449cd2d5a 18 * - Neither the name of ARM nor the names of its contributors may be used
guilhemMBED 0:a7c449cd2d5a 19 * to endorse or promote products derived from this software without
guilhemMBED 0:a7c449cd2d5a 20 * specific prior written permission.
guilhemMBED 0:a7c449cd2d5a 21 *
guilhemMBED 0:a7c449cd2d5a 22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
guilhemMBED 0:a7c449cd2d5a 23 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
guilhemMBED 0:a7c449cd2d5a 24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
guilhemMBED 0:a7c449cd2d5a 25 * ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
guilhemMBED 0:a7c449cd2d5a 26 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
guilhemMBED 0:a7c449cd2d5a 27 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
guilhemMBED 0:a7c449cd2d5a 28 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
guilhemMBED 0:a7c449cd2d5a 29 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
guilhemMBED 0:a7c449cd2d5a 30 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
guilhemMBED 0:a7c449cd2d5a 31 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
guilhemMBED 0:a7c449cd2d5a 32 * POSSIBILITY OF SUCH DAMAGE.
guilhemMBED 0:a7c449cd2d5a 33 *---------------------------------------------------------------------------*/
guilhemMBED 0:a7c449cd2d5a 34
guilhemMBED 0:a7c449cd2d5a 35 #include "rt_TypeDef.h"
guilhemMBED 0:a7c449cd2d5a 36 #include "RTX_Config.h"
guilhemMBED 0:a7c449cd2d5a 37 #include "rt_Task.h"
guilhemMBED 0:a7c449cd2d5a 38 #include "rt_System.h"
guilhemMBED 0:a7c449cd2d5a 39 #include "rt_Event.h"
guilhemMBED 0:a7c449cd2d5a 40 #include "rt_List.h"
guilhemMBED 0:a7c449cd2d5a 41 #include "rt_Mailbox.h"
guilhemMBED 0:a7c449cd2d5a 42 #include "rt_Semaphore.h"
guilhemMBED 0:a7c449cd2d5a 43 #include "rt_Time.h"
guilhemMBED 0:a7c449cd2d5a 44 #include "rt_Timer.h"
guilhemMBED 0:a7c449cd2d5a 45 #include "rt_Robin.h"
guilhemMBED 0:a7c449cd2d5a 46 #ifdef __CORTEX_A9
guilhemMBED 0:a7c449cd2d5a 47 #include "rt_HAL_CA.h"
guilhemMBED 0:a7c449cd2d5a 48 #else
guilhemMBED 0:a7c449cd2d5a 49 #include "rt_HAL_CM.h"
guilhemMBED 0:a7c449cd2d5a 50 #endif
guilhemMBED 0:a7c449cd2d5a 51
guilhemMBED 0:a7c449cd2d5a 52 /*----------------------------------------------------------------------------
guilhemMBED 0:a7c449cd2d5a 53 * Global Variables
guilhemMBED 0:a7c449cd2d5a 54 *---------------------------------------------------------------------------*/
guilhemMBED 0:a7c449cd2d5a 55
guilhemMBED 0:a7c449cd2d5a 56 int os_tick_irqn;
guilhemMBED 0:a7c449cd2d5a 57 U8 scheduler_suspended = 0; // flag set by rt_suspend, cleared by rt_resume, read by SVC_Handler
guilhemMBED 0:a7c449cd2d5a 58
guilhemMBED 0:a7c449cd2d5a 59 /*----------------------------------------------------------------------------
guilhemMBED 0:a7c449cd2d5a 60 * Local Variables
guilhemMBED 0:a7c449cd2d5a 61 *---------------------------------------------------------------------------*/
guilhemMBED 0:a7c449cd2d5a 62
guilhemMBED 0:a7c449cd2d5a 63 static volatile BIT os_lock;
guilhemMBED 0:a7c449cd2d5a 64 static volatile BIT os_psh_flag;
guilhemMBED 0:a7c449cd2d5a 65 #ifndef __CORTEX_A9
guilhemMBED 0:a7c449cd2d5a 66 static U8 pend_flags;
guilhemMBED 0:a7c449cd2d5a 67 #endif
guilhemMBED 0:a7c449cd2d5a 68 /*----------------------------------------------------------------------------
guilhemMBED 0:a7c449cd2d5a 69 * Global Functions
guilhemMBED 0:a7c449cd2d5a 70 *---------------------------------------------------------------------------*/
guilhemMBED 0:a7c449cd2d5a 71
guilhemMBED 0:a7c449cd2d5a 72 #define RL_RTX_VER 0x473
guilhemMBED 0:a7c449cd2d5a 73
guilhemMBED 0:a7c449cd2d5a 74 #if defined (__CC_ARM)
guilhemMBED 0:a7c449cd2d5a 75 __asm void $$RTX$$version (void) {
guilhemMBED 0:a7c449cd2d5a 76 /* Export a version number symbol for a version control. */
guilhemMBED 0:a7c449cd2d5a 77
guilhemMBED 0:a7c449cd2d5a 78 EXPORT __RL_RTX_VER
guilhemMBED 0:a7c449cd2d5a 79
guilhemMBED 0:a7c449cd2d5a 80 __RL_RTX_VER EQU RL_RTX_VER
guilhemMBED 0:a7c449cd2d5a 81 }
guilhemMBED 0:a7c449cd2d5a 82 #endif
guilhemMBED 0:a7c449cd2d5a 83
guilhemMBED 0:a7c449cd2d5a 84
guilhemMBED 0:a7c449cd2d5a 85 /*--------------------------- rt_suspend ------------------------------------*/
guilhemMBED 0:a7c449cd2d5a 86
guilhemMBED 0:a7c449cd2d5a 87 extern U32 sysUserTimerWakeupTime(void);
guilhemMBED 0:a7c449cd2d5a 88
guilhemMBED 0:a7c449cd2d5a 89 U32 rt_suspend (void) {
guilhemMBED 0:a7c449cd2d5a 90 /* Suspend OS scheduler */
guilhemMBED 0:a7c449cd2d5a 91 U32 delta = 0xFFFF;
guilhemMBED 0:a7c449cd2d5a 92 #ifdef __CMSIS_RTOS
guilhemMBED 0:a7c449cd2d5a 93 U32 sleep;
guilhemMBED 0:a7c449cd2d5a 94 #endif
guilhemMBED 0:a7c449cd2d5a 95
guilhemMBED 0:a7c449cd2d5a 96 rt_tsk_lock();
guilhemMBED 0:a7c449cd2d5a 97 scheduler_suspended = 1;
guilhemMBED 0:a7c449cd2d5a 98
guilhemMBED 0:a7c449cd2d5a 99 if (os_dly.p_dlnk) {
guilhemMBED 0:a7c449cd2d5a 100 delta = os_dly.delta_time;
guilhemMBED 0:a7c449cd2d5a 101 }
guilhemMBED 0:a7c449cd2d5a 102 #ifdef __CMSIS_RTOS
guilhemMBED 0:a7c449cd2d5a 103 sleep = sysUserTimerWakeupTime();
guilhemMBED 0:a7c449cd2d5a 104 if (sleep < delta) delta = sleep;
guilhemMBED 0:a7c449cd2d5a 105 #else
guilhemMBED 0:a7c449cd2d5a 106 if (os_tmr.next) {
guilhemMBED 0:a7c449cd2d5a 107 if (os_tmr.tcnt < delta) delta = os_tmr.tcnt;
guilhemMBED 0:a7c449cd2d5a 108 }
guilhemMBED 0:a7c449cd2d5a 109 #endif
guilhemMBED 0:a7c449cd2d5a 110
guilhemMBED 0:a7c449cd2d5a 111 return (delta);
guilhemMBED 0:a7c449cd2d5a 112 }
guilhemMBED 0:a7c449cd2d5a 113
guilhemMBED 0:a7c449cd2d5a 114
guilhemMBED 0:a7c449cd2d5a 115 /*--------------------------- rt_resume -------------------------------------*/
guilhemMBED 0:a7c449cd2d5a 116
guilhemMBED 0:a7c449cd2d5a 117 extern void sysUserTimerUpdate (U32 sleep_time);
guilhemMBED 0:a7c449cd2d5a 118
guilhemMBED 0:a7c449cd2d5a 119 void rt_resume (U32 sleep_time) {
guilhemMBED 0:a7c449cd2d5a 120 /* Resume OS scheduler after suspend */
guilhemMBED 0:a7c449cd2d5a 121 P_TCB next;
guilhemMBED 0:a7c449cd2d5a 122 U32 delta;
guilhemMBED 0:a7c449cd2d5a 123
guilhemMBED 0:a7c449cd2d5a 124 os_tsk.run->state = READY;
guilhemMBED 0:a7c449cd2d5a 125 rt_put_rdy_first (os_tsk.run);
guilhemMBED 0:a7c449cd2d5a 126
guilhemMBED 0:a7c449cd2d5a 127 os_robin.task = NULL;
guilhemMBED 0:a7c449cd2d5a 128
guilhemMBED 0:a7c449cd2d5a 129 /* Update delays. */
guilhemMBED 0:a7c449cd2d5a 130 if (os_dly.p_dlnk) {
guilhemMBED 0:a7c449cd2d5a 131 delta = sleep_time;
guilhemMBED 0:a7c449cd2d5a 132 if (delta >= os_dly.delta_time) {
guilhemMBED 0:a7c449cd2d5a 133 delta -= os_dly.delta_time;
guilhemMBED 0:a7c449cd2d5a 134 os_time += os_dly.delta_time;
guilhemMBED 0:a7c449cd2d5a 135 os_dly.delta_time = 1;
guilhemMBED 0:a7c449cd2d5a 136 while (os_dly.p_dlnk) {
guilhemMBED 0:a7c449cd2d5a 137 rt_dec_dly();
guilhemMBED 0:a7c449cd2d5a 138 if (delta == 0) break;
guilhemMBED 0:a7c449cd2d5a 139 delta--;
guilhemMBED 0:a7c449cd2d5a 140 os_time++;
guilhemMBED 0:a7c449cd2d5a 141 }
guilhemMBED 0:a7c449cd2d5a 142 } else {
guilhemMBED 0:a7c449cd2d5a 143 os_time += delta;
guilhemMBED 0:a7c449cd2d5a 144 os_dly.delta_time -= delta;
guilhemMBED 0:a7c449cd2d5a 145 }
guilhemMBED 0:a7c449cd2d5a 146 } else {
guilhemMBED 0:a7c449cd2d5a 147 os_time += sleep_time;
guilhemMBED 0:a7c449cd2d5a 148 }
guilhemMBED 0:a7c449cd2d5a 149
guilhemMBED 0:a7c449cd2d5a 150 /* Check the user timers. */
guilhemMBED 0:a7c449cd2d5a 151 #ifdef __CMSIS_RTOS
guilhemMBED 0:a7c449cd2d5a 152 sysUserTimerUpdate(sleep_time);
guilhemMBED 0:a7c449cd2d5a 153 #else
guilhemMBED 0:a7c449cd2d5a 154 if (os_tmr.next) {
guilhemMBED 0:a7c449cd2d5a 155 delta = sleep_time;
guilhemMBED 0:a7c449cd2d5a 156 if (delta >= os_tmr.tcnt) {
guilhemMBED 0:a7c449cd2d5a 157 delta -= os_tmr.tcnt;
guilhemMBED 0:a7c449cd2d5a 158 os_tmr.tcnt = 1;
guilhemMBED 0:a7c449cd2d5a 159 while (os_tmr.next) {
guilhemMBED 0:a7c449cd2d5a 160 rt_tmr_tick();
guilhemMBED 0:a7c449cd2d5a 161 if (delta == 0) break;
guilhemMBED 0:a7c449cd2d5a 162 delta--;
guilhemMBED 0:a7c449cd2d5a 163 }
guilhemMBED 0:a7c449cd2d5a 164 } else {
guilhemMBED 0:a7c449cd2d5a 165 os_tmr.tcnt -= delta;
guilhemMBED 0:a7c449cd2d5a 166 }
guilhemMBED 0:a7c449cd2d5a 167 }
guilhemMBED 0:a7c449cd2d5a 168 #endif
guilhemMBED 0:a7c449cd2d5a 169
guilhemMBED 0:a7c449cd2d5a 170 /* Switch back to highest ready task */
guilhemMBED 0:a7c449cd2d5a 171 next = rt_get_first (&os_rdy);
guilhemMBED 0:a7c449cd2d5a 172 rt_switch_req (next);
guilhemMBED 0:a7c449cd2d5a 173
guilhemMBED 0:a7c449cd2d5a 174 scheduler_suspended = 0;
guilhemMBED 0:a7c449cd2d5a 175 rt_tsk_unlock();
guilhemMBED 0:a7c449cd2d5a 176 }
guilhemMBED 0:a7c449cd2d5a 177
guilhemMBED 0:a7c449cd2d5a 178
guilhemMBED 0:a7c449cd2d5a 179 /*--------------------------- rt_tsk_lock -----------------------------------*/
guilhemMBED 0:a7c449cd2d5a 180
guilhemMBED 0:a7c449cd2d5a 181 void rt_tsk_lock (void) {
guilhemMBED 0:a7c449cd2d5a 182 /* Prevent task switching by locking out scheduler */
guilhemMBED 0:a7c449cd2d5a 183 if (os_lock == __TRUE) // don't lock again if already locked
guilhemMBED 0:a7c449cd2d5a 184 return;
guilhemMBED 0:a7c449cd2d5a 185
guilhemMBED 0:a7c449cd2d5a 186 if (os_tick_irqn < 0) {
guilhemMBED 0:a7c449cd2d5a 187 OS_LOCK();
guilhemMBED 0:a7c449cd2d5a 188 os_lock = __TRUE;
guilhemMBED 0:a7c449cd2d5a 189 OS_UNPEND (&pend_flags);
guilhemMBED 0:a7c449cd2d5a 190 } else {
guilhemMBED 0:a7c449cd2d5a 191 OS_X_LOCK(os_tick_irqn);
guilhemMBED 0:a7c449cd2d5a 192 os_lock = __TRUE;
guilhemMBED 0:a7c449cd2d5a 193 OS_X_UNPEND (&pend_flags);
guilhemMBED 0:a7c449cd2d5a 194 }
guilhemMBED 0:a7c449cd2d5a 195 }
guilhemMBED 0:a7c449cd2d5a 196
guilhemMBED 0:a7c449cd2d5a 197
guilhemMBED 0:a7c449cd2d5a 198 /*--------------------------- rt_tsk_unlock ---------------------------------*/
guilhemMBED 0:a7c449cd2d5a 199
guilhemMBED 0:a7c449cd2d5a 200 void rt_tsk_unlock (void) {
guilhemMBED 0:a7c449cd2d5a 201 /* Unlock scheduler and re-enable task switching */
guilhemMBED 0:a7c449cd2d5a 202 if (os_tick_irqn < 0) {
guilhemMBED 0:a7c449cd2d5a 203 OS_UNLOCK();
guilhemMBED 0:a7c449cd2d5a 204 os_lock = __FALSE;
guilhemMBED 0:a7c449cd2d5a 205 OS_PEND (pend_flags, os_psh_flag);
guilhemMBED 0:a7c449cd2d5a 206 os_psh_flag = __FALSE;
guilhemMBED 0:a7c449cd2d5a 207 } else {
guilhemMBED 0:a7c449cd2d5a 208 OS_X_UNLOCK(os_tick_irqn);
guilhemMBED 0:a7c449cd2d5a 209 os_lock = __FALSE;
guilhemMBED 0:a7c449cd2d5a 210 OS_X_PEND (pend_flags, os_psh_flag);
guilhemMBED 0:a7c449cd2d5a 211 os_psh_flag = __FALSE;
guilhemMBED 0:a7c449cd2d5a 212 }
guilhemMBED 0:a7c449cd2d5a 213 }
guilhemMBED 0:a7c449cd2d5a 214
guilhemMBED 0:a7c449cd2d5a 215
guilhemMBED 0:a7c449cd2d5a 216 /*--------------------------- rt_psh_req ------------------------------------*/
guilhemMBED 0:a7c449cd2d5a 217
guilhemMBED 0:a7c449cd2d5a 218 void rt_psh_req (void) {
guilhemMBED 0:a7c449cd2d5a 219 /* Initiate a post service handling request if required. */
guilhemMBED 0:a7c449cd2d5a 220 if (os_lock == __FALSE) {
guilhemMBED 0:a7c449cd2d5a 221 OS_PEND_IRQ ();
guilhemMBED 0:a7c449cd2d5a 222 }
guilhemMBED 0:a7c449cd2d5a 223 else {
guilhemMBED 0:a7c449cd2d5a 224 os_psh_flag = __TRUE;
guilhemMBED 0:a7c449cd2d5a 225 }
guilhemMBED 0:a7c449cd2d5a 226 }
guilhemMBED 0:a7c449cd2d5a 227
guilhemMBED 0:a7c449cd2d5a 228
guilhemMBED 0:a7c449cd2d5a 229 /*--------------------------- rt_pop_req ------------------------------------*/
guilhemMBED 0:a7c449cd2d5a 230
guilhemMBED 0:a7c449cd2d5a 231 void rt_pop_req (void) {
guilhemMBED 0:a7c449cd2d5a 232 /* Process an ISR post service requests. */
guilhemMBED 0:a7c449cd2d5a 233 struct OS_XCB *p_CB;
guilhemMBED 0:a7c449cd2d5a 234 P_TCB next;
guilhemMBED 0:a7c449cd2d5a 235 U32 idx;
guilhemMBED 0:a7c449cd2d5a 236
guilhemMBED 0:a7c449cd2d5a 237 os_tsk.run->state = READY;
guilhemMBED 0:a7c449cd2d5a 238 rt_put_rdy_first (os_tsk.run);
guilhemMBED 0:a7c449cd2d5a 239
guilhemMBED 0:a7c449cd2d5a 240 idx = os_psq->last;
guilhemMBED 0:a7c449cd2d5a 241 while (os_psq->count) {
guilhemMBED 0:a7c449cd2d5a 242 p_CB = os_psq->q[idx].id;
guilhemMBED 0:a7c449cd2d5a 243 if (p_CB->cb_type == TCB) {
guilhemMBED 0:a7c449cd2d5a 244 /* Is of TCB type */
guilhemMBED 0:a7c449cd2d5a 245 rt_evt_psh ((P_TCB)p_CB, (U16)os_psq->q[idx].arg);
guilhemMBED 0:a7c449cd2d5a 246 }
guilhemMBED 0:a7c449cd2d5a 247 else if (p_CB->cb_type == MCB) {
guilhemMBED 0:a7c449cd2d5a 248 /* Is of MCB type */
guilhemMBED 0:a7c449cd2d5a 249 rt_mbx_psh ((P_MCB)p_CB, (void *)os_psq->q[idx].arg);
guilhemMBED 0:a7c449cd2d5a 250 }
guilhemMBED 0:a7c449cd2d5a 251 else {
guilhemMBED 0:a7c449cd2d5a 252 /* Must be of SCB type */
guilhemMBED 0:a7c449cd2d5a 253 rt_sem_psh ((P_SCB)p_CB);
guilhemMBED 0:a7c449cd2d5a 254 }
guilhemMBED 0:a7c449cd2d5a 255 if (++idx == os_psq->size) idx = 0;
guilhemMBED 0:a7c449cd2d5a 256 rt_dec (&os_psq->count);
guilhemMBED 0:a7c449cd2d5a 257 }
guilhemMBED 0:a7c449cd2d5a 258 os_psq->last = idx;
guilhemMBED 0:a7c449cd2d5a 259
guilhemMBED 0:a7c449cd2d5a 260 next = rt_get_first (&os_rdy);
guilhemMBED 0:a7c449cd2d5a 261 rt_switch_req (next);
guilhemMBED 0:a7c449cd2d5a 262 }
guilhemMBED 0:a7c449cd2d5a 263
guilhemMBED 0:a7c449cd2d5a 264
guilhemMBED 0:a7c449cd2d5a 265 /*--------------------------- os_tick_init ----------------------------------*/
guilhemMBED 0:a7c449cd2d5a 266
guilhemMBED 0:a7c449cd2d5a 267 __weak int os_tick_init (void) {
guilhemMBED 0:a7c449cd2d5a 268 /* Initialize SysTick timer as system tick timer. */
guilhemMBED 0:a7c449cd2d5a 269 rt_systick_init ();
guilhemMBED 0:a7c449cd2d5a 270 return (-1); /* Return IRQ number of SysTick timer */
guilhemMBED 0:a7c449cd2d5a 271 }
guilhemMBED 0:a7c449cd2d5a 272
guilhemMBED 0:a7c449cd2d5a 273 /*--------------------------- os_tick_val -----------------------------------*/
guilhemMBED 0:a7c449cd2d5a 274
guilhemMBED 0:a7c449cd2d5a 275 __weak U32 os_tick_val (void) {
guilhemMBED 0:a7c449cd2d5a 276 /* Get SysTick timer current value (0 .. OS_TRV). */
guilhemMBED 0:a7c449cd2d5a 277 return rt_systick_val();
guilhemMBED 0:a7c449cd2d5a 278 }
guilhemMBED 0:a7c449cd2d5a 279
guilhemMBED 0:a7c449cd2d5a 280 /*--------------------------- os_tick_ovf -----------------------------------*/
guilhemMBED 0:a7c449cd2d5a 281
guilhemMBED 0:a7c449cd2d5a 282 __weak U32 os_tick_ovf (void) {
guilhemMBED 0:a7c449cd2d5a 283 /* Get SysTick timer overflow flag */
guilhemMBED 0:a7c449cd2d5a 284 return rt_systick_ovf();
guilhemMBED 0:a7c449cd2d5a 285 }
guilhemMBED 0:a7c449cd2d5a 286
guilhemMBED 0:a7c449cd2d5a 287 /*--------------------------- os_tick_irqack --------------------------------*/
guilhemMBED 0:a7c449cd2d5a 288
guilhemMBED 0:a7c449cd2d5a 289 __weak void os_tick_irqack (void) {
guilhemMBED 0:a7c449cd2d5a 290 /* Acknowledge timer interrupt. */
guilhemMBED 0:a7c449cd2d5a 291 }
guilhemMBED 0:a7c449cd2d5a 292
guilhemMBED 0:a7c449cd2d5a 293
guilhemMBED 0:a7c449cd2d5a 294 /*--------------------------- rt_systick ------------------------------------*/
guilhemMBED 0:a7c449cd2d5a 295
guilhemMBED 0:a7c449cd2d5a 296 extern void sysTimerTick(void);
guilhemMBED 0:a7c449cd2d5a 297
guilhemMBED 0:a7c449cd2d5a 298 void rt_systick (void) {
guilhemMBED 0:a7c449cd2d5a 299 /* Check for system clock update, suspend running task. */
guilhemMBED 0:a7c449cd2d5a 300 P_TCB next;
guilhemMBED 0:a7c449cd2d5a 301
guilhemMBED 0:a7c449cd2d5a 302 os_tsk.run->state = READY;
guilhemMBED 0:a7c449cd2d5a 303 rt_put_rdy_first (os_tsk.run);
guilhemMBED 0:a7c449cd2d5a 304
guilhemMBED 0:a7c449cd2d5a 305 /* Check Round Robin timeout. */
guilhemMBED 0:a7c449cd2d5a 306 rt_chk_robin ();
guilhemMBED 0:a7c449cd2d5a 307
guilhemMBED 0:a7c449cd2d5a 308 /* Update delays. */
guilhemMBED 0:a7c449cd2d5a 309 os_time++;
guilhemMBED 0:a7c449cd2d5a 310 rt_dec_dly ();
guilhemMBED 0:a7c449cd2d5a 311
guilhemMBED 0:a7c449cd2d5a 312 /* Check the user timers. */
guilhemMBED 0:a7c449cd2d5a 313 #ifdef __CMSIS_RTOS
guilhemMBED 0:a7c449cd2d5a 314 sysTimerTick();
guilhemMBED 0:a7c449cd2d5a 315 #else
guilhemMBED 0:a7c449cd2d5a 316 rt_tmr_tick ();
guilhemMBED 0:a7c449cd2d5a 317 #endif
guilhemMBED 0:a7c449cd2d5a 318
guilhemMBED 0:a7c449cd2d5a 319 /* Switch back to highest ready task */
guilhemMBED 0:a7c449cd2d5a 320 next = rt_get_first (&os_rdy);
guilhemMBED 0:a7c449cd2d5a 321 rt_switch_req (next);
guilhemMBED 0:a7c449cd2d5a 322 }
guilhemMBED 0:a7c449cd2d5a 323
guilhemMBED 0:a7c449cd2d5a 324 /*--------------------------- rt_stk_check ----------------------------------*/
guilhemMBED 0:a7c449cd2d5a 325
guilhemMBED 0:a7c449cd2d5a 326 __weak void rt_stk_check (void) {
guilhemMBED 0:a7c449cd2d5a 327 /* Check for stack overflow. */
guilhemMBED 0:a7c449cd2d5a 328 if ((os_tsk.run->tsk_stack < (U32)os_tsk.run->stack) ||
guilhemMBED 0:a7c449cd2d5a 329 (os_tsk.run->stack[0] != MAGIC_WORD)) {
guilhemMBED 0:a7c449cd2d5a 330 os_error (OS_ERR_STK_OVF);
guilhemMBED 0:a7c449cd2d5a 331 }
guilhemMBED 0:a7c449cd2d5a 332 }
guilhemMBED 0:a7c449cd2d5a 333
guilhemMBED 0:a7c449cd2d5a 334 /*----------------------------------------------------------------------------
guilhemMBED 0:a7c449cd2d5a 335 * end of file
guilhemMBED 0:a7c449cd2d5a 336 *---------------------------------------------------------------------------*/
guilhemMBED 0:a7c449cd2d5a 337