FreeRTOS 学习笔记:任务、队列、信号量,我是这样分清的

举报
yd_286364339 发表于 2026/10/21 17:09:23 2026/10/21
【摘要】 系统学习 FreeRTOS 后整理的任务、队列、信号量辨析笔记:任务按节拍拆、数据走队列、事件走信号量,外加一次优先级反转的踩坑记录。

我是电子信息在读研究生,课题做软体机器人,就业方向是嵌入式。软体机器人的控制天然是多件事并行:传感器要定时采集、驱动(气阀/电机)要按节拍输出、上位机通信不能被阻塞、异常状态要随时能打断。裸机大循环写这种系统很快就会乱,所以这学期我系统学了 FreeRTOS,把最容易混的三个概念整理一下。

1. 任务(Task):先按“节拍”拆,不要按“功能大小”拆

拆任务的依据是周期和实时性,而不是代码量。我的习惯分法:采集类任务定周期唤醒;控制类任务被采集结果触发;通信类任务低优先级、慢慢跑;监控任务优先级最高,只负责看门狗式的异常处理。优先级给“最怕迟到的”,不是给“最重要的”。

2. 队列(Queue):传数据本体的时候用它

采集任务和控制任务之间要传一组传感器数值,用队列最稳:发送方把结构体按值拷进去,接收方阻塞等待,天然解耦,还能靠队列长度吸收抖动。坑是队列满了怎么办要提前想好——控制场景我一般丢弃旧数据保最新,日志场景则宁可阻塞一小会儿。

3. 信号量(Semaphore):只传“发生了”这件事的时候用它

中断里外设数据就绪、按键按下这类事件不需要带数据,二值信号量就够。中断服务函数里只能用带 FromISR 后缀的 API,这是我早期最常犯的错。另外计数信号量适合“资源池”计数,别拿它硬传数据。

4. 一个我踩过的典型坑:优先级反转

低优先级任务拿着互斥锁慢慢跑,高优先级任务等锁,中优先级任务又一直在抢 CPU,结果高优先级反而被饿死。解决办法就一句:共享资源用互斥量(带优先级继承),不要用二值信号量凑合。

小结:任务按节拍拆、数据走队列、事件走信号量、共享资源上互斥量——这四句是我目前写 RTOS 代码时的默认检查表。后面准备把软体机器人的采集+控制回路按这个结构在开发板上完整跑一遍,再来更新这篇。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。