基于分散加载技术的单片机增量升级程序设计

2022-05-11 08:34陈文斌黄明鑫刘根利
无线互联科技 2022年3期
关键词:固件应用层增量

陈文斌,黄明鑫,刘根利,杨 志,翟 渊

(重庆科技学院 智能技术与工程学院,重庆 401331)

0 引言

随着物联网技术的快速发展,程序的远程升级成了刚需。目前,多数单片机程序远程升级都是基于单片机的 IAP 技术[1]。然而,物联网设备往往数量较多,升级所有设备对服务器开销大,基于差分原理的升级方式对硬件要求又高,在硬件资源有限的微控制器MCU上使用差分算法存在局限性。因此,本文提出了一种应用在MCU上的新型增量升级方法,将后期不需要升级和需要升级的代码独立开来,形成固件工程和应用工程。通过这种方法,实现了固件代码和升级代码的解耦,同时不需要复杂的差分算法支持,能降低硬件对资源的要求,提高升级效率,降低升级成本。

1 原理

分散加载(scatter)文件是一种文本文件,可以用来描述连接器生成映像文件时需要的信息。通过编写一个分散加载文件来指定ARM连接器在生成映像文件时如何分配 Code,RO-Data,RW-Data,ZI-Data等数据的存放地址[2]。有时候用户希望将不同代码放在不同存储空间,也就是通过编译器生成的映像文件需要包含多个域,每个域在加载和运行时可以有不同的地址。要生成这样的映像文件,必须通过某种方式告知编译器相关的地址映射关系[3]。

2 设计思路

MCU编译后的代码在执行文件中是按照一定区域进行排列的,并且函数在执行文件中的首地址就是其函数的入口地址,因此通过地址能直接调用函数。参考单片机中断函数向量表的形式,划分一部分空间出来专门存放函数的入口地址,其他工程则利用这一地址,偏移之后,就可以得到函数的地址,实现不同工程之间函数的调用。其不同工程在单片机FLASH的存储空间分配原理,如图1所示。在每个工程中再分配一定的空间用于存储函数地址,即图中应用程序接口(Application Programming Interface,API)部分。

图1 存储空间分配示意

3 总体框架

为了实现Firmware固件层代码与APP应用层代码的解耦,APP应用层工程中不能含有Firmware固件工程中的代码。Firmware固件层代码应该在正常完成调试之后,将APP应用层会用到的函数的地址集中存放在单片机FLASH固定位置,以便APP应用层能够通过这一固定的位置来定位函数地址,实现对Firmware固件层函数的调用。根据以上原理和设计要求的考虑,软件框架设计如图2所示,整个框架一共包括以下3个部分:固件工程模块、程序升级模块、应用工程模块。

图2 总体软件框架结构

(1)固件工程模块。固件工程是存储设备中不需要升级的代码,例如轮椅传感器驱动程序、内核程序、操作系统程序、轮椅控制程序等。这部分程序代码量是最大的,且基本不需要升级,因此只需要在设备投入使用之前写入程序。同时,这个模块还为升级模块和应用层模块提供必要的API接口。

(2)应用层模块。应用层模块用于存储后期升级会用到的程序,如面部识别算法等。其中固件工程模块与应用层模块之间函数能够相互调用;设备投入使用后,需要对代码进行小修改,就可以将这些代码放到应用层工程中,以后修改这些函数代码时,只需要重新编译,再通过OTA进行升级。

(3)程序升级模块。用于更新应用层的代码。这里的升级模块可以使用固件工程中的函数,例如校验函数、无线通信函数等,同时也可以单独设计成一个Bootloder程序。这样不但可以升级应用层程序,还可以升级固件层的程序。

4 增量升级程序设计

4.1 增量升级工程程序调整

采用新的增量升级方法需要将代码分为后期需要升级的部分作为应用层工程,将后期不需要升级的部分作为固件工程。其程序的调整可以以一个函数为单位进行调整,并根据需要为添加到应用层工程的函数单独创建一个或多个c文件和h文件,再将这些代码添加到一个新的工程中;应用层可以根据升级需要再分成多个工程。

4.2 RAM和ROM空间的划分

程序的正常运行需要一定的ROM和RAM空间,多个工程相互结合实现最终的功能,需要为每个工程划分一片空间来保证程序的正常运行。

4.3 函数对外接口和函数访问接口设计

现在虽然将原始代码分成了多个工程,但是多个工程之间缺少相应的函数名,是无法编译的,接下来就需要实现不同工程之间的关联,保证函数能在不同工程之间实现相互调用。

(1)函数对外接口设计。在C语言函数的调用是通过函数地址进行的,图1中每个工程中的函数地址存储在固定的地址,其他工程通过访问这一固定的地址来实现不同工程之间的函数调用。

函数对外接口的设计有多个方法。方法一:创建一个指针型结构体,并将其值赋值为函数的地址,再使用编译器的__attribute__指令,将该结构体变量存放在固定地址;方法二:可以将变量在启动文件中使用DCD指令申请4字节的空间用于存储函数指针结构体变量。

(2)函数访问接口设计。其他工程需要访问这些函数时,通过创建一个函数指针结构体变量,并将其首地址指向这一固定地址。其他工程通过访问函数指针结构体变量,进而访问不同工程的函数,实现不同工程之间的函数调用。

5 结语

本论文通过介绍目前增量升级技术的应用和目前基于差分原理的增量升级方式在低成本MCU上应用的局限性,提出了一种新的增量升级方法。根据增量升级需求,希望能够实现对单个函数升级的要求,增量升级的设计过程。采用新的增量升级方法在低成本MCU上应用具有一定的优势。

猜你喜欢
固件应用层增量
提质和增量之间的“辩证”
基于分级保护的OA系统应用层访问控制研究
基于均衡增量近邻查询的位置隐私保护方法
基于固件的远程身份认证
新一代双向互动电力线通信技术的应用层协议研究
物联网技术在信息机房制冷系统中的应用
德州仪器(TI)发布了一对32位增量-累加模数转换器(ADC):ADS1262和ADS126
一种通过USB接口的可靠固件升级技术
多路手机固件升级工具设计
Current advances in neurotrauma research: diagnosis, neuroprotection, and neurorepair