【问题标题】:Zephyr - event driven firmwareZephyr - 事件驱动固件
【发布时间】: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


    【解决方案1】:

    只是想知道你是否以及如何弄清楚如何去做。我是 Zephyr 的新手,也在从事一个事件驱动的项目,我想知道你最终是如何完成这个项目的。谢谢。

    【讨论】:

      猜你喜欢
      • 2023-02-07
      • 2014-01-03
      • 2015-10-06
      • 2011-12-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-08
      • 1970-01-01
      • 2010-09-27
      相关资源
      最近更新 更多