1.FreeRTOS系统时钟节拍
FreeRTOS的系统时钟节拍计数器是全局变量xTickCount,一般来源于系统的SysTick。在STM32F1中,SysTick的时钟源是72MHz/8=9MHz,如下代码,RELOAD = 9MHz/1000-1 = 8999,所以时钟节拍是1ms。
portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL;
系统节拍处理——SysTick_Handler中断过程
- 判断OS是否运行,运行才可以启动正常调度
- 屏蔽所有中断
- xTaskIncrementTick()处理系统节拍,并决定是否进行任务切换
处理系统时钟节拍:xTickCount++
处理阻塞任务列表:判断阻塞任务是否超时,超时则切换为就绪;若xTickCount溢出则调换阻塞状态列表
处理时间片调度:切换至同一优先级的下一个任务(只标记,可能被高优先级打断) - 开启所有中断
2.延时函数介绍
-
相对延时 vTaskDelay():指每次延时都是从执行函数vTaskDelay()开始,直到延时指定的时间结束
-
绝对延时xTaskDelayUntil():指将整个任务的运行周期看成一个整体,适用于需要按照一定频率运行的任务
-
中止任务延时xTaskAbortDelay():用于终止处于阻塞态任务的阻塞
(1)为任务主体,也就是任务真正要做的工作
(2)是任务函数中调用vTaskDelayUntil()对任务进行延时
(3)为其他任务在运行
3.延时函数解析vTaskDelay()
- 进入延时:调用vTaskDelay(),此时将该任务移除就绪列表,并添加到阻塞列表中
- 解除延时:在SysTick中断中判断阻塞时间是否到达,如果到了就从阻塞列表移除,添加到就绪列表