张小平,谷 勇,丰新龙
(1.海军驻太原地区航空军事代表室;2.太原航空仪表有限公司,太原 030006)
引导加载程序是上电运行的第一段代码,一般完成硬件初始化和系统加载的功能。了解引导加载程序有助于更深入的理解计算机系统,实现更底层的应用,下面以Motorola 公司的DSP 处理器为例介绍引导加载程序的部分应用。
通常计算机系统从软件角度划分层次如下:①引导加载程序。包括固化在固件(firmware)中的boot代码(可选)和BootLoader 两大部分。② 操作系统内核。特定于嵌入式板子的定制内核以及内核的启动参数。③ 文件系统。包括根文件系统和建立于flash、Ram 等存储设备上的文件系统。④ 用户应用程序。满足用户需求的各种程序和功能代码。
引导加载程序是系统加电后运行的第一段软件代码。PC机中的引导加载程序由BIOS(其本质就是一段固件程序)和位于硬盘 MBR 中的OS BootLoader(比如,LILO 和GRUB 等)一起组成。BIOS 在完成硬件检测和资源分配后,将硬盘MBR中的BootLoader 读到系统的RAM中,然后将控制权交给OS BootLoader。BootLoader的主要运行任务就是将内核映象从硬盘上读到RAM中,然后跳转到内核的入口点去运行,也即开始启动操作系统。
对于无操作系统平台的嵌入式系统,Bootloader完成初始化硬件、建立内存映射等工作后,直接跳转到用户程序执行。
通过Bootloader 设计能实现很多功能,如初始化硬件、系统启动自检测、加载操作系统和用户程序,实现系统更新等。嵌入式系统产品一般有3种工作状态:正常工作状态、程序加载状态、维护调试状态。根据软件或硬件输入,Bootloader 判断系统的状态,选择跳转到用户程序或执行加载程序代码或执行维护检测程序。
程序加载的方式有多种,一般通过串行接口、JTag 接口、以太网接口等,可加载的程序文件格式包括ELF32、S-record 等。[1-5]
下面以Motorola 公司的DSP56F800系列处理器为例,说明Bootloaer 在串口加载中的应用。
飞思卡尔公司的DSP56F800系列处理器有较广泛的应用基础,采用传统的JTAG 接口仿真和加载方式,更新软件时需要拆装产品,对产品外场维护、检测造成不便。采用串口加载方式,接口简单、方便,通过产品上预留的RS-232 接口,即可更新程序,又能打印维护信息。
DSP56F800系列处理器的片上设备有SCI 及GPIO端口,通过SCI 和RS-232 通讯驱动芯片(ADM3311,MAX232 等)实现和上位机的通讯,GPIO 用来判断进入正常工作还是程序加载模式,复位信号和硬件喂狗信号连接到外部调试、加载端口便于控制,其硬件基本原理框图如图1所示:
图1 串口加载硬件设计原理
ISboot 通过电阻上拉至3.3 V,输入悬空时进入正常工作状态,接地时进入程序加载状态。进入程序加载状态后PC机通过RTS 设置产生喂狗信号防止DSP 复位。[6-7]
1)Bootloader 基本原理。在Bootloader的工程中resetvector.asm(见附录A a)文件中定义复位中断向量的入口地址为bootArchStart(见附录A b)。系统上电首先进行必要的寄存器初始化,执行调用main 完成串口加载功能,然后,跳转至archStart执行应用程序。复位中断向量的地址为0x8000~0x8004,archStart 入口地址为0x0080,引导加载的代码存储在 bootflash 空间,地址为x8004~0x8800(见附录A c,link.cmd)。
2)Bootloader 程序设计。Bootloader 程序设计主要包括如下几个部分:
① Bootloader 主程序。主要完成硬件初始化、工作模式选择功能。ISboot 悬空,跳转至应用程序入口,进入正常工作状态;ISboot 接地,进入程序加载状态,等待串口发送数据,程序加载完毕跳转至应用程序入口。②串口通讯程序。接收PC机发送的S-record 格式文件,并反馈状态信息。③S-record 文件解码程序。对S-record 文件进行解码分析,提取地址、代码、数据等。④ flash 读写程序。将接收的代码和数据写入Program Flash 或Data Flash 并校验。
其中main(void)为主体函数,其流程如图2所示,源码见附录A,main 执行结束后延时跳转至用户程序。
串口通讯使用软件流控制,X-ON为Ctrl+Q,键值17,X-OFF为Ctrl+S,键值19;DSP 接收并处理上位机发送的S-record 文件,忙时向上位机发送X-OFF,闲时发送X-ON;上位机收到X-OFF 字符停止发送数据,收到X-ON 启动发送数据。
图2 Bootloader串口加载流程
DSP 接收每个S-record 记录进行校验/解析,将数据写入对应的地址,如果接收过程出现校验或指令错误,发送警告信息。[5,8]
Motorola S-records 16 进制文件和ELF 文件是编译生成可执行代码的常见格式,CodeWarrior 编译出来的可执行代码就包括这两种类型的文件(CodeWarrior的工程DEBUG 文件夹下面一般都有这两种文件,flash.elf,flash.elf.s)。串口加载程序使用S-records 文件。
S-records 文件每个记录由ASCII 字符组成,通常不超过514个字节,其格式为:类型+字数+地址+数据+校验和,见表1。
表1 S-record 文件记录格式
每个记录之间通过换行符隔离,和目标板通讯时以记录为单位操作。
各种记录的描述如下:
S0 记录内容为文件头信息,其地址域为0x0000,数据域分为3 部分:模块名称(20char),版本号(2char),修订号(2char),描述部分(0~36 char)。
S1、S2、S3 记录均为可加载记录,数据域为可加载数据,地址域分别为4 字节、6 字节、8 字节地址。
S5 记录,地址域表示此前的可加载记录总数,数据域为空。
S7、S8、S9 记录,数据域为空,地址域表示可执行程序入口地址,地址域分别为4 字节、3 字节、2 字节地址。
PC机的9 针COM端口可实现串行数据输入输出,及离散信号的输入输出。COM端口应用见表2。
表2 9 针COM端口说明
COM 口的DTR、RTS、CTS、DSR 引脚通常为硬件流量控制模式时作为握手信号使用,在Bootloader 中数据流量控制使用X-ON/OFF 软件流量控制,因此这4个引脚可作为离散量输入/输出使用。
一般基于DSP56F800 平台的产品都有硬件看门狗的功能,当系统软件不能周期性的喂狗时,系统会复位,为减小Bootloader的开销,使用RTS 引脚作为WDI(Watch dog Input),通过不停翻转RTS电平避免在加载程序过程中DSP 硬件看门狗复位。
DTR 引脚连接到DSP系统复位信号,加载完毕后可以自动复位DSP,验证程序加载是否成功。
CTS、DSR 也可作为DSP模式输入引脚,在串口调试功能设计中用来判断DSP 当前所处的工作模式。[6-7]
上位机软件包括如下功能:串行端口设置及初始化;DSP 信息接收并显示;S-record 文件读取及传送;DSP 复位信号,喂狗信号控制。软件流程图见图3。
图3 上位机软件流程图
通过Bootloader 也可以实现串口调试功能,其程序结构和硬件设计原理与上述串口加载设计类似,Bootloader 设计中加入调试指令集和命令解释执行代码,例如接收到“S”指令返回版本信息,接收到“B”指令进行BIT 并返回自检信息等。
Bootloader 设计在嵌入式系统中非常重要,可根据系统的需要设计不同功能的Bootloader 能提高产品的可靠性、维修性。
[1]章坚武,李杰,姚英彪.嵌入式系统设计与开发[M].西安:西安电子科技大学出版社,2009:122-213.
[2]符意德.嵌入式系统设计原理及应用[M].北京:清华大学出版社,2004:81-237.
[3]张思民.嵌入式系统设计及应用[M].北京:清华大学出版社,2008:156-197.
[4]赖晓晨,原旭,孙宁.嵌入式系统程序设计[M].北京:清华大学出版社,2009:216-317.
[5]马学文,朱名日,程晓辉.嵌入式系统中Bootloader的设计与实现[J].计算机工程,2005,31(7):96-97;196.
[6]冬雷.DSP 原理及开发技术[M].北京:清华大学出版社,2007:67-179.
[7]范寿康.Freescale 16 位DSP 原理与开发技术[M].北京:机械工业出版社,2006:157-317.
[8]郎岩梅,唐文彦,赵军.基于 DSP 嵌入式系统中Bootloader的设计方法[J].电测与仪表,2003,40(4):35-37.
附录A a resetvector.asm 源码
附录A b bootArchStart.c 源码
附录A c bottloader 编译链接文件link.cmd