DSPF28335学习笔记之(1)CMD文件说明

版权声明: https://blog.csdn.net/sinat_37710872/article/details/82425299

目录

1.MEMORY伪指令

2.SECTIONS伪指令

3.链接代码与存储单元的3个步骤:


CCS中CMD文件用于指定存储区域的划分,在使用中可根据系统给定的.cmd进行修改,建立适合自己使用的CMD文件。CMD文件中主要有两个常用的伪指令MEMORYSECTIONS

MEMORY伪指令用来表示实际存在目标系统中的可以使用的存储器范围,在这里每个存储器都有自己的名字,起始地址和长度;它告诉链接程序怎样计算和分配空间,根据芯片不同存储空间大小不同。格式:

                               Name:origin=0x????,length=0x????

代表十六进制数,从0~F。例如想定义一段Flash存储空间,其长度为64kw,开始位置为0x300000,其格式如下:

      MEMORY

{

扫描二维码关注公众号,回复: 3170817 查看本文章

      FLASH:origin=0x300000,length=0x040000

}

需要说明:这里描述存储空间大小时,length=0x040000→(2^2)×(2^12)=64×(2^10)=64kw,即64k×16bit。

 

DSP的CMD采用分页制(page),其中PAGE0用于存放程序空间、PAGE1用于存放数据空间,PAGE里包含的区间名字与其后面的参数反映了该区间的起始地址和长度。

如,“PAGE0DARAM0: o = 0x00080  l = 0x01F80”,o=origin起始地址,l=length长度。

2.SECTIONS伪指令

SECTIONS伪指令是用来描述输入端是如何组合到输出端内的。SECTIONS部分,在程序里添加段名.XXXX(如.vectors.)用来指定该段名以下,另一个段名以上的程序(属于PAGE0)或数据(属于PAGE1)放到“>”符号后的空间名字所在的地方。,

SECTIONS部分的段可分为初始化段和非初始化段。初始化段包含代码和常数等必须在DSP上电之后有效的数,故初始化块必须保存在如片内FLASH等非遗失性存储器中;非初始化段中含有在程序运行过程中才像变量内写数据进去,所以非初始化段必须链接到易失性存储器中如RAM。

表格1 .cmd文件中各个段的含义

名称

描述

链接位置

初始化的段

.text

代码

Flash

.cinit

全局与静态变量的初始值

Flash

.econst

常数

Flash

.switch

Switch表达式的表格

Flash

.pinit

全局结构函数表

(C++中的constructor)

Flash

未初始化的段

.ebss

全局与静态变量

RAM

.stack

堆栈空间

低64K字的RAM

.esysmem

Farmalloc函数的存储空间

RAM

  • (1)已初始化的段:.text,.cinit,.const,.econst,.pinit和.switch

.vectors:存放中断向量表。

.text:所有可以执行的程序代码和常量。

.cinit:存放程序中的变量初值和常量。

.const:包含字符串常量、浮点常量以及初始化的全局变量和静态变量(由const声明)的初始化和说明。

.econst:包含字符串常量和初始化的全局变量和静态变量(由far const声明)的初始化和说明。

.pinit:全局构造器(C++)程序列表。

.switch:包含switch声明的跳转地址列表。

 

  • (2)非初始化的段:.bss,.ebss,.stack,.sysmem,和.esysmem

在执行过程中可以被操作和改变,只有在它们被程序调用时才会分配响应的值。

.bss:为程序中全局变量和静态变量保留的空间,在程序上电时.cinit空间中的数据复制出来并存储在.bss空间中。

.ebss:为使用大寄存器模式时的全局变量和静态变量(由far声明)预留的空间,在程序上电时,cinit空间中的数据复制出来并存储在.ebss中。

.stack:为系统堆栈保留的空间,用于和函数传递变量或为局部变量分配空间。

.sysmem:为动态存储分配保留的空间。如果有宏函数,此空间被宏函数占用,如果没有的话,此空间保留为0。

.esysmem:为动态存储分配保留的空间。如果有far函数,此空间被相应的占用,如果没有的化,此空间保留为0。

  • 3.链接代码与存储单元的3个步骤

  • 定义存储单元的不同区域(片上SRAM、Flash或者外部存储器),需要注意使用外部存储器时,需要使用外部存储器接口XINTF。
  • 定义段与存储器区域的关联关系。
  • 进行.obj文件与.cmd文件的链接。

链接器将输入文件中的每一个段链接起来,然后根据.cmd文件中MEMORY与SECTIONS命令的参数,将相应位置、长度的存储空间分配给段。

如果某文件例如.text很大时,编译显示超过内存范围,可以查看.map文件确定每个存储单元使用情况(或者每个变量等的地址及占用的存储空间);解决方法是:可以将其放入两个存储段,使用">>"及“|”将两个存储段。

例如:

MEMORY{

      PAGE0

              DARAM4: o = 0x18000  l = 0x02000

              DARAM5: o = 0x1A000  l = 0x02000

}

SECTIONS{

       .text:{*(.text)}       >> DARAM4|DARAM5

}

参考:1.网络;2.符晓, 朱洪顺《TMS320F2833x DSP应用开发与实践》背景航空航天大学出版社2013

猜你喜欢

转载自blog.csdn.net/sinat_37710872/article/details/82425299
今日推荐