如何做到既实现固件更新,又无需暂停固件执行
投稿人:DigiKey 北美编辑
2020-04-16
如今,基于物联网 (IoT) 传感器的应用不断增多,物联网端点的微控制器固件大小及复杂性也不断增大。这类固件必须不断提高效率以加快执行速度,这也是必须实现现场闪存固件更新的原因之一。不过,要在现场安全地实施固件更新,往往需要在更新过程中暂停固件执行。这可以在一分钟内快速完成,也可能需要一小时之久,具体取决于架构、更新包的大小和网速。然而,在关键应用中,这种延迟可能是不可接受的。
本文解释了现场更新中断驱动型固件时应注意的事项,以及在更新过程中如何才能保持应用固件执行的要求。此外,还介绍了 Microchip Technology 的 PIC32MZ2048EFH144T-I/PH 微控制器,阐示了在通过网络接收更新固件的同时如何使用它来执行固件的具体方法。
固件更新的重要性
固件需要更新的主要原因有四点:修正代码中的错误、添加或改进功能、调整系统安全性以及提高固件效率。我们常常用执行特定任务或线程所需的时钟周期数来衡量代码效率。执行任务所用的时钟周期越少,代码效率越高,这就表示执行速度越快,而且通常(但并不总是)代码越简短。对基于物联网传感器的端点而言,尤其如此。因为这些应用采用中断驱动方式,所以一旦传感器或外设生成中断,就必须快速切换上下文。
两个因素会对中断驱动型物联网应用效率产生影响:架构效率和代码效率。尽管在现场改变微控制器架构有点不切实际,但是更新微控制器固件以提高效率,还是切实可行且相当普遍的做法。
基于传感器的固件基本都采用中断驱动方式。连接到微控制器串口的智能传感器会向微控制器生成中断,以中止正常执行,以便固件可以引导至这一特定传感器的中断服务程序。相比需要对传感器进行定期轮询,才能确定传感器读数是否有要传输的新数据,上述方式的效率更高。对于中断驱动型传感器,其策略优势在于仅当需要接收有用数据时,微控制器才会耗费时钟周期去读取传感器。而采用轮询方式时,如果传感器读数尚未更新,固件又必须访问传感器读取无用的数据,反而会浪费时钟周期。
使用多个传感器和任务时,需要多个子例程和中断例程来管理,这就增加了代码大小。复杂的代码需要某种形式的实时操作系统 (RTOS) 以管理所有这些单独的任务。RTOS 可以是由软件工程师编写的简单固件应用,也可以是现成的产品。RTOS 可以管理不同的固件任务,使每个任务都能在所需的时间内开始和完成,从而确保应用正常运行。如果 RTOS 需要管理很多任务,那么对于应用而言,尽量用最少的时钟周期完成任务更有好处,因为这能防止不同的任务拖延彼此。
收到中断时,完成中断服务程序所需耗费的时间主要受以下三个因素影响:
- 识别中断并准备要跳转至中断服务程序所需的时钟周期。如果任务优先级比现行任务低,那么它将延迟到当前任务完成后才会执行,具体取决于应用。
- 保存当前 CPU 状态的上下文并跳转至中断服务程序所需的时钟周期,具体取决于架构,并且不受软件工程师的控制。
- 执行中断服务程序所需的时钟周期,具体取决于软件工程师所编写代码的复杂性和效率。
固件效率越高,需要在一定时间内完成的任务之间就越不可能发生冲突。
闪存固件更新的存储器要求
要在现场可靠地进行系统更新,系统所需的闪存程序存储器就必须是应用所需的预估大小的两倍。因为只有闪存足够大,才能容纳现有的闪存固件和更新的固件。不过,对于只靠内部闪存程序存储器运行的小型系统,通过网络接收固件更新时,通常都会暂停代码执行。对于任务关键型应用而言,这可能是不可接受的,而且这与提高固件效率的目标背道而驰——停止运行时代码效率为 0!
更新闪存时执行固件
Microchip Technology 的 PIC32MZ2048EFH144T-I/PH 微控制器是一款高性能微控制器,能在更新片上闪存的同时执行固件(图 1)。PIC32MZ2048EFH144T-I/PH 基于 MIPS32 M-Class 内核架构,具有浮点单元 (FPU),主要面向中断驱动型复杂物联网端点。这款微控制器具有 2 MB 的闪存程序存储器和 512 KB 的 SRAM,以及 160 KB 的引导闪存。在 -40°C 至 +85°C 的温度范围内,PIC32MZ2048EFH144T-I/PH 内核的运行速度高达 252 MHz,-40°C 至 +125°C 时则为 180 MHz。工作电压低,范围为 2.1 V 至 3.6 V。
此外,该器件还具有 9 个 32 位捕捉/比较定时器,以便支持复杂的固件和外部信号测量。
图 1:Microchip Technology 的 PIC32MZ2048EFH144T-I/PH (252 MHz) 基于 MIPS32 M-Class 架构,具有各种串口,可用于连接外部传感器。(图片来源:Microchip Technology)
外部串口包括 9 个 UART 和 5 个 I2C 端口,还有 6 个 SPI 端口,支持音频 I2S 接口。此外,该器件还具有 12 位模数转换器 (ADC),配备 48 路输入,可用于测量精密模拟传感器的电压。通过这些串口和 ADC 输入,PIC32MZ2048EFH144T-I/PH 可以连接多个外部传感器,因而非常适合用于复杂的基于传感器的物联网端点。该微控制器具有 2 个 CAN 2.0b 端口,可以连接采用通用 CAN 协议的工业和汽车网络。
以太网端口支持 10/100Base-T 网络。USB 2.0 高速控制器支持用于其他外设或调试的外部接口,并且支持 USB OTG 功能。
这些外设中,每个都能生成一个或多个中断。既然有这么多传感器和中断源,那就必定需要保持代码效率。
为了提高效率,MIPS32 M-Class CPU 内核具有 32 个 32 位通用寄存器 (GPR),通过减少外部存储器访问来提高效率。除了常用的位设置和清除指令外,M-Class 内核还支持单周期位反转指令,通过提高信号量处理的效率,提高 RTOS 效率。该内核还具有 5 级指令流水线,可最大限度地减少存储器访问冲突,产生更多的单周期指令,从而提高效率。
此外,MIPS32 M-Class 内核还具有 7 个 GPR 影子寄存器组,由于无需耗费多个时钟周期将 GPR 内容保存至堆栈,因此可以显著提高中断性能和上下文切换速度。借助这 7 个影子寄存器组,在必须耗费时钟周期将 GPR 内容保存至堆栈之前,内核可以进行 7 次中断嵌套和上下文切换。
PIC32MZ2048EFH144T-I/PH 具有 2 个 1 MB 的闪存程序存储器 (PFM) 组,分别称作 PFM 存储体 1 和 PFM 存储体 2。每个 PFM 都有各自专用的引导闪存存储器 (BFM),分别称作 BFM 存储体 1和 BFM 存储体 2。PFM 更新期间,BFM 不需要更新。具有这两个单独的存储体有很多优点。例如,该微控制器支持双引导,因此上电时可以将其配置为从任一闪存存储体引导,从而使该微控制器支持两种不同的器件配置。
这两个闪存存储体还有一个优点,即在一个闪存存储体中更新固件的同时,可以在另一个闪存存储体中执行固件。Microchip 将其称为实时更新,也称作运行时自编程 (RTSP)。如果活动物联网端点在 PFM 存储体 1 中执行固件,那么启动 RTSP 时,将以数据块形式通过网络接收固件。此时,建议的管理方法是将新的固件数据块存储在 SRAM 中。待完整的数据块接收完毕后,在 PFM 存储体 1 中执行的固件则可以启动 SRAM 数据的编程序列写入 PFM 存储体 2。在对该固件进行编程时,仍可继续在 PFM 存储体 1 中执行固件。
数据块编程完成后,固件可通过网络请求下一个代码块,然后重复该过程,直至 PFM 存储体 2 中的代码块全部完成为止。编程完成后,固件可将 PIC32MZ2048EFH144T-I/PH 配置为下次复位时从 BFM 存储体 2 引导,并清除 NVMCON 配置寄存器的 SWAP 位以执行 PFM 存储体 2 中的新固件(图 2)。如果 SWAP=0 时必须再次更新 PIC32MZ2048EFH144T-I/PH 固件,则可以在 PFM 存储体 2 中执行固件,同时更新 PFM 存储体 1。
图 2:PIC32MZ2048EFH144T-I/PH 微控制器具有两个独立的 PFM 存储体。SWAP=1 时,可以执行 PFM 存储体 1 中的固件,而更新 PFM 存储体 2。清除使 SWAP=0,则可使微控制器从 PFM 存储体 2 引导。(图片来源:Microchip Technology)
根据固件的需要,可以通过 BFM 或 PFM 更改 SWAP 位的状态。
开发双引导固件
针对使用 PIC32MZ2048EFH144T-I/PH 微控制器的开发,Microchip Technology 提供了 DM320007 PIC32MZ 入门套件(图 3)。该开发板使用专用的连接器和针座连接器,支持多个串口。USB 主机端口可用于调试,而 USB OTG 端口可用于应用。当连接到 PC USB 端口时,USB 转 UART/I2C 连接器则可在连接的主机 PC 上创建一个虚拟 COM 端口,使主机 PC 能够与 PIC32MZ 上的 I2C 端口通信。
图 3:Microchip Technology 的 DM320007 紧凑型入门套件支持开发和测试采用 PIC32MZ2048EFH144T-I/PH 微控制器的 USB 和以太网应用。该套件包含适用于 USB OTG、USB 主机、10/100 以太网和 UART/I2C 的连接器。(图片来源:Microchip Technology)
借助 40 针扩展针座连接器,还能连接 PIC32MZ EF 上的其他 I2C、SPI 和 UART 端口,以及通用 I/O (GPIO) 引脚。此外,还有 3 个按钮和 3 个 LED 可通过固件进行配置。
总结
鉴于代码复杂性的增大,关键系统的物联网传感器端点对存储器的要求越来越高。代码越复杂,就越有必要提高固件效率,以便缩短固件中上下文切换的响应时间。通过选择可以有效运行中断驱动型代码的微控制器,同步进行固件检索和更新,开发人员就能在不牺牲性能的情况下,提高关键物联网应用的可靠性。
免责声明:各个作者和/或论坛参与者在本网站发表的观点、看法和意见不代表 DigiKey 的观点、看法和意见,也不代表 DigiKey 官方政策。