程序动态加载方案吴海燕,张晓玲电子科技大学电子工程学院,四川成都(610054)E-mail:wuhaiyan1982@163.com摘要:本文提出在PC机远程控制下利用一片FLASH存储器实现多DSP系统对多份用户代码加载并有选择的重新载入用户程序的方法。在分析了DSP自举加载的步骤之后给出了系统硬件电路框图,并结合TI公司的DSP芯片TMS320C6416,介绍了它的装载流程和通过PC机远程控制动态加载DSP的过程。关键词:DSP;动态加载;Bootloader中图分类号:TP3111.引言随着电子系统的任务量日益庞大,对系统的数据处理能力越来越高,其中包括处理大容量的数据、运行高度复杂的算法以及进行实时运算等。这些日益增长的需求,对数据处理器提出了更高的要求,在研究DSP算法的同时,大量研究者也对DSP系统的加载、重载进行深入的研究,从而使DSP系统能快速变化DSP算法来完成复杂多变的信号处理需求。盛九朝等在文献[1]中就提出了信号处理程序的动态加载,通过程序的动态加载可以在不改动系统硬件的情况下方便的升级DSP系统。也有大量的文献对DSP的自举加载技术[2]进行了研究。人们为了优化DSP的加载,想到了利用扩张FLASH的方法[3]来增强DSP动态加载的灵活性。由于各个DSP系列的产品特性也不尽相同,往往在加载方式方面也有所不同,所以对不同系列的DSP芯片进行分别研究也是非常值得关注的[4]。一般的DSP系统只是在每个DSP芯片上单一的运行一种算法程序,由多个DSP分别做不同的算法昀后再融合各个算法处理后的数据来完成大量数据的处理工作。而针对多DSP系统的多份用户程序的加载方案却研究的很少,为此,本文提出了一种PC机远程控制动态加载程序的方法,在采用TMS320C6416进行项目设计实践后,在项目的硬件系统平台基础上详细介绍了硬件及软件设计方案。2.硬件系统介绍TMS320C6000是TI公司TMS320系列产品中的新一代高性能DSP芯片,共分为两大系列。其中定点系列为TMS320C62xx和TMS320C64xx;浮点系列为TMS320C67xx。本文采用32位定点数字信号处理器TMS320C6416为例设计了如图1所示的硬件系统平台,DSP1为主DSP,DSP2和DSP3为从DSP。在此系统中,选用了Xilinx公司的SpartanIII系列XC3S4000芯片作为FPGA,它通过EMIFA总线与各个DSP连接,控制各个DSP的复位。选用CYPRESS公司的CY7C0852V作为外接RAM存储器,其容量为128K×36bit,它一端与主DSP的EMIFA总线连接,另一端的数据线、地址线和控制线与FPGA的用户定义I/O口直接相连。主DSP通过EMIFB总线与DSP程序固化单元FlashS29GL512N(512M)连接,用于读写Flash中的程序;通过EMIFA总线与外部存储单元SDRAMK4S511632D(64M)连接,用于缓存DSP处理器的程序以及那些需要进行处理的数据和处理结果等;通过HPI总线与其余两片从DSP连接,用于加载这两片DSP的用户程序。选用CY7C68013A之间的命令报文交互[5]。`PC机USB总线CY7C68013AEMIFAHPI双口RAMFPGADSP1DSP2DSP3EMIFAEMIFAHPIFlashEMIFAEMIFBSDRAMEMIFA图1系统硬件3.多DSP程序动态加载方案设计本文提出的多DSP程序动态加载方案的主要设计思想是主从DSP分别加载,在确定主从DSP后按照一定的逻辑顺序和PC机控制分别加载各个DSP,下面将对整个方案进行详细介绍。3.1主DSP引导方式的选择在上电或复位引导过程中,首先加载主DSP,则需要将固化在Flash中的程序拷贝到指定区域中运行。在C6000系列中,有3种引导方式:①不加载:CPU直接开始执行地址0处的存储器中的指令;②ROM加载:位于外部CE1空间的ROM中64K的程序首先通过DMA被搬入地址0,然后开始执行地址0处的指令;③主机(HPI)引导:外部主机通过主机口初始化CPU的存储空间,初始化完成后,将主机口控制寄存器中的DSPINT位设置为1,结束引导过程,开始执行地址0处的指令。本文中的主DSP采用第二种引导方式,而采用这种模式的大多数C6000系列的DSP芯片只能从CE1向地址0处搬移1Kbytes的代码,当应用程序代码超过1Kbytes时就需要进行两次代码搬移。在这种情况下,必须由一段引导代码使原本存放在ROM中的代码下载到指定的位置中,以使系统程序能够正确运行。这段引导代码一般称之为Bootloader,由于Bootloader代码一般不超过1KB,因此常利用汇编语言编写。实际上,Bootloader程序的设计是主DSP软件的一个重要部分,整个主DSP软件的设计被分为Bootloader程序、用户管理程序和用户程序三部分,他们被分别固化在Flash中的不同位置。其中Bootloader程序用来加载用户管理程序,用户管理程序的作用是根据PC机指令有选择性的加载用户代码,用户程序用来加载从DSP的程序和进行DSP算法。通常情况下,Bootloader程序存放在ROM的起始地址处,使得DSP在上电或硬复位时通过EDMA自动地从EMIF接口的CE1空间把它搬移到内部RAM的地址0处。搬移完成后,CPU便自动跳转到地址0开始执行Bootloader程序。Bootloader程序将用户管理程序从外部存储器搬移到内部RAM中,并且在代码搬移完后跳转到程序入口地址c_int00处开始执行用户管理程序。类似的,用户管理程序将用户程序从外部存储器搬移到内部RAM中,并且在代码搬移完后跳转到程序入口地址c_int00处开始执行用户程序。用户程序再分别搬移DSP2和DSP3的程序到它们的内部RAM中并让它们从地址0处运行,然后运行自己内部RAM中的DSP算法。基于图1的硬件平台,加载DSP程序的流程分为第一次上电程序加载流程和DSP系统重载流程,下面将分别详细介绍这两个加载流程。3.2DSP第一次上电程序加载流程第一次上电后DSP加载首先从主DSP开始,随后依次由主DSP引导从DSP完成所有DSP的第一次加载。加载流程如图2所示。系统复位DSP1自动搬移1KBootload程序到DSP1内部RAM0-0x400地址并运行从Flash搬移用户管理程序到DSP1内部RAM中并运行Bootload程序从双口RAM中读出重载参数:Flash扇区数、偏移地址和代码长度重载标志有效?从偏移地址起取代码长度的程序搬移到DSP1内部RAM跳转到程序入口地址c_int00处运行通过FPGA译码选择Flash扇区数YN用户管理程序初始化EMIFA、EMIFB总线将存储在Flash中的DSP2程序下载到SDRAM中缓存通过HPI总线将DSP2程序搬移到DSP2内部RAM中向DSP2的HPIC寄存器的DSPINT位写1将DSP2从复位状态唤醒跳转到程序入口地址c_int00处运行重载标志有效?YNDSP1算法开始于之类似,DSP1通过相同方式完成对DSP3程序加载DSP1程序图2第一次上电程序加载流程图①上电后主DSP自动加载1K的Bootload程序到其内部的RAM中,放在从0地址开始的位置,接着从0地址开始执行Bootload程序。Bootload程序从Flash的前1K字节以后的一定长度的用户管理程序搬运到用户管理程序工程中的CMD文件指定的位置并运行用户管理程序;②用户管理程序通过标志位判断为第一次上电加载流程,将从Flash对应的位置读取默认的用户程序到DSP1内存空间并运行用户程序;③用户程序通过标志位判断为第一次上电加载流程,从Flash中读出DSP2的用户程序到外部存储器SDRAM中缓存,然后通过HPI总线加载到DSP2的内存空间中并向DSP2的从复位状态唤醒,昀后跳转到DSP2的用户程序入口处运行DSP2的用户程序,接着用同样的方法加载DSP3的用户程序并运行。如果系统中还有更多的从DSP也可用相同的方法加载并且主DSP分别加载从DSP程序的顺序可以调换。3.3DSP系统重载流程程序第一次启动完成后,当需要对某个DSP中的算法进行替换时,就需要进行这个DSP重载,重载采用PC机远程控制DSP重新载入的方式。基于这种重载方式系统中需要对每个DSP定义唯一的编号来区别是重载哪个DSP的用户程序,这里定义主DSP编号为1,从DSP依次为2和3。特别要注意的是各个DSP程序应该固化在FLASH中的不同位置。PC机封装重载命令数据报文通过USB接口芯片发送FPGA接收数据报文并存入双口RAM中并通过中断通知主DSP1编号ID为1?将Flash扇区数、偏移地址和代码长度保存到双口RAM中Y将存于双口RAM中的重载标志位设为有效并通知FPGA对DSP1复位FPGA复位DSP1通过HPI总线将SDRAM中缓存的程序代码搬移到DSPn内部RAM中向DSPn的HPIC寄存器的DSPINT位写1将DSPn从复位状态唤醒跳转到程序入口地址c_int00处运行NDSP接收数据报文并解析出编号ID、Flash扇区数、偏移地址和代码长度从偏移地址起取代码长度的程序搬移到SDRAM中缓存通过FPGA译码选择Flash扇区数根据编号ID通知FPGA复位DSPnDSPn程序加载完成DSP1程序跳入DSP第一次上电程序加载流程图2图3重载流程图硬件系统通信,用户通过数据报文控制某个DSP重新载入。数据报文中应包括待加载的DSP编号、在FLASH中的扇区数、在此扇区中的偏移地址和需要重载的用户代码长度四个信息。PC机将封装好的重载命令数据报文发送到FPGA,FPGA接收数据报文并将其存储到双口RAM中然后通知主DSP取数据报文。详细的加载流程如图3所示。①主DSP从双口RAM中取出数据报文并解析出重载的DSP编号为n、程序在Flash中的扇区数、偏移地址和代码长度四个信息。②如果DSP编号n为1则表示对主DSP的用户程序重载,主DSP就将程序在Flash中的扇区数、偏移地址和代码长度三个信息保存到双口RAM中,然后将重载标志位设为有效并通过触发FPGA的复位标志位通知FPGA对主DSP复位。如果DSP编号n不为1则表示对从DSP的用户程序重载,n为2表示对DSP2的用户程序重载,n为3表示对DSP3的用户程序重载。从DSP的用户程序重载方式跟第一次上电程序加载类似,由主DSP根据第一步解析出的信息将从DSPn的用户代码搬移到SDRAM中缓存,然后主DSP通过触发FPGA的复位标志位通知FPGA对从DSPn复位。③FPGA查询到主DSP复位标志位有效,对主DSP复位。复位结束后,主DSP跟第一次上电程序加载一样又自动加载1K的Bootload程序到其内部的起始地址为0的RAM中并开始执行Bootload程序。Bootload程序从Flash的前1K字节以后的一定长度的用户管理程序搬运到用户管理程序工程中的CMD文件指定的位置并运行用户管理程序。用户管理程序通过标志位判断为重载流程,从双口RAM相应的地址中读出重载相关信息,根据这些信息从Flash对应的位置读取主DSP的用户程序到主DSP内存空间并运行。主DSP用户程序也通过标志位判断为重载流程,直接就进行算法程序。如果FPGA查询到从DSPn复位标志位有效,对从DSPn复位。复位结束后,主DSP通过HPI总线将SDRAM中缓存的从DSPn的用户程序搬移到从DSPn内存空间中并运行。4.结束语通过本文提供的加载方案,在所有程