摘要 通过对COFF文件和TMS320C6713引导过程的分析,本文提出了一个在基于TMS320C6713 DSP系统上实现自动软件更新的方案,本方案只需要在软件更新时将CCS编译和链接生成的COFF文件下载到DSP系统,便可自动完成更新;最后还简单介绍了方案在TMS320VC5409系统上的实现。
关键词 软件自动更新 COFF文件解析 两级引导程序 TMS320C6713
引 言
目前市面上存在大量基于DSP的嵌入式系统,随着系统的完善和功能的增强,几乎所有的DSP系统都面临着软件更新的问题,这时,更新方法的简易和高效就显得特别重要。在基于DSP(数字信号处理器)的嵌入式系统中,软件更新通常需要借助仿真器将最新的程序下载到目标板上,然后将程序写入非易失型存储器中。同时,由于新程序编译、链接后生成的各段的大小和运行空间会发生变化,系统引导程序也需要作相血的改动。例如:上一个版本的程序对应的.text段的运行空间位于Ox80000000~0x80000100,而新程序对应的.text段的运行空间则位于Ox80001000~Ox80001110,.text段的运行空间和长度都发生了变化。另外,引导程序的任务之一是将.text段的数据从Flash中复制到其运行空间,因此就必须重新修改引导程序,将.text段复制的起始地址由Ox80000000改为0x80001000,并将复制长度改为OxllO,每一次软件更新都会重复上面的步骤。在远程系统控制应用中,这种更新方法就显得非常不便;在需要同时对大量的DSP系统进行软件更新或经常需要软件更新的情况下,这种方法的效率也非常低下。
笔者通过对TMS320C6713 DSP系统引导过程的分析和COFF(公共目标文件格式)文件格式的分析,提出了一个软件自动更新的方案,并在基于TI公司的TMS320C6713芯片与SST公司的SST39VFl601并行Flash芯片组成的硬件平台上实现;最后还简单介绍了本方案在TMS320VC5409系统上的实现。实现本方案的一个前提是DSP硬件系统上具有某种接口,可以从计算机中下载COFF文件到本地系统上,笔者使用的平台是通过UART接口连接计算机,使用Windows自带的超级终端上具,通过Xmodem协议将COFF文件下载到目标系统上,当下载完成后更新就会自动完成。DSP重新上电或复位后运行的就是最新的程序。本方案主要包括两个过程:一是通过解析COFF文件得到所需的数据并烧入Flash;二是系统上电后自动根据Flash中最新的数据引导、运行。下面详细描述两个过程的实现方法。
1 COFF文件解析
C或汇编程序在编译后会生成很多段(如.text、.bss、.switch、.cinit、.data等),这些段又可以分为需要初始化的段和不需要初始化的段。这里,需要初始化和不需要初始化是针对系统引导来说的。例如:.text为程序代码数据,系统上电后需要引导程序从Flash中复制到其运行空间中,称为“需要初始化的段”;.bss为初始化为0的数据空间,这个初始化为O的动作在C语言环境建立时进行,属于系统程序的一部分,与引导程序无关,称为“不需要初始化的段”。这样,只需要保存初始化的段到Flash中,而并不需要通过段的名称来识别哪些段是需要初始化的段,哪些是不需要初始化的段,两种类型可以通过COFF文件中的段信息表部分来区分。
1.1 COFF文件简介
COFF文件是DSP汇编器和链接器创建的目标文件,通常为项目目录下的Debug目录里后缀为.out的文件。在COFF文件中包含文件头、可选择的头信息、段信息表、每个初始化段的数据和重定位信息、符号表、字符串表。从中可以看出,COFF文件中包含了很多冗余的信息成分。为了节省空间、提高效率,在这里不直接将COFF文件烧进Flash,而只保存所需的信息,即每个初始化段的数据和程序的入口地址。下面详细描述如何从COFF文件中得到这些信息。
1.2 COFF文件格式
在COFF文件中,文件头部分提供了该文件中包含的段的个数,解析程序会根据段的个数扫描每个段的信息并保存初始化段的数据;可选择的头信息包含了程序的入口地址,在系统引导结束后会直接跳转到这个地址,系统就开始正常工作。段信息表的格式说明如表l所列。其中,段物理地址是该段的执行地址,也就是程序运行时该段所在的空间;原始数据文件指针指向段数据在COFF文件中的位置,如果该段为初始化段,那么从这里就可以得到需要写入Flash的数据的位置。计算如下:
段数据地址=COFF文件起始地址+原始数据文件指针
标志信息用于判断该段是否为需要初始化的段,如表2所列。需要初始化的段标志为Ox40和0x20,这样就获得所有需要引导程序复制的段数据。此时不能将这些数据直接烧入Flash,若直接烧入Flash,则引导程序将无从知道段数据的起始位置、运行空间地址和长度。本方案设计了一个简单的数据结构放在段数据前,称为“段头”。数据结构如下:
1.3 Flash存储空间安排
获得所需的数据后,下一步就是将这些数据烧入Flash。Flash空间的数据格式如下:
除了保存段头和段数据,还需要记录程序入口地址和后面所有段的个数。程序入口地址是目标程序第一步开始执行的地址,当引导程序复制完所有的数据后就直接跳到这个地址开始运行。段的个数用于引导程序判断是否所有段的数据已复制完。
在烧写Flash前还需要对Flash空间进行划分。以本系统为例,Flash空间为Ox90000000~Ox90400000,共4MB。划分如下:
◆第一部分存储的是第一级引导程序。对TMS320C6713系统来说,这部分代码编译后产生所有初始化段大小必须小于1KB(其详细分析见后),所以这部分空间大小固定为1KB,即0x90000000~0x900003ff。
◆第二部分存储的是第二级引导程序,这部分按照上述数据格式烧写。其长度没有特别限制,只需根据保存第二级引导程序所需的最大空间安排。由于Flash每个扇区的大小为8KB,为了便于对上一部分的擦除操作,将第二部分的起始地址延长到Flash第二个扇区的起始地址,其空间为Ox90002000~0x90003fff,共8KB。
◆第三部分为系统程序,其长度根据保存系统程序所需最大空间安排。数据格式与第二部分相同,对应地址为0x90004000~Ox90103fff,共1MB。剩余的Flash空间作其他用途。
整个Flash空间划分如图1所示。注意:以上3个部分一旦规划好,每个部分的位置就不能改动。对于第二部分,只要第二级引导写好,这部分需要的空间也就确定了;而第三部分在每次软件更新时都要同时更新,因此需要预留足够大的空间。
整个COFF文件解析流程如图2所示。
2 系统引导程序设计
TMS320C6713支持3种引导方式:主机引导、仿真引导和EMIF引导。本方案采用EMIF引导,在此模式下,位于外部存储空间CEl的Flash中的1 KB代码通过EDMA拷贝到片内RAM地址0处。由于大多数引导程序代码大于1 KB,因此本方案采用两级引导方式。编写引导程序的目的就是,将所有初始化段的数据从Flash中拷贝到其对应的运行时的存储空间。
2.1 第一级引导程序设计
对于基于TMS820C6713的系统,第一级的引导程序大小被严格限制在l KB内,因此只能用汇编语言编写程序。在系统上电后第一级的引导程序由EDMA从Flash拷贝lKB到片内RAM并开始执行,因此第一级引导程序编译后所有韧始化段的长度不能大于1 KB。对于笔者提供的程序,这段程序编译后产生的初始化段只有.text段。其任务是根据数据格式找到段数据并拷贝到对应的物理地址中,然后跳到第二级引导程序入口处。第一级引导程序流程如图3所示。
2.2 第二级引导程序设计
第二级引导程序大小没有限制,因此本方案使用C语言来实现。在本硬件系统中,系统程序在SDRAM中运行,因此在第二级引导程序拷贝段数据之前还需要初始化EMIF。如果在硬件上还用到了其他外设,也可以在这里完成初始化。初始化完成后就开始拷贝数据的过程,这与第一级引导程序的拷贝过程是完全相同的。第二级引导程序流程如图3所示。
这里用简单的例子来解释系统引导程序如何工作的。在Flash空间中,所有的段头和段数据都是紧凑安排的。也就是说,上段头后面紧接着段数据,本段数据结束后就是下一段的段头。这种安排是必须的,否则,引导程序在复制完上一个段的数据后就无法我到下一个段头的地址。以第一级引导程序复制Flash中第二级引导程序为例说明。第二级引导程序的各段数据在Flash中的起始地址为0x90002000,首先从头两个字中读出程序入口地址、所有数据大小和段个数;然后读取段头,段大小用于确定本段数据长度;跳过本段数据区为下一段头开始位置,段物理地址则说明了段数据复制的目的地址。若复制的段个数等于开始读出的段个数,则表明所有数据复制均已完成,然后跳转到程序入口地址。从这个过程中可以看出,引导程序的复制过程完全是根据段头的信息来的。当软件更新时,段头信息也会相应更新,与引导程序无关。因此,引导程序可以自适应新程序段的变化,而不需要重新修改引导程序。
3 在TMS320VC5409系统上的实现
大多数DSP系统的引导过程都大同小异,笔者也将本方案应用在基于TMS320VC5409的硬件平台上。对于COFF文件的解析,两种平台没有区别,解析得到的段数据也同样是加上段头后烧进Flash。TMS320VC5409与TMS320C6713唯一的区别在于其引导过程。TMS320VC5409的引导方式较多,对本方案的实现也多种多样,这里只简单介绍笔者所使用的方法。
将MP/MC引脚拉高,使TMS320VC5409为微处理器模式。这样程序空间0xff80~0xffff映射到外部,同时硬件上将Flash空间连接到DSP的0x8000~0xfff程序空间上。DSP上电复位后,PC从程序空间的0xff80开始执行,需要做的是在0xff80对应的Flash空间中写入一个跳转语句,将DSP跳转到引导程序开始的位置。可以看出,由于引导程序没有长度限制,因此采用一级程序引导。注意:此时的引导程序并没有复制到片内RAM中,而是直接在Flash上执行,所以在编译引导程序时要注意链接文件的书写。当引导程序开始执行后,直接在预先设定好的Flash空间中根据1.2小节中的结构体寻找段数据并复制,复制完成后跳转到系统程序入口处。
编者注:实现代码见本刊网站www.mesnet.cm.cn。
4 结论
本文介绍了一种基于TMS320C6713系统的软件自动更新方案。该方案具有实现简单、效率高的优点,且一旦实现后,每次软件更新时无须改动引导程序。目前该方案已应用在国家自然科学基金项目自动指纹识别系统中,收到了非常好的效果。实践表明,本方案具有很好的可移植性,可以在TI公司的多种DSP平台上得到应用.