浅谈大容量无线传输技术中高性能DSP启动方法

时间:2011-09-05

  1 引言

  德州仪器 (Texas Instruments),简称TI,是的半导体公司,为现实世界的信号处理提供创新的数字信号处理(DSP)及模拟器件技术。除半导体业务外,还提供包括传感与控制、教育产品和数字光源处理解决方案。TI总部位于美国得克萨斯州的达拉斯,并在25多个国家设有制造、设计或销售机构。

  在极低谱密度,高频谱利用率的大容量无线传输技术中,高速实时信号处理成为技术的 关键。目前市场上,能满足对高速实时信号处理的需要有具有良好的可编程性的器件主要有 DSP 和FPGA。

  (1) 主机启动

  如果选择主机启动模式,在复位信号结束后,DSP 的CPU 被内部“阻塞”而其他部分都 被释放。在此期间,一个外部的主机在必要时可以通过主机接口初始化CPU 的内存空间,包 括配置与启动相关的内部寄存器。在程序加载完后,CPU 被从“阻塞”中唤醒,然后 从地址0 处执行指令。在CPU 被唤醒后,CPU 需要将DSPINT 位清零。

  (2) ROM 启动

  如果采用ROM 启动模式,则C6000 系列的DSP(C621x/C671x/C64x)复位后自动从CE1 空间的起始处拷贝1K 字节的代码到内存空间。该拷贝过程由EDMA 完成,使用默认的Rom 时钟。在此过程中CPU 一直处于“阻塞”状态,直到拷贝完成后才被被唤醒,然后从地址0 处开始执行程序[1]。

  (3) 无启动

  如果选择无启动模式,CPU 复位后直接从地址0 处开始执行指令。 C6000 系列DSP 的器件配置情况决定了选择的启动方式。具体来说就是DSP 的启动模式 管脚(boot mode pins)接上拉还是下拉电阻。以C6416 为例,BEA[19:18]是启动模式管 脚,它们取不同的值(上拉电阻代表“1”,下拉电阻代表“0”)代表的含义如表1-1 所示:

  如果DSP 的程序小于1K 字节,那么上述ROM 启动机制已经可以完成程序的加载。然而 事实上大部分DSP 的程序会大于1K 字节,这时就需要创建一个特定启动程序来完成更多代 码的加载。该特定启动程序又被称作二级bootloader[2]。

  在需要二级bootloader 的程序中,这段特定启动代码通常驻留在ROM 存储器的起始位 置以便在DSP 复位后能自动被加载到内存地址0 处。当1K 字节代码被加载完毕后,CPU 开 始从地址0 处执行,也就是执行二级bootloader 的内容。二级bootloader 的功能就是将程 序的剩余部分拷贝到内存中。

  2 启动方法的设计与实现

  采用二级bootloader 的DSP 启动方法的实现大体分为四步:配置存储器;编写 secondary bootloader 代码;编译程序,转换目标文件的格式;将程序烧写进FLASH。图1 为实施该启动方法的硬件平台示意图,其中DSP 的型号选择C6416,FLASH 的型号选择 AM29LV800B。

  2.1 配置存储器

  2.1.1 定义存储器分区

  BootLoader就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境带到一个合适状态,以便为终调用操作系统内核准备好正确的环境。在嵌入式系统中,通常并没有像BIOS那样的固件程序(注,有的嵌入式CPU也会内嵌一段短小的启动程序),因此整个系统的加载启动任务就完全由BootLoader来完成。比如在一个基于ARM7TDMI core的嵌入式系统中,系统在上电或复位时通常都从地址0x00000000处开始执行,而在这个地址处安排的通常就是系统的BootLoader程序。

  为了实现使用二级bootloader 的ROM 启动,需要将FLASH 划分为FLASH_BOOT, FLASH_REST 两个区。这两个区分别存储由on-chip bootloader 拷贝的程序段和由secondary bootloader 拷贝的程序段。对于非BIOS 程序,Memory 段定义在linker command file 中。一个C6416 的Memory 段定义的例子如下所示:

  在专用的嵌入式板子运行GNU/Linux系统已经变得越来越流行。一个嵌入式Linux系统从软件的角度看通常可以分为四个层次:

  (1) 引导加载程序。包括固化在固件(firmware)中的boot代码(可选),和BootLoader两大部分。

  (2) Linux内核。特定于嵌入式板子的定制内核以及内核的启动参数。

  (3) 文件系统。包括根文件系统和建立于Flash内存设备之上文件系统。通常用ramdisk来作为rootfs。

  (4) 用户应用程序。特定于用户的应用程序。有时在用户应用程序和内核层之间可能还会包括一个嵌入式图形用户界面。常用的嵌入式GUI有:MicroWindows和MiniGUI等。

  2.1.2 COFF 段的定位

  COFF – 通用对象文件格式(Common Object File Format),是一种很流行的对象文件格式(注意:这里不说它是“目标”文件,是为了和编译器产生的目标文件(*.o/*.obj)相区别,因为这种格式不只用于目标文件,库文件、可执行文件也经常是这种格式)。大家可能会经常使用VC吧?它所产生的目标文件(*.obj)就是这种格式。其它的编译器,如GCC(GNU Compiler Collection)、ICL(Intel C/C++ Compiler)、VectorC,也使用这种格式的目标文件。不仅仅是C/C++,很多其它语言也使用这种格式的对象文件。统一格式的目标文件为混合语言编程带来了极大的方便。

  当然,并不是只有这一种对象文件格式。常用格式的还有OMF-对象模型文件(Object Module File)以及ELF-可执行及连接文件格式(Executable and Linking Format)。OMF是一大群IT巨头在n年制定的一种格式,在Windows平台上很常见。大家喜欢的Borland公司现在使用的目标文件就是这种格式。MS和Intel在n年前用的也是这种格式,现在都改投异侧,用COFF格式了。ELF格式在非Windows平台上使用得比较多,在Windows平台基本上没见过。

  DSP 程序是以COFF 段的形式在内存中存放的。一个COFF 段就是一个代码或数据块,

  它在内存中占据连续空间。COFF 段分为自定义段,初始化段和未初始化段三种。COFF 段可

  以有各种属性,其中load 属性和run 属性跟DSP 启动有密切关系。Load 属性指明段的存储

  地址,run 属性指明段的执行地址。二级bootloader 负责将所有的段从load 地址拷贝到run

  地址。例如:

  .text: LOAD= FLASH, RUN= IRAM

  表示代码段。text 被存储在flash 中,DSP 启动时二级bootloader 将该段拷贝到IRAM 中。

  2.2 编写Secondary Bootloader 代码

  对于C6416,外部存储器接口(EMIF)需要正确配置以后才可以访问外部存储器件。在这项工作完成后,二级bootloader 应该将所有的初始化段从它们的load 地址拷贝到run 地址,之后再跳转到_c_int00,也即是程序入口点。Secondary Bootloader 用汇编语言编写,因为此时C 环境尚未建立。

  本文第三部分详细说明了有关段拷贝表的内容。

  完成二级bootloader 代码的编写后,应将它添加入工程,与工程的其他代码一同编译链接生成。out 文件。

  2.3 转换目标文件的格式

  编译链接生成的是。out 格式文件,然而Flash 一般接收的是ASCII 格式的文件[3]。CCS附带的工具hex conversion utility 可将。out 文件转换为ASCII 格式的。hex 文件,Hex6x以命令行文件的形式执行。Hex 命令行文件中,首先指明输入文件(。out),输出文件的格式和ROM 的大小及类型,以及哪些段需要被放在ROM 中。一个Hex 命令行文件的例子如下所示(注释内容用“/*”和“*/”括起):

  -a /*输出文件采用ASCII 格式*/

  -image /*镜像模式*/

  -memwidth 8 /*ROM 数据宽度8bit*/

  ROMS

  {

  FLASH: org = 0x64000000, len=0x100000, romwidth = 8, files =

  {.\rom_boot.hex}

  }

  SECTIONS /*列出所有需要固化在Flash 中的COFF 段*/

  {

  .vectors /*中断向量表段*/

  .boot_code /*二级bootloade 段r*/

  .text /*代码段*/

  .cinit /*全局变量初始值段*/

  }

  2.4 将程序烧写进Flash

  将2.3 节生成的ASCII 文件烧写进Flash 可以使用CCS 自带的FlashBurn 工具。

  FlashBurn 是一个带图形界面的软件,它首先将一个称作FlashBurn Target Component(FBTC)的程序到DSP 内存中,通过与FBTC 的实时数据交换完成对Flash 的擦除编程等操作。

  针对不同的硬件(DSP,Flash 型号)修改FBTC 是该方法的关键。所需修改处包括Flash 的基地址,大小,及读写命令字等。

  3 段拷贝表

  二级bootloader 使用一个段拷贝表(section copy table)进行段的拷贝。段拷贝表包含每个需要拷贝的段的必要信息,如段的load 地址,段的run 地址,段的大小。段拷贝表被插入在secondary bootloader 的末尾。

  生成段拷贝表的方法有两种:

  1) 使用hex conversion utility 的-boot 选项

  在2.3 节中我们讨论了程序文件格式的转换和hex 命令行文件,事实上Code Composer

  Studio 自带的工具hex conversion utility 提供了一种更为方便的生成段拷贝表的方法,只要在hex 命令行文件中使用一些特殊的选项即可。特殊的选项有–boot, bootorg ? 和–bootsection,这三个选项的含义分别如下:

  -boot 使用该选项时hex conversion utility 将自动转换所有初始化段的格式

  -bootorg 指明段拷贝表的地址

  -bootsection 指明二级bootloader 所在的段的名称

  2) 使用linker 选项(LOAD_START,RUN_START,SIZE)

  涉及段拷贝表的生成的有三个选项:LOAD_START,RUN_START 和SIZE,可分别获得一个

  段的驻留地址,运行地址和大小。例如下列代码可获得text 段的驻留地址(存于

  _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 字节的情况,提出了一种使用二级bootloader 从Flash 启动DSP 的方法。该方法可应用于采用了C6000 系列DSP 的嵌入式系统中,不需要额外的Flash 编程器,具有广泛的适用性。

  本文作者创新点:在二级bootloader 中引入段拷贝表用以控制程序加载过程,并利用CCS 自身的编译功能获取段拷贝表的内容,该方法可提高效率且准确性高。


  
上一篇:基于DSP设计变频电源数字控制系统程序
下一篇:系统的更新,实现了嵌入式的温湿度模糊控制系统

免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

相关技术资料