灵活更新固件——IoT设备的关键

物联网(IoT)设备正迅速引入各大市场 , 从家用电器到医疗设备、再到汽车 , 应用范围十分广泛;制造商必须通过不断创新和灵活地采用或集成新技术来领先于竞争对手 。为了满足新功能的需求和新法规的要求 , 设计人员必须将灵活性纳入其产品中 , 以适应不断发展的IoT生态系统 。固件更新不仅能够在客户现场的初始部署期间进行定制 , 还可以在产品部署到现场后添加新功能/特性 , 并且支持在使用过程中修复任何固件问题 。NOR闪存等非易失性存储器件具有可重复编程能力且可靠性极高 , 通常可用作固件代码存储介质 。通过重新编写器件固件代码(位于器件使用的非易失性存储器中)的一部分 , 制造商可轻松更新器件功能 。想要更新固件时 , 有三件事情需要考虑:更新哪些/多少代码、更新频率以及执行更新所需的时间(速度) 。

更新哪些/多少固件代码
在IoT设备的初始设计阶段 , 必须考虑更新哪些/多少固件代码 。相对于不可更新部分 , 固件的可更新部分必须存储在NOR闪存器件的独立区域中 。更新NOR闪存的任何片段都需要先擦除存储器的这一部分 , 然后将新信息编程到该部分中 。NOR闪存分为称为扇区和块的多个部分 , 它们的大小各有不同 。NOR闪存器件(如采用SST SuperFlash?技术的器件(部件编号SST26VF064B(64Mb)))分为多个均一的4KB扇区 , 各个扇区可单独擦除和重新编程(4KB=4*1024*8位=32,762位) 。它还可分为更大的8KB、32KB和64KB块 , 这些块也可单独擦除 。因此 , 一个8KB块有2个扇区 , 一个32KB块有8个扇区 , 一个64KB块有16个扇区 。图1给出了采用8KB/32KB/64KB块的SST26VF064B的存储器构成 。各个块也可以单独进行保护 。在对闪存的任何部分执行任何更新前 , 必须取消保护该部分中的块 , 以允许擦除和编程操作 。完成更新后 , 谨慎地再次对这些块进行保护 , 以避免意外写入或擦除这些区域 。固件的可更新部分必须以足够灵活的方式划分为扇区和块 , 以便同时支持有限数量和最大数量的特性/功能更新 。由于执行更新的速度由需要擦除和重新编程的扇区和块数决定 , 因此在组织固件的可更新部分时 , 最好同时考虑速度和灵活性 。图2给出了将存储器组织为可更新和不可更新部分的示例 。引导代码等不可更新部分存储在受保护区域中 。固件的可更新部分(如特性/功能)根据灵活性要求分为较小的块或较大的块 。可更新的镜像文件存储在较大的块中 , 可更新的变量/参数存储在较小的块中 。

图1:SST26VF064B的存储器构成(映射)——由8个8KB块、2个32KB块和126个64 KB块组成

图2:将存储器组织为多个不可更新部分(例如:引导代码)和可更新部分(例如:功能/特性代码、镜像文件代码和参数变量代码)

更新频率
固件更新频率的主要限制是应用中所使用存储器的耐擦写次数限制 。SuperFlash技术存储器(如SST26VF064B)的耐擦写次数可达100,000次 , 这意味着每个扇区可编程和擦除100,000次 。固件可以更新100,000次听起来很多;然而 , 许多IoT设备会在使用期间收集数据并将信息存储在NOR闪存中 , 因此在计算最大耐擦写次数限制时必须考虑这一点 。考虑到耐擦写次数 , 必须在存储器中分配足够多的扇区 。下面将举例说明:假设IoT设备正在收集和存储16个字节的信息 , 并且信息预计在产品的使用寿命期间收集和存储1亿次 。可以按如下方式计算应当分配的扇区数:
1个扇区=4KB
假设扇区中的所有地址单元用于存储信息(一次存储16个字节的数据) , 然后写入到一个新的地址单元 , 直至达到扇区末尾(例如 , 0x0000-0x000F、0x0010-0x001F、0x0020-0x002F等)
由于4KB/16字节=256 , 这即是达到扇区容量并擦除扇区中任何数据之前可以写入存储介质的次数
1个扇区的耐擦写限值=100,000次
因此 , 如果1个扇区可以写入256次且耐擦写次数为100,000次 , 则可以收集和存储数据2560万次
如果一个应用需要收集和存储数据1亿次 , 则要分配的扇区数量为100,000,000/25,600,000=3.9 。因此 , 在本例中 , 需要分配4个扇区以在应用的生命周期内存储16个字节的数据 。
IoT设备工程师需要进行类似的计算 , 以便为数据记录参数分配足够多的扇区和块 , 以免超出其NOR闪存器件的耐擦写限值 。

更新速度
可根据需要擦除和重新编程的块和扇区数来计算更新速度 。假设需要重新编程SST26VF064B的几个64KB块中存储的1Mb、2Mb或4Mb固件代码/数据 。代码/数据可以由固件代码、镜像文件或需要更新的其他代码组成 。更新过程涉及对闪存执行一系列命令指令 。序列将从取消保护存储器块开始 , 然后擦除这些块、用更新的数据/代码进行编程 , 最后重新进行保护 。对于SST26VF064B , 更新1Mb/2Mb/4Mb存储器所需的指令序列如表1所示 。从表1中可以看出 , 两个最重要的时间是擦除时间和编程时间 。SST26VF064B采用可提供出色擦除性能的SuperFlash技术 。SuperFlash技术与传统闪存的擦除和编程性能的比较如表2所示 。与传统闪存相比 , SuperFlash技术提供的优异擦除性能对于缩短更新时间非常有用 。SST26VF064B支持的最大时钟频率为104MHz , 最大扇区擦除时间为25ms , 最大块擦除时间为25ms , 最大页编程时间为1.5ms 。此外 , 从发出每条命令指令到闪存以104MHz时钟频率工作 , 中间还需要12ns延时(CE高电平时间) 。表1所示的命令序列与编程和擦除时间的知识结合使用时 , 可计算更新1Mb/2Mb/4Mb SuperFlash技术存储器和传统闪存所需的时间 , 具体方法分别如表3和表4所示 。这些计算必须由IoT设备工程师完成以估算执行更新的速度 , 目的是最大程度缩短更新期间的IoT设备停机时间 。

表1:更新1Mb/2Mb/4Mb存储器的闪存命令指令序列

表2:SST26VF064B和传统闪存的编程和擦除时间

表3:更新1MB/2Mb/4Mb SuperFlash技术存储器所需的时间

表4:更新1MB/2Mb/4Mb传统闪存所需的时间

结论
IoT设备设计工程师需要在更新应用程序代码和数据时提供一定的灵活性 。更新哪些/多少代码、更新频率和更新速度是设计IoT设备时需要解决的问题 。非易失性存储器的选择会影响这些问题 , 并在计算代码更新的时间和速度方面起到关键作用 。
【灵活更新固件——IoT设备的关键】

    推荐阅读