【学习FreeRTOS】第12章——FreeRTOS时间管理

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():用于终止处于阻塞态任务的阻塞

【学习FreeRTOS】第12章——FreeRTOS时间管理_第1张图片
(1)为任务主体,也就是任务真正要做的工作
(2)是任务函数中调用vTaskDelayUntil()对任务进行延时
(3)为其他任务在运行

3.延时函数解析vTaskDelay()

  • 进入延时:调用vTaskDelay(),此时将该任务移除就绪列表,并添加到阻塞列表中
  • 解除延时:在SysTick中断中判断阻塞时间是否到达,如果到了就从阻塞列表移除,添加到就绪列表
    【学习FreeRTOS】第12章——FreeRTOS时间管理_第2张图片

你可能感兴趣的:(学习FreeRTOS专栏,学习,windows,单片机,嵌入式硬件,stm32)