gpt4 book ai didi

c - 嵌入式固件架构

转载 作者:行者123 更新时间:2023-12-02 09:11:07 24 4
gpt4 key购买 nike

我一直在编写越来越复杂的固件,并且开始注意到我对设计模式和架构的了解有点欠缺。我正在努力培养这些技能,并希望得到一些意见。注意:这是针对微 Controller 的嵌入式 c。

我正在使用一个新项目的概念作为练习,现在是这样的:

  1. 我们有一个带用户 I/O 的电池管理模块
  2. 主 Controller 负责 I/O(按钮、LCD、UART 调试)、检测充电器插入/拔出等操作,并管理高级操作。
  3. 子 Controller 是一个电池管理 Controller (几乎是自定义 PMIC),能够监控电池电量、运行充电/放电固件等。
  4. PMIC 与电量计 IC 接口(interface),用于从中读取电池信息
  5. 两个 Controller 、电量计和LCD之间的接口(interface)都是I2C

这是一个粗略的系统图:

enter image description here

现在我要做的是想出一个好的固件架构,允许扩展(添加多个电池、添加更多传感器、将 LCD(或其他)接口(interface)从 I2C 更改为 SPI 等),和测试(通过 UART 模拟按钮按下,用模拟值替换电池读数以测试 PMIC 充电固件等)。

我通常会为每个外围设备编写一个自定义驱动程序,并为每个 block 编写一个固件模块。我将实现一个标记模块以及一个全局可用的 get/set,它将在整个系统中使用。例如,我的计时器会设置 100Hz、5Hz、1Hz 标志,主循环将处理这些标志并以所需的速率调用各个模块。然后,模块本身可以为主循环设置标志,以处理 I2C 事务完成、事务超时、温度超标等事件。

我希望从中得到一些关于构建系统以实现我的可伸缩性、封装和抽象目标的更好方法的建议。看起来我正在做的是一种伪事件驱动系统,但它已经被黑客攻击在一起了。无论如何,这是我对架构图的尝试:

enter image description here

enter image description here

最佳答案

“事件总线”的概念过于复杂。在许多情况下,最简单的方法是尽量减少需要异步发生的事情的数量,而是有一个“主轮询”例程,该例程在“尽可能方便”的基础上运行,并为每个子系统调用轮询例程。在自己的编译中包含这样的例程可能会有所帮助,这样该文件的本质将只是其他子系统使用的所有轮询函数的列表,而不是任何具有其自身语义的东西。如果有一个“get button push”例程,则可以在该例程中有一个循环,该循环调用主轮询例程,直到按下按钮、键盘超时或调用者需要处理的其他事情发生。这将允许使用如下代码实现主 UI:

void maybe_do_something_fun(void)
{
while(1)
{
show_message("Do something fun?");
wait_for_button();
if (button_hit(YES_BUTTON))
{
... do something fun
return;
}
else if (button_hit(NO_BUTTON))
{
... do something boring
return;
}
} while(1);
}

这通常比尝试拥有一个巨大的状态机并说如果代码是 STATE_MAYBE_DO_SOMETHING_FUN 状态和 yesno< 要方便得多 按钮被按下,它需要前进到 STATE_START_DOING_SOMETHING_FUNSTATE_START_DOING_SOMETHING_BORING 状态。

请注意,如果使用这种方法,则需要确保调用 main_poll 之间的最坏情况时间始终满足通过 main_poll 处理的轮询操作的及时性要求,但在某些情况下在可以满足该要求的情况下,与为抢占式调度的多线程代码以及使其可靠工作所需的锁和其他保护措施做任何必要的事情相比,这种方法要方便和高效得多。

关于c - 嵌入式固件架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52173266/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com