【FreeRTOS-时间管理】

一、延时函数介绍

1、FreeRTOS的延时函数

答:FreeRTOS有两种延时函数:相对延时函数 和 绝对延时函数。

  • 相对延时:指每次延时都是从执行函数vTaskDelay()开始,直到延时指定的时间结束。
  • 绝对延时:指将整个任务的运行周期看成一个整体,适用于需要按照一定频率运行的任务。

注意:一般来说,绝对延时中的主体任务运行所需时间必须比绝对延时时间小。

2、相对延时和绝对延时的区别

答:

相对延时

绝对延时

(1)为任务主体,也就是任务真正要做的工作

(2)是任务函数中调用vTaskDelayUntil()对任务进行延时

(3)为其他任务在运行


二、延时函数解析

1、相对延时函数内部解析

答:

  1. 判断延时时间是否大于0,大于0才有效。
  2. 挂起调度器。
  3. 将当前正在运行的任务从就绪列表移除,添加到阻塞列表prvAddCurrentTaskToDelayedList( )。
    1. 将该任务从就绪列表中移除。
    2. 如果使能挂起操作,并且延时时间为0XFFFF FFFF,并且xCanBlockIndefinitely等于pdTRUE,就代表此时是一直等,相当于挂起,所以添加到挂起列表。
    3. 如果延时时间小于0XFFFF FFF。
      • 记录阻塞超时时间,并记录在列表项值里(通过该值确定插入阻塞列表的位置)。
      • 如果阻塞超时时间溢出,将该任务状态列表项添加到溢出阻塞列表。
      • 如果没溢出,则将该任务状态列表项添加到阻塞列表,并判断阻塞超时时间是否小于下一个阻塞超时时间,是的话就更新当前这个时间为下一个阻塞超时时间
  4. 恢复任务调度器。
  5. 进行一次任务切换。

2、延时函数的流程

答:

  • 正在运行的任务。
  • 调用延时函数。
  • 此时将该任务移除就绪列表,并添加到阻塞列表中。
  • 滴答中断里边进行计时。
  • 判断阻塞时间是否到达,如果到达将从阻塞列表移除,添加到就绪列表。

为什么调用了延时函数就进入阻塞状态

将当前任务移动到阻塞列表

具体见该函数的源码分析。


三、延时函数演示实验

实验简介

实验现象



总结

相关推荐
小年糕是糕手1 小时前
【C++】C++入门 -- 输入&输出、缺省参数
c语言·开发语言·数据结构·c++·算法·leetcode·排序算法
Star在努力2 小时前
C语言复习八(2025.11.18)
c语言·算法·排序算法
赖small强3 小时前
【Linux C/C++开发】第26章:系统级综合项目理论
linux·c语言·c++
仟濹4 小时前
【C/C++】经典高精度算法 5道题 加减乘除「复习」
c语言·c++·算法
车端域控测试工程师4 小时前
Autosar网络管理测试用例 - TC003
c语言·开发语言·学习·汽车·测试用例·capl·canoe
小䌨狗狗5 小时前
(学习记录)用于OTA升级的FAL(Flash Abstraction Layer,闪存抽象层)
嵌入式·rtt-hread
EXtreme356 小时前
征服 C 语言文件 I/O:透视数据流、FILE* 核心机制与高效实践全指南
c语言··文件io
Bona Sun6 小时前
单片机手搓掌上游戏机(十二)—esp8266运行gameboy模拟器之编译上传
c语言·c++·单片机·游戏机
星期天28 小时前
3.2联合体和枚举enum,还有动态内存malloc,free,calloc,realloc
c语言·开发语言·算法·联合体·动态内存·初学者入门·枚举enum
自信150413057599 小时前
初学者小白复盘23之——联合与枚举
c语言·1024程序员节