/// Tick Handler. void osRtxTick_Handler (void) { os_thread_t *thread; OS_Tick_AcknowledgeIRQ(); osRtxInfo.kernel.tick++; // Process Timers if (osRtxInfo.timer.tick != NULL) { osRtxInfo.timer.tick(); } // Process Thread Delays osRtxThreadDelayTick(); osRtxThreadDispatch(NULL); // Check Round Robin timeout if (osRtxInfo.thread.robin.timeout != 0U) { if (osRtxInfo.thread.robin.thread != osRtxInfo.thread.run.next) { // Reset Round Robin osRtxInfo.thread.robin.thread = osRtxInfo.thread.run.next; osRtxInfo.thread.robin.tick = osRtxInfo.thread.robin.timeout; } else { if (osRtxInfo.thread.robin.tick != 0U) { osRtxInfo.thread.robin.tick--; } if (osRtxInfo.thread.robin.tick == 0U) { // Round Robin Timeout if (osRtxKernelGetState() == osRtxKernelRunning) { thread = osRtxInfo.thread.ready.thread_list; if ((thread != NULL) && (thread->priority == osRtxInfo.thread.robin.thread->priority)) { osRtxThreadListRemove(thread); osRtxThreadReadyPut(osRtxInfo.thread.robin.thread); osRtxThreadSwitch(thread); osRtxInfo.thread.robin.thread = thread; osRtxInfo.thread.robin.tick = osRtxInfo.thread.robin.timeout; } } } } } }
/// Resume the RTOS Kernel scheduler. /// \note API identical to osKernelResume static void svcRtxKernelResume (uint32_t sleep_ticks) { os_thread_t *thread; os_timer_t *timer; uint32_t delay; if (osRtxInfo.kernel.state != osRtxKernelSuspended) { EvrRtxKernelResumed(); //lint -e{904} "Return statement before end of function" [MISRA Note 1] return; } // Process Thread Delay list thread = osRtxInfo.thread.delay_list; if (thread != NULL) { delay = sleep_ticks; if (delay >= thread->delay) { delay -= thread->delay; osRtxInfo.kernel.tick += thread->delay; thread->delay = 1U; do { osRtxThreadDelayTick(); if (delay == 0U) { break; } delay--; osRtxInfo.kernel.tick++; } while (osRtxInfo.thread.delay_list != NULL); } else { thread->delay -= delay; osRtxInfo.kernel.tick += delay; } } else { osRtxInfo.kernel.tick += sleep_ticks; } // Process Active Timer list timer = osRtxInfo.timer.list; if (timer != NULL) { if (sleep_ticks >= timer->tick) { sleep_ticks -= timer->tick; timer->tick = 1U; do { osRtxInfo.timer.tick(); if (sleep_ticks == 0U) { break; } sleep_ticks--; } while (osRtxInfo.timer.list != NULL); } else { timer->tick -= sleep_ticks; } } osRtxInfo.kernel.state = osRtxKernelRunning; osRtxThreadDispatch(NULL); KernelUnblock(); EvrRtxKernelResumed(); }