/// Start the RTOS Kernel scheduler. /// \note API identical to osKernelStart static osStatus_t svcRtxKernelStart (void) { os_thread_t *thread; if (osRtxInfo.kernel.state != osRtxKernelReady) { EvrRtxKernelError(osRtxErrorKernelNotReady); //lint -e{904} "Return statement before end of function" [MISRA Note 1] return osError; } // Thread startup (Idle and Timer Thread) if (!osRtxThreadStartup()) { EvrRtxKernelError((int32_t)osError); //lint -e{904} "Return statement before end of function" [MISRA Note 1] return osError; } // Setup SVC and PendSV System Service Calls SVC_Setup(); // Setup RTOS Tick if (OS_Tick_Setup(osRtxConfig.tick_freq, OS_TICK_HANDLER) != 0) { EvrRtxKernelError((int32_t)osError); //lint -e{904} "Return statement before end of function" [MISRA Note 1] return osError; } osRtxInfo.tick_irqn = OS_Tick_GetIRQn(); // Enable RTOS Tick OS_Tick_Enable(); // Switch to Ready Thread with highest Priority thread = osRtxThreadListGet(&osRtxInfo.thread.ready); if (thread == NULL) { EvrRtxKernelError((int32_t)osError); //lint -e{904} "Return statement before end of function" [MISRA Note 1] return osError; } osRtxThreadSwitch(thread); if ((osRtxConfig.flags & osRtxConfigPrivilegedMode) != 0U) { // Privileged Thread mode & PSP __set_CONTROL(0x02U); } else { // Unprivileged Thread mode & PSP __set_CONTROL(0x03U); } osRtxInfo.kernel.state = osRtxKernelRunning; EvrRtxKernelStarted(); return osOK; }
/// 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; } } } } } }