由图 1 可以看出,为了实现软件注入,除了具备运行在通用计算机平台上的相关开发工具(例如 VC++ 、 VB 、 Delphi 等)外,还必须制订软件注入规程和研制软件注入设备。注入规程包括嵌入式系统和注入设备的物理接口的机械特性和电气特性、具有口令字校验功能和差错控制机制的通信协议等;注入设备分为注入卡和注入枪,前者采用通用计算机的标准接口如 RS232 、 USB 等与通用计算机互连,用于将软件程序输入到注入枪,也可直接对嵌入式设备注入,后者为移动式注入设备,便于为不在本地的嵌入式系统完成软件的升级服务。
在制订了软件注入规程并拥有了相应注入设备后,还需要解决新注入程序与 MCU 中的固化程序的连接问题,以实现新注入代码的功能。图 2 给出了基于 C8051F023 的一种解决方案。
该方案是一个基于 MCU 所实现的功能模块化方案,在固化在 Flash 中的主程序模块和引导装入模块的支持下,模块 1 、模块 2 、模块 3 等均可实现程序代码的更新。方案中的主程序模块完成 MCU 的初始化工作以及可注入模块所需的一些默认设置,而不可用扇区和保留扇区是 C8051F023 的特性。前者提供了芯片的安全选项,但不支持应用程序在系统可编程;后者为工厂专用,不能存储用户程序。
在 0x1000~0xFBFF 的地址空间内,每个模块为具有某一功能的相对独立的软件代码,其所占的地址空间可依据程序代码的大小通过伪指令来定义和修改。当存储器容量较大时,剩余的地址空间可作为保留,用于存储新增加的功能模块代码。
通常 MCU 的中断向量位于主程序模块的地址空间内且是固定不变的( C8051F023 的中断向量地址为 0x0000 ~ 0x00AB )为了能够使用硬件中断资源(比如 UART ,定时器等)以及确保所有功能模块都能获得调用,需要统一定义中断服务程序( ISR )和所有功能模块(包括保留地址空间)的入口地址和地址空间范围,这是实现新注入软件与固化软件之间连接的唯一途经。在开发新的可注入软件模块时必须遵守这一规定,如果入口地址不一致,新的软件模块将得不到调用;如果软件模块太大以至超出了规定的地址空间范围,新的软件模块将会占用相邻模块的地址空间,从而影响后者的调用和功能实现。此外,在编写软件注入模块时还要注意以下两点。
① 在写入新的软件代码之前,需要将程序存储器中原来的数据擦除。由于 C8051F023 的 Flash 存储器是以大小为 512B (用十六进制表示为 200H )的扇区为单位组织的,一次擦除操作将删除整个扇区,因此每个功能模块的地址空间必须是 200H 的整数倍。
② C8051F023 特有的优先权交叉开关译码器在数字外设引脚和通用 I/O 端口之间建立了可控的连接,该机制提高了 I/O 灵活性,但也使得如下情况成为可能:新开发的可注入模块需要使用并配置高优先权的外设,在把该模块注入到 MCU 后,这些配置会改变主程序模块中已经定义的数字外设与通用 I/O 端口间的关系,使得 I/O 引脚不再具有原先的含义,从而破坏了 MCU 与嵌入式设备间的接口标准。因此,必须在主程序模块中统一配置优先权交叉开关译码器,从而为所有模块建立一个通用的、引脚含义明确的硬件平台。
3 软件代码文件的生成
从图 1 可以看出,软件程序最终是以十六进制代码的形式驻留在软件注入枪或注入卡中的,因此软件程序的十六进制代码文件必不可少。然而,在 C8051F023 集成开发环境下,源程序文件经过编译后生成的二进制文件是不可读的,只能通过 JTAG 口下载到 MCU 中。对此,需要把开发环境中附带的 DOS 程序 oh51.exe 复制到与编译后的二进制文件相同的文件夹下,然后在 DOS 操作环境下利用该工具将生成的二进制文件转换成 hex 文件。然而,此时的 hex 文件仍是不可用的(如图 3 所示,这里假设文件名为 example ),因为它包含了行标识符号、代码地址、校验字符等非代码内容,并且由于 ORG 伪指令的使用使得软件代码的地址是不连续的,而通常采用的手段是将软件代码下载到连续的存储器空间,以简化通信协议的制订和引导装入程序的编写。针对这种情况作者编写了 DOS 程序 v2.exe ,利用该程序可将输入的 hex 文件统一转换成仅包含纯粹软件代码的 codes.txt 文件(如图 4 所示),同时生成的 readme.txt 文件给出了在注入软件时所需的一些参数(该参数与软件注入规程有关)。 V2 程序的功能具有通用性,可作为 C8051F023 集成开发环境的一部分,该程序使用 Turbo C 2.0 集成开发环境开发,其源代码见本刊网站 www.dpj.com.cn 。
结 语
软件注入技术是实现嵌入式系统软件升级的一种有效手段,在实施过程中需要采取诸如制订软件注入规程、研制软件注入设备并开发相应各类软件等一系列技术措施,且具有多种可行方案。本文给出了其中的一种实施方案(如图 1 所示),在论述了采用软件注入技术的优势和可行性后,针对采用 C8051F023 的嵌入式系统,讨论了基于 C8051F023 的软件注入实现方案和相关的一些问题,并编写了 V2 程序以完善 C8051F023 集成开发环境在实现软件注入方面的功能。
参考文献
1 张迎新,等 . 单片机初级教程 . 北京:北京航空航天大学出版社 , 2000
2 潘琢金 , 施国君 . C8051Fxxx 高速 SOC 单片机原理及应用 . 北京:北京航空航天大学出版社 , 2002