Answers:
简单的答案是肯定的-如果您需要高可靠性,则需要足够的闪存块来支持引导加载程序和A / B代码映像。在激活新映像之前,您可以编写整个文件,进行验证并可能重试。
但是,这是一种昂贵/可靠的策略,您可以采取一些措施来减少开销。对OTA更新的低级别支持也可能作为设备固件或操作系统的一部分提供,因此除非您想学习,否则可以避免自己动手做。此功能可能描述为FOTA
。
对代码库进行分区可以进行增量更新,在最佳情况下,引导加载程序可以建立网络连接,下载和验证代码,而无需任何备用用户代码。使用本地网关,可以从低成本端点委派此任务的管理。
许多设备具有少量的字擦除闪存,即使失败,通常也可以设置位而无需擦除整个块。这些功能可用于操纵跳转表,并将代码更新为块大小的块。即使您最初计划使用完整的A / B代码空间,当代码库增长太多时,您可能仍需要退回到更复杂的方案。
为了阐明使用复杂的空中无线解决方案可以实现的功能,引导加载程序和潜在的主要通信堆栈可以保留在其中,同时重新刷新所有剩余的用户应用程序空间。这不需要任何开销(尤其是在块分区很软的情况下)。在需要升级通信堆栈的情况下,通常用于应用程序代码的区域可以在下载和验证期间临时使用。要实现这一点,就需要在SoC中提供一些支持,但是考虑到这一点而设计的第二代和第三代设备确实已经存在。
我想减少刷新所有内容的需求,并尽可能地使设备完全变砖。空中闪烁微控制器时是否存在现有策略?
除了执行相对静态的更新的代码外,您还需要在存储中保留两个映像:一个活动映像和一个备份映像。每当您需要更新时,请在备份中进行更新,然后将其切换为活动状态。稳定后,更新旧的活动映像,现在应该将其作为备份。
考虑到这一点,您可以在更新两个图像时使用损耗均衡算法。此类算法的代码可能会占用总存储空间的10-15%,但是在延长设备的使用寿命方面非常值得。
损耗均衡通常由闪存控制器管理,闪存控制器使用损耗均衡算法来确定每次编程数据时要使用哪个物理块。固态驱动器(SSD)磨损均衡有两种类型:动态和静态。动态损耗均衡会池中已擦除的块,并为下一次写入选择擦除计数最低的块。
另一方面,静态损耗均衡会选择总擦除次数最少的目标块,如有必要,擦除该块,将新数据写入该块,并确保当静态数据块的块擦除计数低于a时将其移动一定的门槛。由于闪存控制器上的开销,移动数据的这一额外步骤可能会降低写入性能,但是静态损耗均衡比动态损耗均衡在延长固态设备寿命方面要有效得多。
飞思卡尔半导体为其Kinetis微控制器描述了一种可靠的无线固件升级方法。
它被称为:程序闪存交换。
使用闪存交换的系统
在具有两个或更多个支持交换的内部闪存块的设备中,可以交换每个闪存块的存储器基地址。每个闪存块的地址位置将因此在设备的逻辑存储器映射中交换。重置后,内置的闪存交换系统实质上是通过逻辑内存映射中闪存块的位置来选择执行哪个软件。这使得代码备份系统的编程更加容易。您可以在一个块中执行同时擦除/编程另一块。在Kinetis设备上,闪存交换系统监视/控制从旧应用程序切换到新应用程序的所有步骤。在其中一个步骤中发生断电的情况下,还可以确保可靠运行。
优点
- 易于编程。应用程序总是在内存映射的下部块之外执行。
- 容许功率损耗。
- 无需引导加载程序。不延迟主应用程序的启动。
- 非常适合多任务操作系统。减少应用程序停机时间。在多任务系统中,可以在后台任务运行时继续执行主要的应用程序任务,以更新应用程序的新副本。
- 备份代码。可以恢复到已知的工作应用程序。
缺点
- 存储备份副本所需的额外闪存空间。
您可以更新块,然后交换它们。
链接的文件包含详细说明。
它可以确保更安全的固件升级,但是由于它需要更多的闪存,因此肯定会花费更多。同样不适用于任何类型的微控制器,仅支持内部闪存模块交换的微控制器。