如何在不更新整个固件的情况下使嵌入式系统可配置

Posted

技术标签:

【中文标题】如何在不更新整个固件的情况下使嵌入式系统可配置【英文标题】:How to make the embedded system configurable without update the whole firmware 【发布时间】:2020-05-27 14:48:55 【问题描述】:

我完全是嵌入式软件的新手。目前,我正在做一个在基于 ARM Cortex-M4 的 MCU(板模型:STM32F446RE)上实现图像处理管道的项目。

我希望能够在不实际更新整个固件的情况下即时配置管道参数,因为我们使用的是带宽较低的 LoRa。

我已经搜索了几个小时,但找不到任何有效的解决方案。那你能给我指个方向吗?非常感谢你。

顺便说一句,我不知道这是否相关,但我正在使用带有 CMSIS RTOS API v2 的 FreeRTOS 内核。

【问题讨论】:

您不能只使用串行连接或任何其他通信协议发送参数吗?然后你只需要读取和解释传入的数据。 这个问题太宽泛了——没有“一种”适用的技术。这完全取决于您的应用程序可用的资源。这是一个设计问题,而不是编码问题。通常,您可以通过任何方式接受配置命令/数据,将配置存储为系统可用的任何非易失性存储,并编写代码以根据配置运行,而不是对行为/参数进行硬编码。 STM32F446RE 具有 4Kb 备份 SRAM - 即通过 Vbatt 电源域提供的 SRAM。因此,如果您的电路板有备用电池电源或其他安全电源,您可以将其用于非易失性存储。但正如你所看到的,实际上是几个问题,如何接收配置数据,如何存储数据以及如何加载数据以确定行为。它也提出了问题——只知道芯片是不够的;例如,您的电路板可能有一个 EEPROM 或 SD 卡。它是一个低级的嵌入式系统,而不是 Linus - 很少有标准的解决方案;你必须编写代码 【参考方案1】:

如果你问这个问题,我希望:

    电路板仍在设计中或 您的电路板是由考虑过这些问题的人设计的。

如果是第 2 点,请与设计该板的人交谈,并了解投入了哪些资源来处理这些问题。

如果是#1,大概您已经对设计进行了投入。

必要的资源:

    非易失性存储:闪存、eeprom 等 一种或多种将参数写入该非易失性存储器的方法

理想的资源:运行时输入/输出的通信线路(经常使用串行)。

获得这些资源后,您可以执行以下操作:

    设计变量、数据结构等来保存参数

    设计您的非易失性存储,考虑到:

    一个。您的媒体的特性/限制(例如,闪存通常需要在写入之前进行擦除。擦除需要时间并且必须按扇区而不是单个字节来完成。

    b.验证:您的程序应该有一种方法来验证非易失性存储是否具有有效值,而不是垃圾,不是所有 0xFF,并且如果它无效,则失败或使用默认值等

然后你就可以用这个写一个程序了。

您需要考虑如何将值写入非易失性存储器

开发过程中 生产中

它们不太可能相同。

在开发过程中,您希望能够轻松更改值。您可能有办法通过 JTAG 烧录您的闪存芯片。您可能有一个通信端口,它运行某种简单的 CLI、通过某种协议接受命令、提出问题并通过终端仿真器读取答案等。然后程序可以将值写入非易失性存储器。

在生产中,您可能希望在设置系统时刻录一次“正确”值,而无需过多的操作员参与。

这只是一个入门指南...正如 cmets 中所述,您的问题非常笼统。

【讨论】:

以上是关于如何在不更新整个固件的情况下使嵌入式系统可配置的主要内容,如果未能解决你的问题,请参考以下文章

如何在不传递数组的情况下使数组可访问到类中?

如何在不需要额外点击的情况下使 DataGridCheckBoxColumn 可编辑?

如何在不给定高度的情况下使内容在弹性框中可滚动?

如何在不单击下一个单元格且不调整单元格高度的情况下使 UITableViewCell 中的下拉菜单可点击?

可在线OTA升级的嵌入式系统设计方案

可在线OTA升级的嵌入式系统设计方案