0

我有一个关于如何使用 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更有条理,也更清楚发生了什么。一切都由主循环控制,一切都使用相同的调度/订阅系统。

4

0 回答 0