从主机向DSP下载可执行文件的常用方式有:(1)利用仿真器,通过USB总线和JTAG端口,把可执行文件从主机下载进DSP。这种方式适用于软件研制阶段。(2)利用烧写器,把可执行文件烧写进硬件电路板上的Flash芯片中。DSP上电复位之后,将固化在Flash芯片中的代码读入DSP的片上RAM或片外RAM映射成的存储区域里。这种方式适用于软件调试结束、需要将其固化在电路板上的阶段。固化之后,整个系统可以脱离主机运行。
在软件无线电系统的实际应用过程中,还需要这样一种下载方式:从主机直接向DSP下载可执行文件并且启动程序运行。这些可执行文件是已经经过调试、满足要求的功能模块。主机将它们分别实时下载并启动运行,能够迅速地切换整个软件无线电系统的业务模式,使系统迅速地满足不同场合的要求,从而把系统面向广大用户的通用性与面向特定用户的专用性很好地结合起来。
1 以DSP为核心的软件无线电硬件平台简介
图1是本文实例的硬件平台框图。A/D的工作方式由FPGA控制,外界模拟信号通过A/D采样,进入双口RAM,DSP从双口RAM里读取采样数据。DSP芯片采用TI公司推出的TMS320C6000系列中的C6701,它通过EMIF与SDRAM和SBRAM芯片相连。PCI芯片AMCCS5933在主机和DSP之间起桥梁作用,它使得主机可以通过PCI总线访问DSP的所有存储空间,DSP也可以通过PCI总线向主机发送信息。
2 从主机通过PCI总线向DSP下载可执行文件
2.1 实现流程
图2显示了下载可执行文件的整个流程。
2.2 文件格式转换
开发运行在TMS32C6000系列DSP上的程序时,通常都使用TI公司推出的集成开发环境CCS。编译通过之后,会生成一个可执行文件*.out。下载到DSP中的就是该*.out文件里的代码。
以文件loadProgTest.out为例,阐述文件格式的转换过程:
首先把loadProgTest.out文件转换成十六进制格式的文件,编写一个名为loadProgTest.cmd的文件,内容如下:
各条语句的含义如下:
第1行是out文件名;第2行表示输出ASCII的十六进制格式;第3行指明转换后的十六进制文件为image模式;第4行表示生成名为loadProgTest.mxp的文件,可以从该文件中看到各段所占的存储单元;第5行和第6行分别指明memory和ROM的宽度;第7行指明little-endian方式(如果需要使用big-endian方式,把L改为M即可)。
可执行文件中的代码从组织形式上分成若干段,从内容上则分为程序代码和数据代码。第10行表示在DSP的存储区域中,为程序代码开辟的空间是从地址0x00000000到0x0000ffff;程序代码转换成十六进制格式之后,将被写入loadProgTest.hex文件。第11行表示在DSP的存储区域中,为数据代码开辟的空间是从地址0x80000000到0x8000ffff;数据代码转换成十六进制格式之后,将被写入loadProgTest.a10文件。
编写好loadProgTest.cmd文件之后,从CCS安装目录下拷贝出一个名为hex6x.exe的应用程序,把它和loadProgTest.out文件以及loadProgTest.cmd文件放在同一个文件夹里。执行命令行hex6x loadProgTest.cmd。
执行完后,将生成3个文件:loadProgTest.mxp、loadProgTest.hex和loadProgTest.a10。
其次,把loadProgTest.hex和loadProgTest.a10 2个文件分别转换为头文件
编写一个C语言应用程序,利用C语言中的文件库函数,新建一个名叫code.h的头文件,然后打开loadProgTest.hex,按从前到后的顺序逐一读取其中的字符。每读取8个字符,就在这8个字符中最先读取的字符前面加上“0x”,然后把它们写入头文件code.h。这样,就把loadProgTest.hex中的程序代码组织成了一个数组,存放进code.h头文件。用同样的方法,把loadProgTest.a10中的数据代码组织成一个数组,存放进data.h头文件里。
经过了上述转换之后,就可以把头文件code.h和data.h中的数组,即可执行文件loadProgTest.out中的代码下载进DSP中了。
2.3 下载代码
下载代码之前要做的准备工作是把DSP的BOOT方式设置为HPI方式(HPI指DSP的主机并行端口),并给DSP一个复位脉冲,以锁存HPI的BOOT方式。这时,DSP的内核将处于reset状态。
设置并锁存DSP的BOOT方式之后,就可以向它下载代码了。下载代码的过程全部在PCI驱动程序里完成,主机可以通过HPI访问DSP的所有存储空间。本实例中,下载程序代码时,首先配置HPI控制寄存器HPIC为0x00010001,其次配置HPI地址寄存器HPIA为0x00000000,这是程序代码在DSP存储空间中的起始存储地址,然后把code.h里的数组写进自动增量模式的HPI数据寄存器HPID。下载数据代码的步骤和下载程序代码一样,只是要把HPIA配置成0x80000000,这是数据代码在DSP存储空间中的起始存储地址。
2.4 启动程序运行
成功下载可执行文件的代码之后,主机向HPIC寄存器中的DSPINT位写入1。这个动作同样是在PCI驱动程序里完成。只要DSPINT=1,DSP的内核将被唤醒,自动从0x00000000处开始执行已下载的程序。
图2是一个演示实例,程序功能是向地址0x80007000至0x80007010的DSP存储区写入0x12345678。可以看到下载程序前后DSP存储区的内容变化。
3 结 论
通过转换可执行文件的格式,把DSP设置成HPI的BOOT方式,复位DSP,下载可执行文件代码,设置HPIC寄存器的DSPINT位为1,可以实现从主机通过PCI总线在线下载可执行文件、并且启动程序运行的目的。本文中的实例DSP采用了TMS320C6701,对于其它型号的DSP,本文同样具有指导意义。