当前位置:首页 > 嵌入式 > 嵌入式软件
[导读]基于Bootloader的可靠嵌入式软件远程更新机制

1  随着嵌入式系统在各个领域的广泛应用,嵌入式软件的维护变得日益重要[1]。嵌入式系统投入实际环境中运行后,一部分在软件开发过程中无法充分测试的错误便会暴露出来;在嵌入式系统的运行期内,用户也往往会对嵌入式软件提出新的功能要求和性能要求。因此,嵌入式软件的更新逐渐成为嵌入式系统实际应用的一个重要问题。当嵌入式系统安装数量较多,或安装位置不方便的情况下,采用人工更新方式会花费较大的人力和物力。远程自动更新则在嵌入式系统中设计一个有线或无线的通信接口,在异地采用远程通信的方式实现嵌入式软件的自动更新。该方式能有效地降低嵌入式软件的更新和维护成本,因此受到了广泛的关注。当前对嵌入式软件远程自更新技术的研究主要停留在更新方法的设计上,对如何确保更新过程的可靠性还没有深入的研究。更新的可靠性主要受两个方面的影响:一是更新数据远程传输的可靠性;另一方面是系统更新后启动的可靠性。在采用嵌入式Linux、Windows CE等较为复杂的操作系统时,一般设计一个独立的bootloader程序[2][3],对系统进行初始化并引导嵌入式操作系统。这种结构的嵌入式系统的启动与bootloader紧密相关。本文针对采用bootloader的嵌入式系统,提出了一种高可靠的嵌入式软件远程自动更新机制,并以基于ARM微处理器[4]、嵌入式Linux操作系统[5]和无线通信接口的嵌入式系统为例进行了软硬件设计。然后将更新机制应用到实际系统中进行测试,最后给出了本文的结论。

2  更新系统的总体结构

本部分以ARM和嵌入式Linux操作系统为例,介绍远程自更新系统的整体结构。支持远程自更新的嵌入式系统可以划分为前端运行模块和后台控制模块两部分。前端运行模块采用基于ARM9核心的S3C2410微处理器,最高主频可达200Mhz,配有8M的RAM和32M的FLASH存储器,运行ARM-Linux嵌入式操作系统,具有独立设计的bootloader程序。后台控制模块用于实现对前端运行模块的远程异地控制,是系统的控制核心。前端运行模块通过无线模块BCM860接入到CDMA2000-1X无线通信系统,继而连接到Internet。CDMA2000-1X是第2.5代移动通信系统,支持较高速率的数据分组业务。后台控制模块采用有线方式直接与Internet相连接,与前台运行模块之间进行标准的基于TCP/IP协议的通信。状态信息、控制信息和更新文件都在这一数据链路上进行传输。

图1 系统结构

3  更新系统的软件设计

3.1  Flash存储器的布局

传统的采用Linux的嵌入式系统的FLASH存储器的布局如图2(a)所示。为了叙述方便,我们将Linux内核和文件系统合并称为Linux镜像文件。系统进行软件更新时,先把新镜像文件下载到内存中,然后烧写到FLASH的镜像文件存储区,覆盖旧的镜像文件。该方法没有考虑更新过程中可能遇到的干扰。如果在更新中因为突发的干扰出现更新数据错误或烧写错误,就可能导致软件更新后bootloader无法启动新的镜像文件,前端模块无法运行,并失去了与后台控制中心的联系,成为“孤立系统”。这种情况发生后只能到前端系统的安装地点进行人工处理,从而导致花费较大的代价。

图2  (a) 传统的FLASH布局  (b) 自更新系统的FLASH布局

为了提高软件更新的可靠性,本机制对FLASH存储器的布局进行了重新设计,如图2(b)所示。Bootloader存储区后面设计了3个镜像文件存储区。其中一个存储区用于存放当前要启动的最新的镜像文件,称为当前区;另一个存储区用于存放上一版本的镜像文件,称为前版本区;剩下一个存储区用于存放最初版本的镜像文件,称为初版本区。当前区和前版本区位于前两个存储区,随着软件的更新而动态交替变化。每次进行软件更新,把新的镜像文件写入前版本区,这样当前区就变成了前版本区,前版本区则变成了当前区。初版本区固定在第三个分区,所存放的镜像文件是嵌入式系统投入运行时的最初程序,每次的软件更新都不更改该存储区的内容。此外,在FLASH的高地址处设计一个参数存储区,用于存放需要固化的系统配置参数。更新程序需要用到启动点和更新位两个配置参数。启动点用来指示bootloader需要从哪个存储区加载镜像文件,更新位用来指示系统进行软件更新的状态。

