1、引言
在极低谱密度,高频谱利用率的大容量无线传输技术中,高速实时信号处理成为技术的关键。当前市场上,能满足对高速实时信号处理的需要有足够的优点TMS320C6000系列DSP是TI公司推出的一种高性能的数字信号处理器,包含定点和浮点两个系列,其中定点系列包括TMS320C62xx和TMS320C64xx,浮点系列包括TMS320C67xx。 C6000系列DSP有三种启动方式:
(1)主机启动
如果选择主机启动模式,在复位信号结束后,DSP的CPU被内部“一块”而其他部分都被释放。在此期间,一个外部的主机在必要时可以通过主机接口初始化CPU的主机完成了所有必须的初始化,它必须将HPIC寄存器的DSPINT位置“ 1”来完成启动过程。在程序加载完后,CPU被从“复制”中在CPU被唤醒后,CPU需要将DSPINT位清零。
(2)ROM启动是否采用
ROM启动模式,则C6000系列的DSP(C621x / C671x / C64x)。该副本过程由EDMA完成,使用替换的Rom时钟。在此过程中CPU一直处于“重叠”状态,直到复制完成后才被被唤醒,然后从地址0处开始执行程序[1]。
(3)无启动如果选择无启动模式,CPU复位后直接从地址0处开始执行指令。C6000系列DSP的器件配置情况决定了选择的启动方式。具体来说就是DSP的启动模式
以C6416为例,BEA [19:18]是启动模式管脚,它们取不同的值(上拉电阻代表“ 1”,下拉电阻代表“ 0 ”)的代表如表1-1所示:
如果DSP的程序会大于1K字节,那么上述ROM启动机制已经可以完成程序的加载。而事实上大部分DSP的程序会大于1K字节,这时就需要创建一个特定的启动程序来完成更多代码的加载。该特定启动程序又被称作二级引导加载器。
在需要二级引导程序的程序中,这段特定启动代码通常驻留在ROM存储器的起始位置以便在DSP复位后能自动被加载到内存地址0处。当1K字节代码被加载完成后,CPU开始从地址0处执行,也就是执行二级bootloader的内容。二级bootloader的功能就是将程序的剩余部分复制到内存中。
2、启动方法的设计与实现
图1为实施方法的详细说明。启动方法的设计与实现采用二级引导程序的DSP启动方法的实现大体分为四步:配置存储器;编写辅助引导程序代码;编译程序,转换目标文件的格式;将程序烧写进Flash。该启动方法的硬件平台示意图,其中DSP的型号选择C6416,Flash的型号选择AM29LV800B。
2.1配置存储器
2.1.1定义存储分区
为了实现使用二级bootloader的ROM启动,需要将闪存划分为FLASH_BOOT,FLASH_REST两个区。这两个区分别存储由片上bootloader复制的程序段和由secondary bootloader复制的程序段。对于BIOS程序,对于非BIOS程序,内存段定义在链接器命令文件中。一个C6416的内存段定义的示例如下所示:
MEMORY
{…
FLASH_BOOT:o = 0x64000000 l = 00000400h
FLASH_REST :o = 0x64000400 l = 0000fc00h
}
2.1.2 COFF段的定位
DSP程序通过COFF段的形式在内存中存放的。一个COFF段就是一个代码或数据块,它在内存中占据连续空间。为自定义段,初始化段和未初始化段类型。COFF段可以有各种属性,其中,负载属性和运行属性与DSP启动有密切的关系。负载属性指定段的存储地址,运行属性指定段的执行地址例如:
.text:LOAD = FLASH,RUN = IRAM表示代码段.text被存储在flash中,DSP启动时二级bootloader将该段拷贝拷贝到IRAM中。
2.2编写辅助Bootloader代码
对于C6416,外部存储器接口(EMIF)需要正确配置以后才可以访问外部存储器件。在此工作完成后,二级bootloader应该将所有的初始化段从其的负载地址拷贝到run地址,之后再替换二级Bootloader用汇编语言编写,因为此时C环境尚未建立。
二级bootloader必须知道所有初始化段的大小,在Flash中存储的位置以及应该被加载到何处实际上,二级bootloader通过读取段拷贝表获得了上述信息。此处第三部分详细说明了有关段拷贝表的内容。
完成二级bootloader代码的编写后,应将它添加入工程,与工程的其他代码一同编译链接生成的.out文件。
2.3目标转换文件的格式
编译链接生成的的英文的.out格式文件,然而闪存一般接收的是ASCII格式的文件[3] .CCS附带的工具六角转换实用程序可将.out文件转换为ASCII格式的.hex文件,Hex6x以命令行文件的形式执行。Hex命令行文件中,首先指定输入文件(.out),输出文件的格式和ROM的大小及类型一个Hex命令行文件的示例如下所示(注释内容用“ / *”和“ * /”括起):
-a / *输出文件采用ASCII格式* /
-图片/ *基本模式* /
-memwidth 8 / * ROM数据宽度8bit * /
ROMS
{
FLASH:org = 0x64000000,len = 0x100000,romwidth = 8,files = {。\ rom_boot.hex}
} SECTIONS / *列出所有需要固化在Flash中的COFF段* /
2.4将程序烧写进Flash
将2.3节生成的ASCII文件烧写进Flash可以使用CCS自带的FlashBurn工具。FlashBurn是一个带图形界面的软件,它首先将一个FlashBurn TargetComponent(FBTC)的程序下载到DSP内存中,通过与FBTC的实时数据交换完成对Flash的编程编程等操作。针对不同的硬件(DSP,Flash Model)修改FBTC是该方法的关键。所需的修改位置包括Flash的基地址,
3、段拷贝表
复制表二级bootloader使用一个段复制表(段复制表)进行段的复制。段复制表包含每个需要复制的段的必要信息,如段的加载地址。 ,段的runaddress,段的大小。段拷贝表被插入在secondary bootloader的末尾。生成段拷贝表的方法有两种:
1)使用十六进制转换实用程序的-boot选项
在2.3节中我们讨论了程序文件格式的转换和hex命令行文件,实际上Code Composer Studio自带的工具hex转换实用程序提供了一种更加方便的生成段拷贝表的方法,只要在hex命令行文件中使用一些特殊的选项即可。特殊的选项有–boot,-bootorg和–bootsection,这三个选项的指示分别如下:-boot
使用该选项时hex转换实用程序将自动转换所有初始化段的格式-bootorg指定段拷贝表的地址-bootsection。规范二级引导程序所在的段的名称
2)使用链接器选项(LOAD_START,RUN_START,SIZE)
涉及段拷贝表的生成的三个选项:LOAD_START,RUN_START和SIZE,可分别获得一个段的交换地址,运行地址和大小。例如,可以使用以下代码段的文本段的替换地址(存于_text_ld_start中) ,,运行地址(_text_rn_start)和段的大小(存于_text_size)
.text:load = FLASH_REST,run = IRAM
LOAD_START(_text_ld_start),
RUN_START(_text_rn_start),
SIZE(_text_size)
4、结束语
此处针对于极低谱密度,高频谱利用率的大容量无线传输技术研究中C6000系列DSP的应用程序大于1K字节的情况,提出了一种使用二级引导程序从Flash启动DSP的方法。该方法可采用了C6000系列DSP的嵌入式系统中,不需要额外的闪存编程器,具有广泛的适用性。
本文作者创新点:在二级引导程序中引入段拷贝表用以控制程序加载过程,并利用CCS自身的编译功能获取段复制表的内容,该方法可提高效率且准确高。
责任编辑:gt
评论
查看更多