方案

我想通过新固件来无线更新低成本的IoT设备,以更新设备的微控制器。微控制器存储器是32k至128k范围内的闪存(每分计数)。这种便宜的内存有一个主要限制:只能逐块擦除。

问题

这是否意味着我无法进行差异(增量)更新?我是否总是必须更新整个控制器内存(或至少重要部分)?

我希望减少对所有内容进行刷新的需求,并尽可能地使设备完全变砖。空中闪烁微控制器时是否存在现有策略?

评论

什么对您来说成本或最低风险率更重要?

我想,@ BenceKaulics在两者之间找到了适当的平衡。毕竟,砖块风险也是(加权)成本。

#1 楼

简单的答案是肯定的-如果您想要高可靠性,则需要足够的闪存块来支持引导加载程序和A / B代码映像。在激活新映像之前,您可以编写整个文件,进行验证并可能重试。

但是,这是一种昂贵/可靠的策略,您可以做一些事情来减少开销。对OTA更新的低级支持也可能作为设备固件或操作系统的一部分提供,因此除非您想学习,否则可以避免自己动手做。此功能可能称为FOTA

对代码库进行分区可以进行增量更新,最好的情况是,引导加载程序能够建立网络连接,下载和验证代码而无需任何备用用户代码。 。使用本地网关,可以从低成本端点委派该任务的管理。

许多设备具有少量的字擦除闪存,即使失败,通常也可以设置位而不需要擦除整个块。这些功能可用于操作跳转表,并将代码更新为块大小的块。即使您最初计划使用一个完整的A / B代码空间,当代码库增长太多时,您可能也需要退回到一个更复杂的方案。

要弄清楚使用A / B代码空间可以实现的功能。复杂的空中固件解决方案,引导加载程序以及潜在的主要通信堆栈可以保留在原处,同时重新刷新所有剩余的用户应用程序空间。这不需要任何开销(尤其是在块分区很软的情况下)。在需要升级通信堆栈的情况下,通常用于应用程序代码的区域可以在下载和验证期间临时使用。要实现这一点,就需要在SoC中提供一些支持,但是确实已经考虑到了这一点而设计的第二代和第三代设备。

#2 楼


我想减少对所有内容进行刷新的需求,并尽可能地使设备完全变砖。通过无线方式刷新微控制器时是否存在现有策略?


除了执行相对静态的更新代码外,还需要在存储中保留两个映像:一个活动映像和备用图片。每当需要更新时,请在备份中进行更新,然后将其切换为活动状态。稳定后,请更新旧的活动映像,该映像现在应作为您的备份。此类算法的代码可能会占用总存储空间的10-15%,但在延长设备的使用寿命方面非常值得。


损耗均衡通常由闪存控制器管理,它使用损耗均衡算法来确定每次编程数据时要使用哪个物理块。固态驱动器(SSD)磨损均衡有两种类型:动态和静态。动态损耗平衡会池中已擦除的块,并为下一次写入选择具有最低擦除计数的块。计数,在必要时擦除该块,将新数据写入该块,并确保静态数据块在其块擦除计数低于某个阈值时被移动。该
移动数据的附加步骤由于Flash控制器上的开销而会降低写入性能,但是静态耗损均衡
比动态耗损均衡更有效地延长了寿命[br />固态设备。


(Techtarget.com:磨损平衡)

#3 楼

飞思卡尔半导体为其Kinetis微控制器描述了一种可靠的无线固件升级方法。
它称为:程序闪存交换。

使用闪存交换的系统
在如果设备具有两个或多个支持交换的内部
闪存块,则可以交换每个闪存
块的存储器基址。每个闪存块的地址位置将在设备的逻辑存储器映射中交换。重置后,内置的Flash交换系统实质上是根据逻辑
内存图中Flash块的位置来选择执行哪个
软件。这样可以使代码备份系统更容易进行
编程。您可以在一个程序段之外执行操作,而
擦除/编程另一程序段。在Kinetis设备上,闪存交换系统监视/控制从旧应用程序切换到新应用程序的所有步骤。在其中一个步骤中断电的情况下,还可以确保可靠的操作

优点

易于编程。应用程序始终在内存映射的下部
块外执行。
容忍功率损耗。
不需要引导程序
。不拖延主应用程序的启动。
很好
适合多任务OS。减少应用程序停机时间。在多任务系统中,可以在后台任务正在运行时继续执行主要的
应用程序任务,以更新应用程序的新
副本。
的备份副本码。可以还原到已知的工作应用程序。

缺点

附加闪存
存储备份副本所需的内存空间。 />
您可以更新块,然后交换它们。

链接的文档包含详细说明。
它可以确保更安全的固件升级,但是由于它需要更多的闪存,因此肯定会花费更多。同样不适用于任何类型的微控制器,仅适用于支持内部闪存块交换的微控制器。

评论


这看起来不错,而且看起来可以与成本需求保持平衡,是必须考虑的解决方案。 +1

– Helmar♦
16 Dec 8'在17:14