当前位置:文档之家› TI 公司F28xx系列DSP的CMD文件运用

TI 公司F28xx系列DSP的CMD文件运用

TI 公司F28xx系列DSP的CMD文件运用
TI 公司F28xx系列DSP的CMD文件运用

TI 公司F28xx系列DSP的CMD文件运用

本系列文章由斌斌-龙臻独立完成,首发于QQ空间,会在百度空间、网易博客、人人网同步更新,转载必须注明作者和出处,必须注明原文链接。作者水平有限,难免存在错误,不足之处请指正。

注:本系列文章主要针对TI公司的F28xx系列DSP芯片的一些功能模块进行介绍,并描述基本的配置。文章中提到的DSP芯片未说明即默认为TMS320F28335,简称为28335。

在讲述CMD文件的配置之前,首先把在项目开发过程中遇到的问题反馈如下图1,2所示:

图1

图2

图1所描述的是CMD文件中的.econst段的空间存储量太小,图2所描述的是程序链接的过程中擦写flash。一般说来,擦写flash是正常的,在此处将其称之为问题是因为程序是在Debug模式下链接,理论上是擦写RAM的。上述的问

题的出现均是在CCS4.1.2的编译环境下,CCS3.3是否有相同的表现,笔者未曾尝试,不敢保证。

每一个DSP的项目都必须有CMD文件,CMD文件主要是用来对存储区域进行划分并对输出端进行地址分配。说的笼统点,就是将处理器的片内外存储器进行空间分配。

在CMD文件中,可以通过MEMORY伪指令确定目标存储器的属性及存储区域。每个存储区域包括:名字,起始地址,长度,属性选项,指定填充选项。F28xx系列DSP的数据和程序空间是相互独立的,在默认状态下,一部分存储器作为程序区域,一部分存储器作为数据区域。一般来说,MEMORY伪指令的PAGE0配置程序空间,PAGE1配置数据空间。使用MEMORY伪指令必须指明转载代码要用到的存储区域,以便链接器进行配置。MEMORY的一般指令格式如图3所示:

图3

在链接时,一般通过SECTIONS伪指令把输出段分配到MEMORY伪指令定义的存储区域。每一个输出段以名称开头,定义一个输出文件中的段。段名后面是段的属性,段的属性可能有以下几种:装载位置,运行位置,输出端,段类型,填充值。链接器为每一个输出段在目标存储器中分配两个地址,一个是段的装载位置,一个是段的运行位置。通常情况下,这两个地址相同。

可以通过一个或多个定位参数来控制地址分配,每一个参数包含一个关键字、可选的符号为等号或大于号。所用到的关键字有:LOAD(装载),Binding (绑定),Named MEMORY(命名存储器),Alignment(定位),Blocking(分块),Page(页)。相比较而言,Page的使用率远远高于其他几个关键字。SECTIONS 的一般指令格式如图4所示:

图4

在图4,SECTIONS的指令格式中,我们看到了一些段名,有必要对这些段名做些解释。链接器定义了两种基本类型的段:一种是包括数据表格或执行代码的已初始化的段,另一种是分配在RAM空间的未初始化的段。

.text 此段存储所有执行代码和常数

.cinit 此段存放初始化变量和常数,包含未用const声明的外部(extern)或静态(static)数据表

.pinit 此段存放初始化变量和常数

.const 此段存放字符串常量,声明,具备常数性质的全局和静态变量,包括已经用const声明的外部或静态数据表以及字符串常量

.econst 此段的属性与.const相同。不同的是,.const的分配范围被限制在低64K16位数据区内,而.econst的分配范围是4M22位数据区

.switch 此段存放switch语句的常数表格

以上的段都是已经初始化了的段。

链接器定义的未初始化的段为:.bss,.ebss,.stack,.sysmem,.esysmem。

.bss 此段为全局和静态变量保留空间。它是一种默认的COFF(Common Object File Format)(如有兴趣了解,请查看TI的手册)段。

.ebss 此段的属性与.bss相同。不同的是,.bss的分配范围被限制在低64K16位数据区内,而.ebss的分配范围是4M22位数据区

.stack 此段为C系统的栈存储区,用来向函数传递数值与分配局部变量空

间。

.sysmem 此段为堆存储区

.esysmem 此段为22位堆存储区

通过以上的解释,想必对CMD文件的框架应当有所了解,但要完全读懂CMD文件可能还要假以时日,当初笔者也是这样过来的。在阅读CMD文件时要前后对应,要将MEMORY指令中的名字与SECTIONS中的装载位置一一对应,并注意Page,弄清楚是在程序空间还是数据空间。

下面对遇到的两个问题进行解答,针对问题1,CMD文件中,.econst段存放在程序区以RAML1命名的程序空间,其空间存储量为0x001000,如图5,6所示。虽然以RAML1命名的程序空间有0x001000的容量,但并不是全部用来作为.econst段的,因此当代码中,字符串常量等数据量超过.econst段的容量时,就出现了图1的报错。只要扩大容量即可解决。

图5

图6

对于问题2,代码运行的首地址和段都映射在flash空间,如图8,9所示,则必然会出现擦写flash的行为。只要将MEMORY下命名和地址进行适当的修改即可。

图7

本文到此结束,下篇文章将会讲述28335的串口通信。

相关主题
文本预览
相关文档 最新文档