FREERTOS采用滴答定时器周期性产生中断来作为心跳,作为任务切换周期,其中断处理函数如下:
extern void xPortSysTickHandler(void);
void SysTick_Handler(void)
{
/* USER CODE BEGIN SysTick_IRQn 0 */
if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)
{
xPortSysTickHandler();
}
/* USER CODE END SysTick_IRQn 0 */
HAL_IncTick();
/* USER CODE BEGIN SysTick_IRQn 1 */
/* USER CODE END SysTick_IRQn 1 */
}
xTaskGetSchedulerState()表示获取任务调度器的状态,它主要由以下三个状态:未开始,挂起,运行中。
当其已经开始后,进入xPortSysTickHandler()处理函数。该函数的主要代码有:

这篇博客详细介绍了FreeRTOS如何通过滴答定时器中断实现任务切换。xTaskGetSchedulerState()函数用于检查调度器状态,xPortSysTickHandler()中断处理函数中,vPortRaiseBASEPRI()设置中断优先级进入临界区,xTaskIncrementTick()检查并调度任务。PENDSV中断处理函数负责保存当前任务状态并切换到下一个任务,通过调整栈指针和执行vTaskSwitchContext()完成上下文切换。

9560

被折叠的 条评论
为什么被折叠?



