FreeRTOS-任务调度

1.系统配置完成systick模块后,通常下每当产生一个systick中断就会运行SysTick_Handler。

2.分析void xPortSysTickHandler( void )

  a.通过操作寄存器basepri关闭一些中端

  b.通过xTaskIncrementTick判断是否需要进行一次任务切换

 c.打开在步骤a中关闭的中断

FreeRTOS-任务调度_第1张图片

下面具体分析函数BaseType_t xTaskIncrementTick( void )

FreeRTOS-任务调度_第2张图片

①:uxSchedulerSuspended:这个全局变量的意思是判断FreeRTO是否把所有任务挂起来(把所有任务挂起来调用的函数是uxSchedulerSuspended,这是uxSchedulerSuspended会置位TRUE

②:当任务没有挂起来的话,xTickCount加1,然后把现在的时间赋给xConstTickCount

③:判断是否时间溢出,若溢出的话1.交互延时列表和溢出延迟列表的内容; 2.重新定义下一个周期任务的阻塞时间

FreeRTOS-任务调度_第3张图片

⑤:判断延迟列表是否为空。若为空则把下一个阻塞时间设置为最大值。(通常情况下不会跑到这的)

⑥、⑦:把延迟列表的第一个列表项取出来,获取其列表项值(延迟列表的列表项值是按照阻塞时间的大小排列的,阻塞时间最小的为第一个,依次排列。若第一个列表项的阻塞时间还没到,则其余的延迟列表中的列表项阻塞时间都没有到)

⑧:再次确认延迟列表的列表项是否真的超时

⑨:若延迟列表的第一个列表项没有超时,则重新分配阻塞时间

FreeRTOS-任务调度_第4张图片

(10):把第一个阻塞时间到的列表项从延迟列表中取出

(11):如果该任务有阻塞事件,则把阻塞事件从延迟事件列表中取出

(12):把取出的任务放到就绪列表中

 

 

你可能感兴趣的:(FreeRTOS-任务调度)