【发布时间】:2022-10-19 23:21:09
【问题描述】:
我有一个关于如何使用 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 更有条理,也更清楚发生了什么。一切都由主循环控制,一切都使用相同的调度/订阅系统。
【问题讨论】:
标签: architecture event-driven zephyr-rtos