摘 要:本文以ARM处理器为平台,以恩智浦公司的LPC2136为例,在In-Application Progamming(IAP)技术原理基础上设计并实现了嵌入式微处理器在线及远程升级技术。该技术摒弃了传统升级前需要打开设备跳线等繁琐过程,并解决了升级过程意外中断、传输误码等关键难点问题。
关键词:应用编程;ARM;启动装载程序
中图分类号:TP368.11;TN06 文献标识码:A 文章编号:2096-4706(2018)08-0050-02
Abstract:This paper takes ARM processor as the platform,takes LPC2136 of NXP Company as an example,and designs and implements the online and remote upgrade technology of embedded microprocessor on the basis of the principle of In-Application Progamming(IAP)technology. The technology eliminates the tedious process of opening device jumpers before upgrading,and solves the key problems such as unexpected interruption during the upgrade process,transmission error code and so on.
Keywords:application programming;ARM;boot loader
0 引 言
目前嵌入式系統应用相关技术取得了突飞猛进的发展,嵌入式应用已经深入到工业控制、通信、消费类电子、信息家电等不同领域,同时ARM处理器芯片由于其突出的低功耗、高性能、应用范围广泛等特点在嵌入式系统中得到广泛的应用。为了能够满足客户需求的变化,为现有产品提供新的功能或修正原有系统存在的缺陷,从而延长原有产品的生命周期,降低维护保养费用,产品所设计的嵌入式系统支持固件升级是必不可少的。在很多嵌入式应用场合,由于所使用的设备正在承担关键的职能,不能因为固件升级过程而中断该设备的使用。
目前的固件升级方法,往往需要打开设备跳线等繁琐过程,升级过程可能出现意外中断、传输无码等问题,固件升级完毕,需要对固件系统进行复位后,才能继续工作,不能提供连续的服务。本文以恩智浦(NXP)公司的ARM7芯片LPC2136为例,提出基于ARM的固件升级方法,可以在系统运行过程中完成固件升级、提供连续的服务,具备良好的可靠性和扩展性。
1 IAP基本原理
应用编程(IAP)函数是固化在微处理器内部Flash上的功能函数代码,用户程序可以直接通过调用这些代码来对内部Flash进行擦除和编程操作。IAP技术主要应用于嵌入式系统的数据存储和在线升级过程,通常可利用芯片的串行口接到计算机的RS232口、通过现有的Internet、无线网络或者其他通信方式很方便地实现在线以及远程升级和维护。LPC2136的IAP程序位于芯片的Boot Block中,芯片出厂时由厂家写入,不可修改。IAP程序是Thumb代码,位于地址0x7FFFFFFO[1](重映射后地址)处。用户可通过跳转到该地址来调用相应的IAP函数,具体的调用方法可见文献[2]中的相关章节。由于IAP代码是Thumb代码,要设置编译器以支持从ARM指令集到Thumb指令集的转换[3]。对于LPC2136的应用编程来说,应当通过寄存器r0中的字指针指向存储器(RAM)包含的命令代码和参数来调用IAP程序。IAP命令的结果返回到寄存器r1所指向的返回表。用户可通过传递寄存器r0和r1中的相同指针重用命令表来得到结果。参数表应当大到足够保存所有的结果,以防结果的数目大于参数的数目。IAP参数传递如图1所示,参数和结果的数目根据IAP命令有所不同。参数的最大数目为5,由“将RAM内容复制到Flash”命令传递。结果的最大数目为2,“扇区查空”命令返回。命令处理程序在接收到一个未定义的命令时发送状态代码INVALID_COMMAND。
2 基于IAP的ARM片内Flash的固件升级软件设计
本文基于IAP的ARM片内Flash的固件升级设计,将ARM片内Flash划分为2个区域,其中一个区域用来正常运行固件,另一个区域用来升级固件;获取新版本的固件,存储在外部存储器存储中,以及设置各用户固件备份区的升级标志;当需要升级时,将需升级的固件更新到用户代码分区2中;同时系统在升级过程中,执行用户代码分区1中的固件,并不需要系统暂停去实现固件升级,可以在系统运行过程中完成固件升级,可以提供连续的服务,保证升级完成后系统中至少有一套可执行的固件,对于升级后的固件的可执行性和执行结果能够进行可靠识别。
将ARM片内Flash划分为用户代码分区1和用户代码分区2,其中,用户代码分区1为低地址区域,用户代码分区2为高地址区域,例如,对于地址为1000的ARM片内Flash,将地址从0至500划分为户代码分区1,将地址从500至1000划分为户代码分区2。为了进一步确保固件升级数据的安全性,防止升级过程出现的意外中断、传输数据错误等情况,进行固件升级信息完整性的判断。基于ARM的固件升级流程,如图2所示。具体的执行操作步骤:(1)系统将ARM片内Flash划分为用户代码分区1和用户代码分区2。(2)将初始固件导入到用户代码分区1,系统执行用户代码分区1中的固件。(3)当升级ARM固件时,系统获取新版本的固件,并导入外部存储器。在外部存储器中,初始化外部存储器时,设置每个用户固件备份区的升级标志为不需升级;当有新版本的固件时,将新版本的固件存储在其中一个用户固件备份区,并设置该用户固件备份区的升级标志为需要升级。(4)系统检测外部存储器中的升级标志,当需要升级时,获取所需升级固件的长度信息。(5)获取所需升级固件的校验信息,判断固件升级信息是否完整,若是,则进行步骤(6);若否,则进行步骤(7)。(6)将需升级的固件, 从用户固件备份区更新到用户代码分区2。(7)继续执行用户代码分区1的固件。
为了提高系统固件运行的安全性,如图3所示固件升级后系统进行重启动,装载程序(Boot Loader)并判断固件的升级执行情况,具体的操作步骤:(1)系统重启动。(2)系统判断是否需要升级固件;若是,则进入步骤(3);若否,则进行步骤(4)。(3)按图1所示的方法进行固件升级。(4)判断用户代码分区2的执行成功标志是否为真;若否,则进行步骤(6);若是,则进行步骤(5)。(5)试执行用户代码分区2的固件,设置用户代码分区2的执行成功标志为假(即清除用户代码分区2执行成功标识);判断用户代码分区2的固件执行是否成功,若是,则进行步骤(7);若否,则进行步骤(6)。(6)执行用户代码分区1的固件。(7)正式执行用户代码分区2的固件,并设置用户代码分区2的执行成功标志为真。正式执行用户代码分区2的固件,由用户代码分区2的固件负责设置用户代码分区2的执行成功标志为真。
3 结 论
根据上述方法编写的固件升级程序,能够稳定地接收外部发来的新程序,并成功烧写进片内Flash区,实现程序的更新;该设计可有效处理升级过程意外中断、数据传输错误等异常情况,确保软件正常运行。本文的设计以LPC2136为例实现,对于具有IAP功能的其他公司的ARM7芯片的固件程序更新也有借鉴意义。
参考文献:
[1] 恩智浦半导体公司.LPC2131/2/4/6/8用户手册RV4.0 [Z].荷兰:恩智浦半导体公司,2012.
[2] 周立功,张华.深入浅出ARM7—LPC213x/214x(上) [M].北京:北京航空航天大学出版社,2005.
作者简介:方彬浩(1978.10-),男,汉族,广东人,硕士。研究方向:电子设备嵌入式技术研究。