TMS320C6000 DSP自动引导的方法和编程实现
·系统加电复位,芯片从ROM中拷贝固定长度的数据块(其中包括用户自身的引导代码)到RAM中,用以初始化部分存储器;
·执行用户的引导代码和其它数据段以及程序段初始化所必需的段复制;
·使用包含.cinit段中的数据初始化.bss段中C语言变量;
·程序从main()处开始执行。
在开发从ROM引导的应用程序时,必须考虑以下几点:用户引导代码必须连接到应用程序中,这样在系统加电复位后,用户的引导程序才能被合适地加载和执行;只有通过编写自己的引导代码用户才能正确地从ROM中拷贝COFF格式的段;在程序连接时,只有通过合理编写命令文件(.cmd),使这些段被合理地连接后,才能实现从ROM中加载,从DSP内部RAM中执行。在这个过程中,命令文件和用户引导代码编写对于程序能否正确地执行起着非常重要的作用。在某软件无线电工程的开发中,笔者就是在C语言环境下,成功地开发了TMS320C6701的自引导程序。下面就针对这两个方面加以详细说明,以供大家借鉴。
3.1 命令文件
利用TI的代码产生工具,可以按照图2所示的步骤生成可执行文件(.out)。
汇编器接收汇编优化器或编译器产生的.asm文件,经过汇编后产生可重新分配地址的COFF格式的目标文件.obj。该格式文件包含了汇编器所生成的各个段(如表1所示),命令文件就是指导连接器如何将各段分配到相应的存储器中。编写命令文件时,有一点需要注意,那就是在很多情况下需要对某段说明两个不同的地址:加载地址和运行地址。加载地址决定了二进制程序代码的存储位置和程序的引导地址,但在运行过程中对于该段的任何引用则是以它的运行地址作为参考的。因此,当用户对某段分别说明了加载地址和运行地址时,只有将该段从加载地址复制到运行地址上,该段才可以被访问。
表1 编译器产生的默认代码段和数据段
在命令文件中,合理地分配.cinit段对于整个程序的正确运行起到关键的作用。在TI可查阅的文档和相关网站上,很少有涉及这方面内容的文章。经过反复实践,笔者取得了处理.cinit段的一些经验,请大家在下面的命令文件和用户引导程序中注意该段的处理过程。
下面是在实践中编写的命令文件(.cmd)?
-c ;说明复位后的初始化方式
-stack 0x5000 ;说明堆的大小
-heap 0x400 ;说明栈的大小
-l rts6701.lib ;说明程序中引用的库文件
MEMORY ;将整个存储器分成具有不同名称的存储区域
{
VECS:? origin = 0x00000000, len = 0x00000200
PMEM: origin = 0x00000200, len = 0x0000d000
PCINIT: origin = 0x0000d200, len = 0x00
《TMS320C6000 DSP自动引导的方法和编程实现(第2页)》