Racelogic / Mbed 2 deprecated VIPS_LTC_RAW_IMU

Dependencies:   BufferedSerial FatFileSystemCpp mbed

Committer:
JamieB
Date:
Mon Sep 13 07:38:22 2021 +0000
Revision:
58:8cce8fcc765f
Parent:
22:0dd9c1b5664a
Reduced Ethernet latency and Increased thread priority

Who changed what in which revision?

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