1.系统配置完成systick模块后,通常下每当产生一个systick中断就会运行SysTick_Handler。
2.分析void xPortSysTickHandler( void )
a.通过操作寄存器basepri关闭一些中端
b.通过xTaskIncrementTick判断是否需要进行一次任务切换
c.打开在步骤a中关闭的中断
下面具体分析函数BaseType_t xTaskIncrementTick( void )
①:uxSchedulerSuspended:这个全局变量的意思是判断FreeRTO是否把所有任务挂起来(把所有任务挂起来调用的函数是uxSchedulerSuspended,这是uxSchedulerSuspended会置位TRUE)
②:当任务没有挂起来的话,xTickCount加1,然后把现在的时间赋给xConstTickCount
③:判断是否时间溢出,若溢出的话1.交互延时列表和溢出延迟列表的内容; 2.重新定义下一个周期任务的阻塞时间
⑤:判断延迟列表是否为空。若为空则把下一个阻塞时间设置为最大值。(通常情况下不会跑到这的)
⑥、⑦:把延迟列表的第一个列表项取出来,获取其列表项值(延迟列表的列表项值是按照阻塞时间的大小排列的,阻塞时间最小的为第一个,依次排列。若第一个列表项的阻塞时间还没到,则其余的延迟列表中的列表项阻塞时间都没有到)
⑧:再次确认延迟列表的列表项是否真的超时
⑨:若延迟列表的第一个列表项没有超时,则重新分配阻塞时间
(10):把第一个阻塞时间到的列表项从延迟列表中取出
(11):如果该任务有阻塞事件,则把阻塞事件从延迟事件列表中取出
(12):把取出的任务放到就绪列表中