当前位置: 首页 > news >正文

嵌入式学习笔记 - freeRTOS 阻塞延时的实现机制,同时避免在中断中扫描停留

一 freeRTOS 阻塞延时到期激活的实现机制,同时避免在中断中扫描停留

任务在激活阻塞时先根据延时时间赋值NextTaskUnlockTime,再扫描延时列表的所有节点,然后根据延时时间确定插入链表的什么位置,如下图:

上图中横线就是任务启动延时时,将任务节点插入延时列表激活阻塞

上图中横线就是通过轮询方式查找位置并插入,如下图函数具体实现中的for语句,可见delayedlist延时列表的两个链表里节点都是按照延时时间顺序排列的因为插入的时候是按照顺序插入的。(题外话:而就绪列表里的节点并不是按照顺序插入的,因为优先级都一样,每次都是直接插入链表末端使用的插入函数是vListInsertEnd,所以就绪列表里的节点的辅助值没什么意义)。

systick中断只需根据NextTaskUnlockTime激活延时列表的第一个节点即可(激活是通过删除延时列表节点并添加到就绪列表的的方式,有可能不止一个节点但是肯定靠在前面),按大小插入延时列表肯定要排序,

这样就把扫描排序交给任务了,避免了在中断中停留太久的问题。如下图:

二 总结

freeRTOS实现阻塞延时的方式就是对两个延时列表进行扫描操作

加入延时列表时,扫描延时列表,根据延时值顺序插入延时列表,

退出延时列表时,不需要扫描,直接从第一个任务节点开始边判断边从延时列表删除相应的节点,直到xConstTickCount < xItemValue。

两个延时列表形成互补防止时基溢出交界之时无法处理的问题。

static List_t   xDelayedTaskList1;
static List_t    xDelayedTaskList2;
static List_t *  volatile pxDelayedTaskList;
static List_t *  volatile pxOverflowDelayedTaskList;

注意这里定义两个延时链表的方式也很巧妙,分别定义了两个链表变量,然后定义了两个链表指针,分别指向两个链表,这样可以灵活的运用两个指针,当想要操作的对象改变时只需要对指针交换指针指向的地址即可。

http://www.xdnf.cn/news/716383.html

相关文章:

  • 2025音频传输模块全球选购指南:高品质音频体验的品牌之选
  • 民锋视角下的资产配置策略优化与风险评估模型探索
  • 华为OD机试真题——字母组合过滤组合字符串(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现
  • LangChain【2】之专业术语
  • DTO、VO、DO、BO、PO 的概念与核心区别
  • Swagger 访问不到 报错:o.s.web.servlet.PageNotFound : No mapping for GET /doc.html
  • leetcode hot100刷题日记——28.环形链表2
  • 【论文精读】2024 ECCV--MGLD-VSR现实世界视频超分辨率(RealWorld VSR)
  • 第十三章:预处理
  • Dify+MCP+MySQL:智能问数本地实践
  • 品优购项目(HTML\CSS)
  • 缓存架构方案:Caffeine + Redis 双层缓存架构深度解析
  • 2025年05月29日Github流行趋势
  • 【SOLUTION】Java 生成 TOTP 验证码
  • 政策与数字双赋能驱动:ERP助力外贸企业高质量发展路径解析
  • Maven-生命周期
  • 信创采购热潮下的隐忧:单一技术路线的市场垄断之困
  • Oracle RMAN自动恢复测试脚本
  • mongodb的安装使用
  • 20250529-C#知识:分部类和分部方法
  • 小白畅通Linux之旅-----Linux日志管理
  • 【芯片设计中的交通网络革命:Crossbar与NoC架构的博弈C架构的博弈】
  • 在Linux环境里面,Python调用C#写的动态库,如何实现?
  • Java集合操作常见错误与最佳实践
  • OSCP备战-SickOs1.2靶场详细步骤
  • 第九章 MQTT报文
  • C primer plus (第六版)第六章 编程练习第10题
  • 关于《DAHSF》即《火小兔智慧开发平台V2.0》的碎碎念
  • ADC同步采样
  • XMOS以全新智能音频及边缘AI技术亮相广州国际专业灯光音响展