在 STM32 上调度

Posted

技术标签:

【中文标题】在 STM32 上调度【英文标题】:Dispaching on STM32 【发布时间】:2021-10-23 01:44:13 【问题描述】:

我想在线更新我的 mcu 固件。我选择的方法是 Delta Firmware Update,它发现旧固件和新固件之间的差异,然后生成一个补丁文件,可用于在 mcu 端构建新固件。

我可以在 Windows 上使用jDiff 构建此补丁文件,但我不知道如何在 STM32 端调度和构建新固件。

有人帮我找到解决办法吗?

最好的。

【问题讨论】:

大部分 STM32 MCU 既不包括 WiFi 也不包括蜂窝网络。因此,如果“直播”应该使用其中一种技术,您应该提供更详细的硬件描述。 不,我想使用 LoRa 远程更新我的固件。 LoRa 的带宽非常有限。传输更新固件所需的数据可能需要几天时间。 这是我要使用 Delta 固件更新的唯一原因! 【参考方案1】:

鉴于 LoRa 的低带宽,即使使用差异更新和压缩,通过 LoRa 的固件更新也会非常缓慢。让我们暂时把它放在一边,假设新固件可以成功发送到您的 MCU。

由于固件传输缓慢且不可靠,您必须将 MCU 的闪存分成两半:

第一半:当前固件,用于执行代码 第二半:下一个固件版本,不完整,正在接收中

如您所见,闪存需要至少是当前使用的固件大小的两倍。

然后接收到多个部分的固件。最有可能的是,需要一个协议来请求重新传输根本没有收到或收到错误的片段。

一旦下一个固件版本被完全接收和验证(一些校验和),你基本上有两个选择:

简单的固件更新

一个小的固件更新例程被复制到 RAM 中并启动。它会用下一个版本覆盖当前固件,然后重置 MCU。

这很容易实现。但是,如果更新失败(例如电源中断),设备将不再工作(通俗地说是“变砖”)并且需要手动重新编程。所以它不是非常健壮,不适合现场设备。

强大的固件更新

强大的固件更新使用新固件版本的地址覆盖向量表,然后重置 MCU。所以当前激活的固件在闪存的下半部和上半部交替出现。

虽然这种方法更稳健,但实现起来也更困难。固件必须使用与位置无关的代码创建,或者必须使用闪存地址范围的下半部分或上半部分的地址专门创建。典型的开发环境不支持开箱即用的所有这些。

由于这并非易事,一些 STM32 MCU 提供了双存储区模式来解决这个问题。它基本上提供了强大的固件更新,没有特制固件的麻烦。


只传输两个固件版本之间的差异当然是有意义的。但是,我不确定它是否有很大帮助。对函数的微小更改可能会导致整个代码中变量和函数的新地址,从而引入比您预期的要多得多的差异。

无论如何,jDiff 肯定不是首选工具,因为它更喜欢速度而不是补丁大小。

一些链接

开源引导加载程序展示了几种相关技术:https://github.com/akospasztor/stm32-bootloader、https://github.com/feaser/openblt 特殊 STM32 器件的无线更新:https://www.st.com/resource/en/application_note/dm00556294-overtheair-application-and-wireless-firmware-update-for-stm32wb-series-microcontrollers-stmicroelectronics.pdf 双bank闪存信息:https://www.st.com/resource/en/application_note/an4826-stm32f7-series-flash-memory-dual-bank-mode-stmicroelectronics.pdf,https://www.st.com/resource/en/application_note/dm00230416-onthefly-firmware-update-for-dual-bank-stm32-microcontrollers-stmicroelectronics.pdf OTA 更新项目:https://www.hackster.io/firmwareguru/secure-ota-firmware-update-with-stm32-over-6lowpan-and-coap-cb1af3

【讨论】:

谢谢!您是否知道任何源代码或示例或链接来解释或演示它? 我不完全明白你想走哪条路,是商业项目还是私人项目,硬件成本、开发成本还是上市时间更重要,如果硬件已经给出或约束。无论如何,我已经添加了一些链接。

以上是关于在 STM32 上调度的主要内容,如果未能解决你的问题,请参考以下文章

STM32H7第14章 ThreadX调度锁,任务锁和中断锁(调度阀值)

STM32H7第14章 ThreadX调度锁,任务锁和中断锁(调度阀值)

STM32F429第14章 ThreadX调度锁,任务锁和中断锁(调度阀值)

STM32H7第13章 任务调度—抢占式,时间片和合作式

STM32F429第13章 任务调度—抢占式,时间片和合作式

在STM32F103C8T6上使用UCOSII一些小心得。