IoT OTA更新的4个方法

不想让您的设备变砖?跟着文章一起来学习物联网OTA更新方法。

每个嵌入式设备都需要设备固件更新(DFU)功能。为什么?

不可避免地,您必然会附带错误。您无法预期每个用户的输入,也无法预期最终用户使用设备的所有方式。但这只是其中的一半;设备现在越来越复杂。即使是最出色的质量检查团队也无法解决所有问题。考虑一下NASA,无论是由于意外的崩溃错误还是在软件更新后发生崩溃,对于火星探测器所需的固件更新都不陌生。没有人会质疑NASA极其严格的流程和有据可查的测试方案,但即使是NASA都依赖固件更新。

加快DFU计划需求的另一个因素是固件更新中使用的第三方软件的增加。第三方代码可能是您设备的核心,这会引入各种注意事项。 SDK,协议实现和第三方库正以日新月异的速度变化,因此设备开发人员需要确保其代码能够跟上发展。保持兼容性或跟上SSL证书肯定需要将来进行更新。而且第三方软件中发现的错误通常特别严重。

一个示例来自著名的赛普拉斯PSoC系列芯片,以及其蓝牙低功耗堆栈,其中包括损坏的随机数发生器。这样做的风险是,黑客可能会中断Cypress和与其配对的设备之间的通信。借助OTA更新来修复此类安全漏洞或其他特别重要的错误的能力至关重要。为固件更新建立可靠的基础架构是确保您的设备永不过时的一种方法。

最后,强大的固件更新系统使团队可以交付更好的产品并更快地吸引客户。通过采用敏捷开发工作流程,设备开发团队可以交付其最小可行产品(MVP)并进行迭代。

我看到越来越多的产品进入未完成的批量生产阶段,因为团队计划在所谓的Day-0更新中完成产品的生产-当您将固件冻结在不完整的状态下,从而有利于产品出厂并在客户掌握设备后对其进行更新。 Day-0更新对设备开发人员的好处是显而易见的;由于传统的一般制造业(GM)停滞不前,您基本上会浪费三个月的开发时间。

借助Day-0更新,您可以不断改进算法和产品,并更快地交付产品。

毫不奇怪,设备固件更新是固件中最敏感的子系统之一。如果做得不好,则存在砌砖设备的真正风险。以下是四个安全的,最佳的空中下载(OTA)设计最佳实践。

DFU需要与应用程序分开

我想象大多数硬件开发人员在必须学习这种分离必不可少的艰辛方法时,已经有(或几位)经验。 对我来说,这是我们代码中未初始化的变量,设置为0,在对我们的应用程序代码进行了一些改组之后,该变量设置为1。

它阻止了大量设备从现有版本进行更新。 应用程序代码需要定期更改,并且DFU代码应尽可能稳定。 通过将DFU代码与应用程序代码分开,可以确保无论您在应用程序中做什么,固件更新都保持不变。 实际上,您可以在引导加载程序中更新代码,以在设备启动时检查更新。

如果有可用的更新,则更新将在应用程序加载之前开始;否则,更新将开始。 如果没有,应用程序将按预期加载。

简单DFU设计
简单DFU设计

DFU应该是可更新的

同样,代码中的错误是不可避免的。 这里可以参考Jack Ganssle关于软件工程的观点,精英或前1%的人“在通过编码收集的要求中,每千行代码仅注入大约11个错误”,而较低的99%的平均水平约为120个错误 每个KLOC。

如果我们对固件应用相同的准则,那么计划设备固件更新的需求就变得显而易见。 为了实现这一点,并使其与前面讨论的将设备和应用程序代码分离的做法保持一致,我们需要创建第三个程序,即引导更新程序。

中段可更新DFU设计
中段可更新DFU设计

引导更新程序的唯一工作是更新引导程序。 如果我们要推送更新,它将在启动普通应用程序之前进行更新。 否则,引导加载程序将照常加载应用程序。

可更新DFU
可更新DFU

FU中段的故障应可恢复

设备开发和操作中经常遇到的一个问题是,如果在更新过程中出现电源故障,会发生什么情况? 为了减轻这种情况,我们需要一种回退到DFU更新器的方法。 我建议将引导程序一分为二。

首先,一个基本的,不可变的引导加载程序,其唯一的工作就是加载其他程序。 您无法更新它,但这非常简单。 辅助引导加载程序的角色具有更新和加载功能,因此更加复杂。 万一更新失败或由于断电而被禁用,我们可以回退到第一个引导加载程序,它会查看第二个引导加载程序是否应该有一个无效的程序,从而允许团队加载引导更新程序并对其进行更新。

我们自己。 这种架构有点复杂,但并不困难。 有了这个,我们就拥有了一个能够抵抗大量故障的体系结构,可以从应用程序中分离固件代码,并且其本身是可更新的。

您的非易失性数据版本管理

每个固件都依赖于一些非易失性数据,无论是序列化到闪存中的一些结构还是我们在NVRAM中保持供电的数据。 非易失性数据有时需要在不同版本之间进行更改。

如果在固件更新过程中没有提前考虑这一点,那么我们就没有很好的方法来迁移该数据,并且更改数据结构将变得非常困难。 我建议将三个字段添加到所有非易失性数据结构中。

  • 版本字段-8位绰绰有余,并且简单的整数版本将可以正常工作。
  • 提交位-设置为1时,表示尚未提交数据;设置为0时,则为提交位。 您知道在读取数据结构之前已确认该数据结构已提交。
  • 擦除位-无需擦除闪存中的整个扇区即可将数据结构的旧版本标记为无效的位。
非易失数据存储结构
非易失数据存储结构

使用这些字段,您可以为每个版本增量(例如1-> 2、2-> 3、3-> 4,...等)实现迁移功能。 如果用户在一年不使用的设备上特别过时的固件,则可以打开它的电源,打开迁移功能,然后将其更新为最新版本。

这四个最佳实践应有助于指导设备开发人员建立固件体系结构,该体系结构将DFU视为产品开发的必要部分。

专注于安全有效的固件更新结构,并使用必要的工具来帮助开发人员摆脱棘手的情况,并且您可以同时确保最终用户可以更好地使用其设备。

SO资源郑重声明:
1. 本站所有资源来源于用户上传和网络,因此不包含技术服务请大家谅解!如有侵权请邮件联系客服!3187589@qq.com
2. 本站不保证所提供下载的资源的准确性、安全性和完整性,资源仅供下载学习之用!如有链接无法下载、失效或广告,请联系客服处理,有奖励!
3. 您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容资源!如用于商业或者非法用途,与本站无关,一切后果请用户自负!

SO资源 » IoT OTA更新的4个方法