用户登录  |  用户注册
首 页商业源码原创产品编程论坛
当前位置:PB创新网文章中心解决方案电子通信

TMS320C6000DSP自动引导的方法和编程实现

减小字体 增大字体 作者:佚名  来源:本站整理  发布时间:2009-01-10 22:46:38
代码必须连接到应用程序中,这样在系统加电复位后,用户的引导程序才能被合适地加载和执行;只有通过编写自己的引导代码用户才能正确地从ROM中拷贝COFF格式的段;在程序连接时,只有通过合理编写命令文件(.cmd),使这些段被合理地连接后,才能实现从ROM中加载,从DSP内部RAM中执行。在这个过程中,命令文件和用户引导代码编写对于程序能否正确地执行起着非常重要的作用。在某软件无线电工程的开发中,笔者就是在C语言环境下,成功地开发了TMS320C6701的自引导程序。下面就针对这两个方面加以详细说明,以供大家借鉴。

3.1 命令文件

利用TI的代码产生工具,可以按照图2所示的步骤生成可执行文件(.out)。

汇编器接收汇编优化器或编译器产生的.asm文件,经过汇编后产生可重新分配地址的COFF格式的目标文件.obj。该格式文件包含了汇编器所生成的各个段(如表1所示),命令文件就是指导连接器如何将各段分配到相应的存储器中。编写命令文件时,有一点需要注意,那就是在很多情况下需要对某段说明两个不同的地址:加载地址和运行地址。加载地址决定了二进制程序代码的存储位置和程序的引导地址,但在运行过程中对于该段的任何引用则是以它的运行地址作为参考的。因此,当用户对某段分别说明了加载地址和运行地址时,只有将该段从加载地址复制到运行地址上,该段才可以被访问。

表1 编译器产生的默认代码段和数据段

段  名段数据段说明建议分配方法
.text代码段程序代码Load=ROM,Run=RAM
.switch初始化数据段Switch语句跳转表Load=ROM,Run=RAM
.bss,.far未初始化数据段c变.运行时从.cinit中自动初始化Load=Run=RAM
.cinit,.pinit初始化数据段C变量和函数初始化表Load=Run=ROM
.const初始化数据段常量Load=Run=ROM
.data,.cio,.sysmem未初始数据段其它的.data段Load=Run=RAM

在命令文件中,合理地分配.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 = 0x00001e00

CE1VECS: origin=0x01400000, len = 0x00000200

CE1PMEM:origin = 0x01400200, len = 0x0000d000

CE1INIT: origin = 0x0140d200, len = 0x00001e00

CE3: origin = 0x03000000, len = 0x01000000

DRAM: origin = 0x80000000, len = 0x00010000

}

SECTIONS ;说明目标文件中各段的加载地址和运行地址

{

.myBootCode :load=CE1VECS, run=VECS

;用户的引导代码段

.text : load=CE1PMEM, run=PMEM

.cinit : load=CE1INIT, run=DRAM

;装载到ROM中,在片内数据区运行

.const > DRAM

.data > DRAM

.bss > DRAM

.sysmem > DRAM

.stack > DRAM

.far > CE3

}

3.2 编写用户引导代码

DSP加电复位后,自动从CE1空间中拷贝64K数据(程序代码)到地址0处,然后从0地址处开始执行指令。由于在命令文件中,将.cinit装载到外部ROM中,但其运行地址却在片内数据区,所以采用下面这段程序,其主要作用是将Cinit从外部ROM中搬到片内数据区,使其能在C编程环境下进行正确的初始化工作,保证程序的顺利进行。

.sect “.myBootCode”

;将用户引导代码分配到

myBootCode段中

.global myBootCode

.ref _c_int00

;C程序的入口地址

myBootCode

......

;EMIF寄存器和DMA寄存器初始化

;使用DMA方式将以原地址0x0000d200开始的0x380长的存储空间拷贝到目标地址上

mvkl DMA0_SRA ,A5 ;装载原地址0xd200

mvkl 0x0000d200, B4

mvkh DMA0_SRA ,A5

mvkh 0x0000d200m B4

stw B4,*A5

mvkl DMA0_DSA, A5 ;装载目标地址0x80000000

mvkl 0x80000000, A4

mvkh DMA0_DSA, A5

mvkh 0x80000000, A4

stw A4,*A5

mvkl DMA0_CNT A5 ;装载数据长度0x380(这个长度可以通过查看.map文件中.cinit的长度获得)

mvkl 0x00000380, B1

mvkh DMA0_CNT ,A5

mvkh 0x00000380, B1

;启动DMA开始传输

wait:

mvkl DMA0_PCR ,A5

mvkh DMA0_PCR ,A5

ldw *A5 ,B2

mvkl 0x0000000c,A5

mvkh 0x0000000c ,A5

and A5,B2,B2

b2 b wait

nop 5

;传输结束后,跳转到C程序的入口地址c_int00处,

开始执行程序

mvkl .s2 _c_int00B0

mvkh .s2 _c_int00B0

B .s2 B0

nop 5




上一页  [1] [2] 

Tags:

作者:佚名

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
PB创新网ourmis.com】Copyright © 2000-2009 . All Rights Reserved .
页面执行时间:2,593.75000 毫秒
Email:ourmis@126.com QQ:2322888 蜀ICP备05006790号