乐于分享
好东西不私藏

RTOS里的软件定时器和硬件定时器怎么分工?别把所有周期任务都塞进中断

RTOS里的软件定时器和硬件定时器怎么分工?别把所有周期任务都塞进中断

——硬件定时器负责准,软件定时器负责管,任务负责干重活


一上 RTOS,很多人会遇到一个新问题:

我已经有任务了。

也有 delay 了。

那以前那些定时器还要不要?

周期采样用硬件定时器,还是软件定时器?

LED 闪烁要不要一个任务?

超时检测放哪里?

定时器回调里能不能跑业务?

这些问题如果不分清,系统很容易变成:

  • 硬件中断里塞业务
  • 软件定时器里塞重活
  • 任务里到处 delay
  • 超时逻辑散得到处都是

最后你会发现,上了 RTOS,时间反而更乱了。

RTOS里的时间系统,关键不是“有没有定时器”,而是“谁负责计时,谁负责干活”。


一、先把三种东西分清

RTOS 项目里经常会同时存在三类时间工具:

工具
更适合解决什么
硬件定时器
高精度、硬实时、外设触发
软件定时器
系统级超时、低频周期事件
任务延时/阻塞超时
某个任务自己的节奏和等待

这三者不是谁替代谁。

它们更像不同层级的时间工具。

硬件定时器靠近外设。

软件定时器靠近系统管理。

任务延时靠近业务节奏。


二、硬件定时器:适合准和硬

硬件定时器适合处理那些对时序要求比较硬的事。

比如:

  • PWM 输出
  • 精确定时采样触发
  • 编码器计数
  • 输入捕获
  • 控制闭环的硬触发
  • 需要稳定周期的外设动作

它的优势是准。

但它的回调或中断里,仍然不适合干重活。

比较好的思路是:

硬件定时器触发 -> 采样/DMA/置事件 -> 通知任务处理

硬件定时器负责把节拍打准。

任务负责把后面的计算做完。

别把定时器中断写成第二个主循环。


三、软件定时器:适合系统级提醒

软件定时器更适合那些“不需要硬实时,但需要系统统一管理”的时间事件。

比如:

  • 通信超时
  • 周期状态上报
  • 看门狗喂狗提醒
  • UI 定时刷新触发
  • 低频后台检测
  • 重试间隔

它的优势是好管理。

但它不适合做很重的业务。

很多 RTOS 的软件定时器回调,本质上也是运行在某个定时器服务任务里。

你在回调里卡太久,会影响其他软件定时器。

所以软件定时器更适合:

  • 发通知
  • 投递事件
  • 改轻量状态
  • 唤醒任务

不适合:

  • 复杂计算
  • 阻塞等待
  • 大量打印
  • 文件操作

四、任务自己的节奏,用任务自己表达

有些周期行为,不一定要上定时器。

比如一个显示任务,每 100ms 刷新一次。

一个日志任务,每隔一段时间 flush 一下。

一个后台任务,低频检测状态。

这类事情本身就是任务自己的节奏,用任务延时就很自然。

不要为了“正规”,所有周期都搞一个软件定时器。

如果这个节奏只属于某个任务,让任务自己睡就行。


五、一个实用分工表

需求
更推荐
PWM、输入捕获、编码器
硬件定时器
精准采样触发
硬件定时器 + DMA/通知
通信超时
软件定时器 / 阻塞超时
UI周期刷新
UiTask 自己延时
日志低频flush
LogTask 自己延时
重试间隔
软件定时器 / 任务延时
控制周期很严格
硬件定时器触发任务或中断
普通后台检测
低优先级任务延时

最重要的判断是:

这件事到底需要“准时触发”,还是只需要“隔一段时间处理”?

需要准,靠硬件。

需要管理,靠软件定时器。

只是任务自己的节奏,任务自己睡。


六、最后总结一下

RTOS 不是让硬件定时器消失。

也不是让所有时间逻辑都塞进软件定时器。

三句话记住:

硬件定时器负责准。
软件定时器负责提醒。
任务负责干重活。

如果你发现定时器回调里开始解析协议、刷屏、写 Flash、打日志,那就该警惕了。

你可能又把中断或回调写成了主循环。

下一篇继续往业务层走:

RTOS里的协议解析任务,到底该怎么拆?


相关文章


你项目里最混乱的时间逻辑,是硬件定时器太多,还是软件定时器回调太重?