
——硬件定时器负责准,软件定时器负责管,任务负责干重活
一上 RTOS,很多人会遇到一个新问题:
我已经有任务了。
也有 delay 了。
那以前那些定时器还要不要?
周期采样用硬件定时器,还是软件定时器?
LED 闪烁要不要一个任务?
超时检测放哪里?
定时器回调里能不能跑业务?
这些问题如果不分清,系统很容易变成:
硬件中断里塞业务 软件定时器里塞重活 任务里到处 delay 超时逻辑散得到处都是
最后你会发现,上了 RTOS,时间反而更乱了。
RTOS里的时间系统,关键不是“有没有定时器”,而是“谁负责计时,谁负责干活”。
一、先把三种东西分清
RTOS 项目里经常会同时存在三类时间工具:
这三者不是谁替代谁。
它们更像不同层级的时间工具。
硬件定时器靠近外设。
软件定时器靠近系统管理。
任务延时靠近业务节奏。
二、硬件定时器:适合准和硬
硬件定时器适合处理那些对时序要求比较硬的事。
比如:
PWM 输出 精确定时采样触发 编码器计数 输入捕获 控制闭环的硬触发 需要稳定周期的外设动作
它的优势是准。
但它的回调或中断里,仍然不适合干重活。
比较好的思路是:
硬件定时器触发 -> 采样/DMA/置事件 -> 通知任务处理
硬件定时器负责把节拍打准。
任务负责把后面的计算做完。
别把定时器中断写成第二个主循环。
三、软件定时器:适合系统级提醒
软件定时器更适合那些“不需要硬实时,但需要系统统一管理”的时间事件。
比如:
通信超时 周期状态上报 看门狗喂狗提醒 UI 定时刷新触发 低频后台检测 重试间隔
它的优势是好管理。
但它不适合做很重的业务。
很多 RTOS 的软件定时器回调,本质上也是运行在某个定时器服务任务里。
你在回调里卡太久,会影响其他软件定时器。
所以软件定时器更适合:
发通知 投递事件 改轻量状态 唤醒任务
不适合:
复杂计算 阻塞等待 大量打印 文件操作
四、任务自己的节奏,用任务自己表达
有些周期行为,不一定要上定时器。
比如一个显示任务,每 100ms 刷新一次。
一个日志任务,每隔一段时间 flush 一下。
一个后台任务,低频检测状态。
这类事情本身就是任务自己的节奏,用任务延时就很自然。

不要为了“正规”,所有周期都搞一个软件定时器。
如果这个节奏只属于某个任务,让任务自己睡就行。
五、一个实用分工表
最重要的判断是:
这件事到底需要“准时触发”,还是只需要“隔一段时间处理”?
需要准,靠硬件。
需要管理,靠软件定时器。
只是任务自己的节奏,任务自己睡。
六、最后总结一下
RTOS 不是让硬件定时器消失。
也不是让所有时间逻辑都塞进软件定时器。
三句话记住:
硬件定时器负责准。
软件定时器负责提醒。
任务负责干重活。
如果你发现定时器回调里开始解析协议、刷屏、写 Flash、打日志,那就该警惕了。
你可能又把中断或回调写成了主循环。
下一篇继续往业务层走:
RTOS里的协议解析任务,到底该怎么拆?
相关文章
RTOS里的任务栈到底该怎么估?很多HardFault可能是栈被你用爆了 RTOS里的串口DMA到底该怎么组织?别让回调、队列、任务搅成一锅粥 FreeRTOS、RT-Thread、Zephyr到底怎么选? 队列、信号量、互斥锁到底怎么选?
你项目里最混乱的时间逻辑,是硬件定时器太多,还是软件定时器回调太重?
夜雨聆风