我有一个关于如何使用 Zephyr RTOS 构建事件驱动固件的问题。应该使用哪种方式是一个普遍的问题。或者也许我完全错了?该应用程序不是时间关键的。
案例一:
- 尽可能使用 k_work、k_timer、k_poll/k_sem 等特征
- 由于这些函数需要 c 风格的回调,因此将使用很多免费函数
- 用于发布事件的调度程序/订阅者事件队列(如按下按钮、打开 LED 等),这些事件将在主循环内处理(类似于案例 B)
- LED动画可以由模块本身处理(k_work)
// wait for something to happen
k_poll(...);
dispatcher.process();
案例B:
- 调度器/订阅者系统的自己实现
- 类可用于所有元素(按钮、LED、...)
- 所有事件都在主循环内处理
- 如果主线程休眠,中断可以唤醒它
- LED 对象可以在需要唤醒时发送事件(用于动画,...)
- Main 使用上述事件中的最低睡眠时间值
- LED订阅
LoopEvent
做动画
dispatcher.post(std::make_unique<LoopEvent>());
dispatcher.process();
k_msleep(powermanager.getSleepTime());
我认为Case B
更有条理,也更清楚发生了什么。一切都由主循环控制,一切都使用相同的调度/订阅系统。