HPI自举在TMS320VC5402芯片上的实现_DSP论文
关键词:自举 dsp bootloader
当前,数字信号处理器(dsp)芯片以其强大的运算能力在通信、电子、图像处理等各个领域得到了广泛的应用。使用dsp的系统可以按处理器使用的数目分为单处理器系统和多处理器系统。单dsp的系统尽管结构简单,但系统的功能将不可避免地有有所限制。由于dsp的控制功能不是非常强大,在应用中往往不得不把dsp作为目标系统专门负责复杂的运算,而另外使用一个主机(pc机或是单片机)对整个系统的运行实行控制。所以,在使用dsp的多处理器系统中,主机(单片机、pc机、另一个dsp芯片)与目标系统dsp的数据交换就成应用系统设计中必须考虑的重要问题。
1 主机接口的传统解决方案
解决主机与目标系统的数据交换是一个非常复杂的问题,传统的方式是采用dma(direct memory access)或全局存储器(global memory)完成多机系统中的数据共享。在dma方式下,读写共享人存必须要求其它处理器处于停止工作的状态,所以dma共享存储器的方式往往不为人所用。全局存储器是多个处理器共享的存储器。在使用全局存储器的应用系统中,dsp的地址空间被分成局部块(local section)和全局块(global section)。局部块用于完成处理器自己的工作,而全局块则用来完成与其它处理器的通信工作。在tms320c5x器件中,使用全局存储器分配寄存器greg完成对全局内存的管理工作。greg指定部分dsp内存为全局内存。比如,tms320c5x器件能够分配全局数据内存空间,并通过br(bus request)和hcs控制信号实现与该内存的通信。当需要寻址全局内存空间时,br和hcs信号变低电平。于是外部逻辑进行全局内存控制权的裁决,裁决的结果将通过选通信号通知某个tms320c5x,从而使该dsp现在就拥有对全局内存的控制权。显然,使用全局内存的方式来完成多dsp的共享数据通信是非常方便的。但是,应用系统往往由单片机作为主机,dsp作为目标系统构成。由于当前使用最多的单片机往往是8位机,使用16位机的共享内存完成主机与dsp的数据交换不是处理太复杂就是资源利用不充分。为了解决dsp与低档8位主机的数据交换问题,ti公司在tms320c54x系列中使用了hpi接口。hpi将以往一些需片外实现的功能集成在片内,简化了与主机的连接,同时主机可以达到很高访问速度。该hpi端口在ti tms320c6x系列的器件中也得到了保持,且功能有所增强。
2 tms320vc5402的hpi
tms320vc5402是ti公司的54x系列定点dsp,具有低功耗,高性能的特点。
cpu 增强的多总线结构,三条独立的16bit数据存储器总线和一条程序存储器总线;40bit运算逻辑单元(alu),包括一个40bit的桶形移位器和两个独立的40bit累加器,17bit×17bit并行乘法器;连接一个40bit的专用加法器,可用来进行非流水单周期乘/加(mac)运算;比较、选择和存储单元(cssu)用于viterbi运算器的加/比较选择;指数编码器在一个周期里计算一个40bit累加器的指数值;两个地址发生器中有八个辅助寄存器和两个辅助寄存器运算单元(araus);数据总线具有总线保持特性。
存储器 扩展地址模式可最大寻址到1m×16bit外部程序空间,4k×16bit片上rom,16k×16bit双访问片上ram。
指令集 支持单指令循环和块循环,存储块移动指令提供了高效的程序和数据存储器管理,支持32bit长字操作数指令,支持两个或三个操作数读指令,支持并行存储和并行加载的算术命令、条件存储指令和中断快速返回,支持定点dsp c语言编译器。
片上硬件资源 软件可编程等待状态发生器和可编程存储单元转换,连接内部振荡器或外部时钟源的锁相环(pll)时钟发生器,两个多通道缓冲串口(mcbps),增强型8bit并行主机接口(hpi8),两个16bit定时器,6通道直接存储器访问(dma)控制器。
电源 低功耗,工作电源有3.3v和1.8v(内核),用节电模式的idle1、idle2及idle3指令做功率控制,可禁止clkout信号。
速度 在3.3v供电(1.8v核心电压)下单周期定点指令的执行周期为10ns(100mips)。
仿真 符合ieee1149.1边界扫描逻辑标准的片内扫描仿真逻辑接口。
tms320c54x系列dsp芯片中的hpi,能够顺序传送或随机传送数据,产生host中断和c54x中断,接口灵活,并可通过dma总线访问片内ram。当tms320c54x与主机(或主设备)交换时,hpi是主机的一个外围设备。hpi有8根数据线hd(0~7),在tms320c54x与host传送数据时,hpi能自动将外部接口传来的连续数据组合成16位数后传送给dsp。如果host和dsp竞争同一个地址,则host优先,dsp等待一个hpi周期。
tms320c54x系列发展到tms320vc5402的时候,其hpi已经得到了增强,被称为hpi-8。和tms320c54x系列前几款芯片中的标准hpi相比,hpi-8在几个方面有所不同,见表1。
表1 hpi-8和标准hpi的主要差别
增强型hpi(hpi-8) | 标准hpi |
可访问所有片内ram空间 host访问总是与tms320c54z时钟同步 host和tms320c54x都可访问片内ram | 可访问所有片内2k的ram空间 host-only模式下host访问与tms320c54x时钟同步 host-only模式,host具有独占的访问权 |
hpi-8的使用是通过对hpia、hpic和hpid三个寄存器赋值实现的。hpia是地址寄存器,hpic是控制寄存器,而hpid是数据寄存器。简单地说,host通过外部引脚hcntl0和hcntl1选中不同的寄存器,则当前发送8位数据就到该寄存器。在使用上,由于hpic是16位寄存器,而hpi-8是8位的数据宽度,所以host向hpic写数据时,需要发送两个一样的8位数据。而地址寄存器hpia选择后,直接向它写数据就可以了,但是要注意msb和lsb的顺序。另外,hpia具有自动增长的功能,在每写入一个数据前和每写入一个数据后,hpia会自动加1。这样,如果使能了该功能,只需设定一次hpia即可实现连续数据块的写入和读出。数据寄存器hpld,严格就应该叫做数据缓冲寄存器,因为最终数据是要写到片内ram的。只是在实现上,数据首先从host发到hpid中,然后根据hpia指定的地址,hpid中的数据再写到片内ram的地址中。不过对用户而言,该过程是透明的。
3 使用hpi对dsp进行自举
hpi是作为多机数据交换而出现的,但是由于其功能特性,又产生一种新应用——使用hpi对dsp进行自举。实际上,tms320vc5x系列dsp在片内固化的bootloader程序中对hpi自举提供了全面的支持。笔者在voip系统的开发中,实现了使用hpi对dsp tms320vc5402的自举,从而省掉了dsp的eprom,使dsp只使用sram,提高了处理速度,并使host cpu具有更大的控制权,很适合多处理器系统。对于计算机插卡式的dsp系统,程序可以从pc机的硬盘上获取,从而减小了插卡版面空间占用,提高了处理速度。
在实现上,需要解决以下几个问题。
3.1 dsp片内固化的bootloader程序对hpi自举的支持
自举从本质上说就是在dsp启动后通过某种方式获取运行代码并开始运行,这个过程是在固化在dsp片内的bootloader程序辅助下完成的。在dsp上电以后,bootloader程序按照一定的顺序依次检验何种自举方式可用,自举方式包括hpi方式、serial eeprom方式、标准serial port方式、parallel方式和i/o方式。
bootloader查询hpi方式是否可用是这样进行的:在启动以后,dsp片内0x7f地址的值被置为0,bootloader不断检验0x7f地址处是否出现了可用的程序指针的跳转地址。当其发现该地址内的值不为0时,即判定为dsp已由外部host cpu进行了hpi自举程序加载,并按照该值跳转pc指针,开始运行,从而完成hpi方式自举
3.2 突破4k的空间限制
由于hpi-8的特性,host能够访问所有的片内ram空间,对于tms320vc5402来说,其片内ram地址空间从0000h到3fffh,一共4k。这已经大大超过了标准hpi的2k的大小,但是对于大多数dsp应用程序来说,片内ram除了放置程序代码以外,很可能还需要留出一部分供数据空间使用。实际上,大部分代码都可能放置在片外的程序空间,而这部分空间并不是host通过hpi-8所能够访问得到的。所以需要使用某种技术突破4k的片内ram空间限制。由于dsp程序本身是能够访问到所有dsp程序、数据空间的,所以host可以首先放置一个体积不大于4k的程序到dsp内,再由该程序和host协作完成超出片内ram的代码放置工作。
一般将上述的首先放入dsp的程序称为kernel程序,其功能比较简单,本身不超过4k,可以由host全部放入到tms320vc5402的片内ram中,并被启动。
基于此种思路的流程图如图1所示。
3.3 程序代码的定位
编程序的时候使用符号作为地址,经编译、链接后,符号所表示的相对地址已经转化为绝对地址。要使程序能够正常运行,需要将程序代码写到指定的位置——绝对地址。在host→kernel→dsp应用的hpi自举方式中,host和kernel需先后完成kernel代码和dsp应用程序代码的定位工作。
因此,在host cpu的外存储器中,至少需要保存dsp程序代码和相应的地址信息。这些数据在由自举程序写到dsp后,被拼接成正确的可执行代码、已初始化数据等,并被正确定位。一般来说,host cpu的外存储器中的dsp自举数据是hex格式的。虽然hex格式有很多种,但任何一种包含有地址等的16进制hex格式文件都是适用的。
常见的hex格式有ascii、intel、ti-tagged等格式,如图2所示。
在各种hex格式中,intel格式相对来说比较适宜,因为在intel格式的hex文件中,代码被分为每行一个块,这种分块的最大长度固定,因此在dsp内预留的缓冲区的大小容易计算。intel格式的hex文件的格式为:byte1作为每块的起始标志,总是“:”;byte2-3表示该真中有效数据的长度,最长为32个byte。这种有效数据可能是程序代码,也可能是扩展地址信息;byte4-7表示该真内代码的起始地址;byte8-9是类型,00表示程序挖出,01表示结束,04表示扩展地址;byte10之后是代码,直到最后两个byte,表示校验位。校验位的值是该真中先前数据值和的补码。
根据选定的hex格式,cpu首先按照该格式的定义对kernel的hex数据进行解释,获取各种后,cpu将其在tms320vc5402片内ram中组成可执行dsp程序。然后在cpu和kernel的共同作用下,对dsp应用程序的hex数据进行解释,最后完成其在dsp中的拼接、定位并启动dsp应用程序——跳转到dsp应用程序的起始地址。
4 系统软硬件设计与实现
4.1 系统框图
在笔者开发的voip系统中,使用了hpi对dsp(tms320vc5402)进行自举的功能。其中相应部分的框图如图3所示。
对于pc机插卡的系统,该框图更可以省略掉hpi以右的部分,而直接使用pc机的cpu和硬盘作为相应的控制和只读存储器件。这样,仅需要为dsp配备ram即可使其正常运行。
4.2 kernel程序设计
按照前面所说,kernel程序的作用是用于突破ms320vc5402 4k片内ram空间限制的中间程序,其功能无非就是按照和host cpu的某种约定,获取dsp程序代码和相应地址,在dsp所能够访问到的存储器空间(片内和片外)生成dsp程序代码。由于kernel的功能比较少,故其可以做得非常小。其中关键的生成dsp程序代码部分的代码如下:
…
.bss addr,1 ;程序代码目的地址
.bss length,1 ;程序代码长度
.bss codedata,20 ;接收程序代码缓冲区
…
.text
start:
…
move:
stm #addr,ar4 ;获取程序代码目的地址
ld *ar4,a
stm #codedata,ar3 ;获取程序代码
mvdm #length,ar5 ;获取程序代码长度
nop
mar *+ar5(#-1)
rpt *(ar5) ;定位
writa *ar3+
…
endload:
b app_start ;启动
…
4.3 运行流程
按照前述的系统构成,首先将pc机上调试好的kernel程序和dsp应用程序(一般为coff格式)转换成hex文件,并通过串口将这些文件存放到cpu的flash中,在存放过程中应将hex文件原样保存,以保留其中所有的。在系统启动后,cpu从flash中获取kernel的hex数据,通过hpi将其在tms320vc5402中组合出kernel运行程序并启动。然后cpu从其flash中获取dsp应用程序的hex数据,通过hpi将其分块放入tms320vc5402,并和已经开始运行的kernel程序最终完成dsp引用程序的正确定位工作。最后启动dsp应用程序。
在实路中发现,虽然hpi的设计初衷是为了和低速8位机接口进行数据交换,但是hpi本身的工作速度非常高。通过hpi方式加载一段不小于130k的dsp应用程序代码所需要的时间不超过3秒钟。
ti系列dsp提供了如此丰富的应用方式,无疑给dsp系统开发者带来了极大的方便。