摘 要: 在分析比较了title="TMS320C6000">TMS320C6000的三种自举模式后,针对原来DSP自举模式的利弊提出了一种可行的系统引导解决方案,并以基于TMS320C6202的图像处理系统的引导实现为例进行了详细介绍。
关键词: 自举模式 数字信号处理 Flash芯片
在数字信号处理(DSP)系统设计中,通常不把程序固化在DSP内,而是将程序先保存在片外存储器内,在系统上电后利用DSP自举引导功能将片外程序调入片内程序空间后运行程序。要设计好系统的自举,首先要了解DSP的自举流程;其次要清楚DSP程序的结构以及存储空间的分配;然后根据实际系统的需要实现自己系统的自举。下面针对TI的TMS320C6000系列DSP,介绍一种可行的系统引导解决方案,并以基于TMS320C6202(以下简称C6202)的图像处理系统的引导为例进行详细说明。
1 系统引导设计
1.1 各类自举模式的比较选择
TI公司的TMS320C6000系列DSP有三类自举模式:主机(HPI)引导模式、不加载模式和ROM加载模式。
在主机引导模式下,外部主机在DSP处于复位状态、硬件其他部分保持正常状态期间通过主机口将程序写入DSP的内部存储空间;然后将主机口控制寄存器中的DSPINT位设置为1,使DSP退出复位状态,开始执行0地址处指令。该模式下DSP无法自己完成初始化,需有一主机控制。所以主机引导模式不适用于一般的基于DSP的系统。
在不加载模式下,C6000直接从0地址处执行程序指令,这时0地址处的存储器可以为SDRAM、SBSRAM、32位异步器件、DSP内部RAM空间的一个。显然,只有0地址为32位Flash(或ROM)时才能实现系统上电后的正常运行。然而,当前的Flash多为8位或者16位,所以至少需2片16位的Flash才能在该模式下实现系统的自引导,而用多片Flash就会增加系统的负担和成本。所以这个模式在C6000中也不是最好的。
C6000整个外部程序空间分为CE0~CE3四个空间。在ROM加载模式下,DSP上电后首先通过DMA/EDMA将CE1空间的64KB(C6201/C6202/C6701)或1KB(C6211/C6711)数据复制到0地址处,然后开始执行地址0处的指令。该模式下CE1空间可以是8位、16位或32位ROM/Flash,EMIF会自动将相邻8/16位数据合成为32位的指令。所以采用这种加载方式的接口设计简单,DSP的EMIF可以与Flash实现无缝连接,而且只需一片Flash即可。
纵观上述三种自举模式可知,ROM加载模式是最方便有效的。然而当系统DSP运算较为复杂、运算量较大,程序空间大于64KB(C6201/C6202/C6701)或1KB(C6211/C6711)时,在上电后系统就无法把所有的程序放入DSP内存储,从而无法正确实现系统的自引导。另一方面,由于C6x0x系列的DSP采用哈佛结构,程序空间和数据空间完全分开,不能通用,而DSP0地址开始的64KB为程序空间,所以在64KB程序复制到0地址后数据常量空间也需要被导入数据空间,否则系统同样无法实现自引导。
1.2 ROM加载模式下的系统引导设计
经过分析,在原来ROM加载模式基础上设计了如下的一种系统引导方式,从而解决了程序较大、数据空间不能初始化等问题。
首先,自行编制一引导程序(称为loadprogram)。该程序可将存放于CE1空间内的系统目标程序和常量数据分别调入DSP程序和数据空间。loadprogram程序的起始地址为0,数据常量地址为CE1空间的某固定地址。之后,将loadprogram程序代码固化在CE1空间的首地址,其数据常量固化在loadprogram定义的CE1空间。
如图1所示,在ROM加载时,DSP自动将CE1空间的loadprogram导入DSP0地址处,而数据常量也已经存在于loadprogram定义的数据空间中。这样在ROM加载结束后DSP自动运行0地址程序,即loadprogram程序,从而进行系统的第二次加载,即将系统目标程序和数据加载到DSP内,然后运行系统目标程序。这样就最终实现了系统的正确引导。
1.3 设计实现中的问题
在实现这个系统自举设计中有二个需要注意的问题。
(1)loadprogram和系统目标程序都是在DSP内部空间运行的,所以要合理分配二个程序在DSP内的程序空间和数据空间。系统目标程序在DSP内的存储空间不能和loadprogram的存储空间重合,否则在loadprogram的运行过程中,loadprogram内容会被改写,从而使整个系统引导的过程出错。
(2)loadprogram和系统目标程序以及它们的一些数据常量都要固化在Flash/ROM内,所以必须得到它们的程序和数据代码,并且合理安排它们在Flash/ROM的排放,最终方便有效地实现系统的引导。
2 实 例
本实例用TMS320C6202来实现视频图像的编码。系统的自引导主要由C6202和256KB的16位Flash(SST39VF400A)实现。
2.1 系统目标程序
系统的编码程序由汇编和C语言编写实现,经过编译得到目标执行文件program.out,它由表1所示各段组成。其中.vector和.text段为程序代码段;.cinit为C编译后产生的变量初值表,在程序开始的时候系统会将.cinit中的初值写入C中定义的各需要赋初值的变量空间中;.const和.data分别为C和汇编中的常量段;其他各段为系统的变量、堆栈等无需初值的数据段。所以loadprogram就是要将.vector、.text、.cinit、.const、.data写入相应的DSP内部空间中。
目标程序要做的就是把执行文件program.out转化为代码,烧写入Flash,以防被loadprogram读取写入DSP内。这里,首先用hex6x.exe将program.out转化为16进制文件,然后利用自编的程序对其进行整理,得到3个队列:
short pg[]={0xA02A,0x01DD,……}; /*程序代码队列,包括程序和数据代码*/
unsigned int addarray[]={0x0,0x0d00,0x80003968,0x80004310,0x8001a358};
/*代码地址队列*/
int sectlen[]={512,56288,176,5666,64}; /*代码长度队列,各起始地址开始的代码长度*/
也就是说,pg[]由地址分别为addarray[0]、addarray[1]、addarray[2]、addarray[3]、addarray[4],长度分别为sectlen[0]、sectlen[1]、sectlen[2]、sectlen[3]、sectlen[4]的五段代码组成。
将pg[]烧入Flash内的空间。
2.2 loadprogram程序
如上所述,loadprogram就是要将上述五个代码段写入相应的addarray[0]、addarray[1]、addarray[2]、addarray[3]、addarray[4]地址中。由于C6202的程序空间只能通过DMA方式访问,所以采用DMA方式进行系统程序的引导。关键代码如下:
整个loadprogram编译后的组成如表2所示。
同目标程序一样,也可以得到pg[]、addarray[]、sectlen[]三个队列。
2.3 Flash与DSP的空间分配
如图2所示,图中标号1表示loadprogram程序内容,标号2表示目标程序内容。由于Flash即CE1空间的64KB代码将会直接加载到DSP内运行,所以loadprogram在Flash和DSP内的地址是一一对应的,而loadprogram的
.cinit空间始终是CE1多余的某部分空间。这样就避免了ROM加载后.cinit空间没有被初始化而导致系统出错的问题。
系统目标程序的代码是由loadprogram读入的。只要在loadprogram中明确目标代码的位置和长度,就可以正确地把Flash内的代码导入。所以把目标程序代码的4个段连续放在Flash内的固定地址。
从DSP内存空间分配图中可以发现,loadprogram和目标程序的中断矢量表.vector是重叠的,但这并不影响自举功能的实现。DSP上电后loadprogram(包括其vector1程序)被拷贝到DSP内,然后DSP运行0地址程序,也就是vector1首句程序——跳转指令,跳转到loadprogram起始地址开始运行。loadprogram运行时会将program的vector2程序覆盖到原0地址开始的vector1。由于loadprogram已不再用到原vector1,所以覆盖并不影响整个boot过程,这进一步方便了程序设计。而二个程序的.text段(见表1、表2及图2)是完全不重复的,这种分配保证了.text1运行完之前不会被.text2覆盖而导致程序出错。
根据Flash的分配方案,把二个程序的代码烧入Flash内,设置好控制DSP的自举模式的五个管脚BOOTMODE[4:0],这里设为10101,即ROM加载模式、16位Flash,就可以正确地实现系统的自引导了。
上述引导过程已经通过实践,并证实可行。
参考文献
1 仁丽香,马淑芬.TMS320C6000系列DSPs的原理与应用.北京:电子工业出版社,2000
2 Texas Instruments Inc.TMS320C6000 Peripherals Reference Guide,1999
3 Texas Instruments Inc.TMS320C6000 Optimizing C Compiler User′s Guide,1999
4 Texas Instruments Inc.TMS320C6000 DMA Example Applications,2002