3.2 更新任务的设计

在嵌入式Linux系统中,将更新该任务设计成一个阻塞在更新信号量上的进程。系统每次启动后,更新进程首先向后台控制模块报告当前的软件版本号,随后检查FLASH上的更新位,然后进入阻塞状态。当系统收到控制模块发来的更新指令后,释放更新信号量,更新进程开始进行软件更新。更新进程采用TCP协议接收控制模块发来的新程序镜像文件。考虑到无线数据传输的特点,为了增强传输可靠性,在应用层设计一套具有校验、确认和重传功能的收发协议,以保证新镜像文件的数据能够准确无误的通过Internet和移动通信系统传输到前端模块的内存中。当新镜像文件下载完毕后,更新进程先判断前版本区在FLASH上的位置,然后调用FLASH的读写函数将新镜像文件写入前版本存储区中。写完后将更新位置1,并更改启动点。如果当前运行的程序版本为最初版本,则将新镜像文件同时写入前两个存储区。更新进程的程序流程如图3所示。

图3  更新进程流程图

图4  异常处理流程图

3.3  更新后的启动流程

前端运行模块具有独立的bootloader,并固化在FLASH存储器的低地址处,系统启动后总是能够进入bootloader。Bootloader通过读取参数存储区的启动点参数来引导3个程序存储区的某一个镜像文件。在正常情况下,启动点参数总是指向当前区。当软件更新后,启动点也随之在存储区1和存储区2之间交替切换,指向新镜像文件的存储区。这样,当更新进程重新启动前端模块后,bootloader便会引导新的镜像文件。

为了增强软件更新后系统启动的可靠性,本机制利用ARM体系的异常来处理启动时的出错情况。在ARM体系结构中有7种异常,与启动过程密切相关的异常有未定义指令、指令预取中止和数据访问中止3种。通过设计异常处理程序来加载备份存储区的镜像文件。当bootloader引导新镜像文件失败后,进入异常处理函数,在此函数中将启动点更改为指向前版本区,并把更新位置为2,表示已经更改过两次启动点。重启系统后bootloader便会恢复引导上一版本的程序镜像文件。由于软件更新时只是在相邻的存储区写入了新镜像文件,并未对上一版本程序的存储区进行任何操作,而且上一版本程序是更新前已经正常启动运行过的程序,所以一般情况下上一版本程序应该能够正常引导成功。如果由于意外干扰导致上一版本程序仍然无法启动成功,此时将再次进入异常处理程函数。在函数中先读取更新位的值,如果更新位为2则将启动点指向初版本区,并把更新位置为3。重启系统后bootloader便会引导最初版本的程序镜像文件。最初版本的镜像文件在前端模块安装后从未更改过,并在安装前进行过验证测试,具有非常高的可靠性。当新版本程序和上一版本程序都无法启动成功时,系统尝试启动最初版本的镜像文件,以保证系统基本功能的正常运行,并确保前端模块与后台控制模块之间不会失去联系。后台控制模块根据前端模块启动后报告的版本号来获知软件更新的信息并采取相应的措施。在异常处理函数中读取启动点值的时候,如果读取值异常或读取出错,则对启动点进行修复,异常处理函数的流程如图4所示。通过利用启动点、更新位和异常处理程序,当软件更新过程中遇到了干扰和错误时,本机制能够依次选择启动两个备份的软件版本,有效地提高了软件更新的可靠性,防止了“孤立系统”的出现。

4  测试结果[!--empirenews.page--]

       在一个实际运行的无线远程监控系统中应用本更新机制,以验证和测试其性能。首先对更新进程的运行效果进行测试。结果表明,每次测试更新进程均能正确的启动与控制模块之间的数据传输,通过在应用层引入确认和重传机制,新程序的镜像文件均能通过Internet和无线网络准确的传输至前端运行模块。测试的重点是系统软件更新完毕后新程序启动的可靠性。对软件更新过程中遇到的干扰和数据错误采取模拟的方式,以此测试bootloader能否正确的启动备份程序。测试中模拟了3类情况:一类是FLASH上的程序镜像文件随机的在某些地址处出现数据错误,另一类是FLASH上的程序镜像文件随机的出现某些数据的地址错位,第三类是启动点的数值发生错误。将这3类情况分为6种具体方案进行测试,每个方案测试20次,查看系统能否按照期望的结果启动程序镜像。测试方案及结果如表1所示。

从测试结果中可以看出,本更新机制对FLASH中的数据错误识别效果最好,每次启动时均能正确地进入异常并启动备份程序;对FLASH中的数据地址错位的识别率也达到了80%以上。当程序的数据正确但存放地址错位时,存在一定的概率会使得ARM处理器取出的指令是可以识别和执行的,从而使程序运行到未知状态而导致系统无法启动。此外,更新机制对配置区具有较强的修复能力,防止了因为配置区数据出现错误而导致无法启动的情况的发生。实验平台的测试结果表明本更新机制能有效地提高嵌入式软件更新后重新启动的稳定性和可靠性,具有较强的自我恢复能力。

5   结语

本文以提高可靠性为设计目标,提出了一种基于bootloader的嵌入式软件远程自动更新机制。本更新机制由于同时保存了三个镜像文件,因此需要更多的FLASH存储空间,略微增加了嵌入式系统的硬件成本。但相对于更新机制的远程化、自动化和可靠性所带来的维护成本的巨大降低,这个代价是值得的。

本文主要创新点:通过设置两个备份程序存储区,利用嵌入式处理器的异常机制,使嵌入式系统的更新具有了较强的自我恢复能力,较大的提升嵌入式软件更新过程的可靠性,尤其能够有效地防止嵌入式系统更新后出现的系统启动失败的情况,具有较高的实用价值。另外,通过CDMA系统实现远程自动更新,可以摆脱地域限制,不受布线的束缚,提高了嵌入式系统远程更新的便捷性。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

随着嵌入式计算设备基础硬件性能的提升,在通信、工业制造、交通运输等领域,嵌入式系统逐渐承担起更加综合化和关键的任务,这也导致嵌入式软件在结构愈加复杂的同时,其安全性问题也越来越受到重视。堆栈是嵌入式软件中的重要存储结构,...

关键字: 嵌入式软件 堆栈

嵌入式开发是一种专门针对特定硬件平台设计和实现软件系统的工程实践,它涵盖了从需求分析、系统设计、编程实现、调试测试直到产品部署及维护的全过程。本文将深入探讨嵌入式开发的主要阶段,分解其流程并阐述每个步骤的关键要点,以便于...

关键字: 嵌入式开发 嵌入式软件

如今,汽车已经不再是一个简单的交通工具,而是一种智能化的移动终端。通过集成各种先进的传感器、控制器和执行器,汽车可以实现对环境的感知、分析和决策,实现自动驾驶、智能导航、车辆间通信、互联网连接等功能。这些功能不仅提高了驾...

关键字: HMI 驾驶舱 嵌入式软件

为增进大家对嵌入式的认识,本文将对嵌入式软件方向的分类以及嵌入式的应用予以介绍。

关键字: 嵌入式 指数 嵌入式软件

在这篇文章中,小编将为大家带来嵌入式软件及其作用的相关报道。如果你对本文即将要讲解的内容存在一定兴趣,不妨继续往下阅读哦。

关键字: 嵌入式 嵌入式软件

嵌入式软件测试是针对嵌入式系统中的软件进行验证和验证的过程。嵌入式系统是集成在其他设备或系统中的计算机系统,例如汽车、医疗设备、家电等。为确保嵌入式软件的质量和可靠性,进行适当的测试是至关重要的。嵌入式软件测试是确保嵌入...

关键字: 嵌入式软件 计算机 硬件

嵌入式软件开发已经成为现代科技领域中不可或缺的一部分。从智能手机到家用电器,从汽车到医疗设备,嵌入式软件无处不在。然而,嵌入式软件的开发具有挑战性,因为它需要满足高度的性能、稳定性和可靠性要求。为了确保嵌入式软件的成功开...

关键字: 嵌入式软件 智能手机 家用电器

在嵌入式软件开发中,利用完整的应用跟踪,可为开发人员分析其产品行为提供无限的可能性。通过对应用程序的全面了解,他们可以跟踪每一条指令,看看他们的应用程序是否按照预期运行,或者是否出现错误或漏洞。那么,如何才能最大化地利用...

关键字: RISC-V 嵌入式软件

2023年上半年收入7.459亿元 同比增长5.1% 毛利率水平上升 海外收入同比增长65.4% 香港2023年8月22日 /美通社/ -- 金邦达宝嘉控股有限公司及其附属公司(以下合称「金邦达」、「...

关键字: 数字化 代码 嵌入式软件 COM

【2023 年 6 月 9 日,德国慕尼黑讯】英飞凌科技股份公司(FSE代码:IFX / OTCQX代码:IFNNY)通过在现有的AUTOSARv4.2.2 MCAL基础上增加对AUTOSARv4.4.0的支持,进一步扩...

关键字: 嵌入式软件 发动机
关闭
关闭