cmd文件 c语言的段,对于TMS320F2812的CMD文件的理解

1.COFF格式

要谈CMD文件,首先不可避免的要谈下COFF格式,COFF格式是通用目标文件格式(Common Object File

Format)的缩写,它是一种流行的二进制可执行文件格式,在DSP里二进制可执行文件包括库文件(.lib)、目标文件(.obj)和最终可执行文件(.out)。详细的COFF格式文件包括段头、可执行代码、初始化数据、可重定位信息、行号入口、符号表、字符串。对于DSP的C语言编程我们只需要了解定义段和给段分配空间即可。采用COFF格式更利于我们对其进行模块化编程,我们可以自由的把哪些段分配到哪些空间。

2.Section

(1)其次,在编写CMD文件得时候要碰到SectionS命令,SectionS命令的英文理解就有区域的意思,我们利用SectionS来将目标文件的代码放到指定的区域中。SectionS目标文件中最小的单位我们称之为块,一个块就是最终在存储器映像中占据连续空间的一段代码或者数据。COFF文件格式默认有三个块:

.text 存放可执行代码;

.data 存放已初始化数据;

.bss 为未初始化数据留下的保留空间。

(2)汇编器对块的处理和设置

未初始化块的设置:

.bss 变量存放空间;

.usect 用户自定义的未初始化段;

初始化块的设置:

.text 汇编指令代码

.data 常数数据(比如对变量的初始化数据)

.sect 用户自定义的已初始化段

.asect 类似于.sect,多了绝对地址定位功能,一般不用

(3)C语言对块得的设置和处理

未初始化块(data)

.bss 存放全局和静态变量

.ebss 长调用的.bss(超过了64K地址限制)

.stack 存放C语言的栈

.sysmem 存放C语言的堆

.esysmem 长调用的.sysmem(超过了64K地址限制)

初始化块

.text 可执行代码和常数(program)

.switch switch语句产生的常数表格(program/低64K数据空间)

.pinit Tables for global constructors (C++)(program)

.cinit 用来存放对全局和静态变量的初始化常数值(program)

.const 全局和静态的const变量初始化值和字符串常数,(data)

.econst 长.const(可定位到任何地方)(data)

(4)C语言自定义块

#pragma DATA_SECTION(函数名或者全局变量名,“用户自定义在数据空间的段名”);

#pragma CODE_SECTION(函数名或者全局变量名,“用户自定义在程序空间的段名”);

必须注意:不能在函数体内声明,必须在定义和使用前声明。#pragma可以阻止对未调用的函数的优化(优化我也不太理解)。

3.2812的CMD文件

(1)在CMD文件中有两个伪指令MEMORY和SECTIONS,其中SECTIONS的用法在上面已经有了介绍,就是将生成的代码或者数据分配到指定的存储器的映射空间去。哪里是映射空间呢,这个就是由MEMORY这个伪指令来定义的,它的作用就是对整个存储器进行分区,然后给每个存储器进行命名,DSP只认物理地址(在我的第一篇日志里已经详细阐述了)。下面先写下这两个伪指令的语法格式:

MEMORY {

PAGE 0: name1[(attr)]origin=constant,

length=constant;

PAGE n: name1[(attr)]origin=constant,

length=constant;}

PAGE

n中页号的最大值是255,每个PAGE代表一个完全独立得地址空间,通常n=0为数据空间,n=1为程序空间,name是对存储区间命名,attr规定了存储器得属性,R-读,W-写,一般我们不写的 a4c26d1e5885305701be709a3d33442f.png ,origin,起始地址,length,该存储区间的大小。

SECTIONS{

Name:[property,property,…]

Name:[property,property,…]

Name:[property,property,…]}

Name:源程序中的段名。如.text,Property:段的属性参数。一个段的属性参数包括下列五种:

(1)Load allocation,由它定义将输出段加载到存储器中的什么位置。

语法:load:

>allocation (allocation是将逻辑段定位的地址说明)

例如: .text: load=0x1000 ;将输出段定位到一个特定的地址

.text: load>ROM ;将输出段定位到命名为ROM的存储区

.text: align=0x80 ;关键词align规定输出段.text定位到从地址边界0x80开始

.text: block(128) ;关键词bolck规定段必须在两个地址边界之内,如果段太

;大,就从一个地址边界开始

.text: PAGE0 ;将输出段定位到PAGE0

如果输出段只定位一个位置,帽可省去关键字load。如:.text: >ROM

如果要用到一个以上参数,可以将它们排成一行。如:.text: >ROM align 16 PAGE 2

或.text: load(ROM align(16) PAGE(2))

(地址边界是2的N次方幂的地址,如地址边界定为16,则其地址为xxx0h。)

(2)Run allocation,由它定义输出段在存储器的什么位置开始运行。

语法:run=allocation或run>allocation

链接器为每个输出段在目标存储器中分配两个地址:加载地址和执行地址。通常这两个地址是相同的。但如要先将程序加载到ROM,然后在RAM中以较快的速度运行。则可两次定位,如:

.fir: load=ROM,run=RAM

(3)Input sections,由它定义哪些输入段组成输出段。

语法:{input_sections}

.text: {*(.text)}

这样就把所有的.text段链接成.text段输出。也可以明确的用文件名和段名来确定输入段:

.text:

{

F1.obj

(.text,sect) ;链接F1.obj的.text、.sect段

F2.obj

(sect) ;

F3.obj ;链接f3.obj的所有段

}

(4)Section type,用它为输出段定义特殊形式的标志

语法:Type=COPY、Type=

DSECT、Type=NOLOAD

(5)Fill value,当初始化段中存在未初始化的存储区间时,对其填充一指定值。

语法:fill:

value 或name:…{…}=value

4.2812的CMD文件的编写

下面就来谈谈我对2812在写CMD文件的时候的一点理解,不足的地方希望各位看官拨冗指正

a4c26d1e5885305701be709a3d33442f.png 。

(1)片内存储器分区MEMORY

先翻开相关芯片的存储空间的资料,然后分配一下你得程序存储空间和数据存储空间,即PAGE0和PAGE1,程序存储空间里通常放XINTF的ZONE0,1,2,6,7FLASHA-J,OPT,H0,bootROM,其中BOOTROM和XINTF得ZONE7是复用得,在不同得模式下选取不同的方式,MP/MC=0----BOOTROM,MP/MC=1----XINTFZONE7,在片内数据空间上定义各个存储器,这是也可以翻开你的书本,查下每章开头,一般都有这一章所涉及的所以的寄存器的地址,然后根据这些地址分配一下存储的单元的起始地址和空间的大小。

(2)SECTIONGS分块

这里举一个例子阐述一下分块的方法,例如我们在数据存储空间定义了SYSTEM块,主要就是给系统的时钟、看门狗、锁存器等分的一个空间,这个空间的大小是0x0020H,也就是10进制得32个字节单元,为什么要分32个字节单元呢,在书上我们可以查的系统得这一部分所对应的寄存器的名称和寄存器的字节数如下:

Reserved:10;HISPCP:1;LOSPCP:1;PCLCR:1;Reserved:1;LPMCR0:1;LPMCR1:1;Reserved:1;PLLCR:1;SCSR:1;WDCNTR:1;

Reserved:1;WDKEY:1;Reserved:3;WDCR:1;Reserved:6;计算一下,整个的存储器空间的大小是10+1+1+1+1+1+1+1+1+1+1+1+1+3+1+6=32.这就是为什么是32个字节的原因。记住,此时这一块的名字是SYSTEM(当然你也可以另行定义)。在SECTIONS中我们定义输出段的名字是SysCtrlRegsFile,其指向的就是SYSTEM.即

SysCtrlRegsFile:>SYSTEM,PAGE0

然后我们在自己的头文件中定义结构体和联合体的时候,例如定义了一个SYSTEM_REGS的结构体,里面包含了系统的控制寄存器的联合体或者结合体,可以这么写:

struct SYSTEM_REGS

{

Unit32 Reserved:10;

union HISPCP_REGS

HISPCP;

union LOSPCP_REGS

LOSPCP;

union PCLKER_REGS

PCLKER;

Unit32 Reserved:1;

union LPMCR0_REGS LPMCR0;

union  LPMCR1_REGS LPMCR1;

Unit32 Reserved:1;

union PLLCR_REGS PLLCR;

union SCSR_REGS SCSR; 貌似这个是不用定义联合体的,Unit32 SCSR:1;

union WDCNTR_REGS WDCNTR;

Unit32 Reserved:1;

union WDKEY_REGS WDKEY;

Unit32 Reserved:3;

union WDCR_REGS WDCR;

Unit32 Reserved:6;

}SysCtrlRegsFile;

这里面得联合体都有其自己的定义,例如PLLCR_REGS

struct PLLCR_BITS

{

Unit16 DIV:4;

Unit16 Reserved:12;

};

union PLLCR_REGS{

Unit16 all;

struct PLLCR_BITS bit;

};

这样我们要对PLLCR寄存器操作得时候就只需这么写:SysCtrlRegsFile.PLLCR.all=0xXXXX;或者SysCtrlRegsFile.PLLCR.bit.DIV=0xXXXX;bit是结构体的一个变量 a4c26d1e5885305701be709a3d33442f.png ,相信C语言得结构体和联合体(也叫共用体)大家都学得不比偶差吧。对其操作过程就是自动得找到了SysCtrlRegsFile对应得那片空间0x00007010-0X0x702F,然后PLLCR就是就是里面的第18个空间即0x00007021,相信这么理解大家都应该明白了撒。所有的寄存器都是这样写得哦。 a4c26d1e5885305701be709a3d33442f.png 。

成功源于共享!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/552612.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android点击事件的优先级,Android事件体系全面总结+实践分析,系列篇

前言在这一个月里,我利用闲余的时间看了下最近Android职业发展这块该怎么选择?这个问题各位大神的回答都非常透彻,相信对大家或多或少都在一定程度上有很大的帮助,今天在这里写这篇文章更多的是想以我开发十年的工作经历&#xff…

android各组件翻译,Android App框架指南(译文)

该系列文章是对Android推出的架构组件相关文章,按作者自己理解来翻译的,同时标记有作者自己一些简单笔记。如果读者发现文中有翻译不准确的地方,或者理解错误的地方,请不吝指教。源自Android官方Guide to app architecturel princ…

鸿蒙手机是个噱头,华为鸿蒙不是谈判噱头 必要时会应用手机当中!

7月30日,华为2019年上半年财报发布会上,华为董事长梁华在接受媒体采访时回应称,“鸿蒙”系统不是用来应对与美国谈判的噱头。今年5月,美国商务部将华为列入“实体清单”后不久,华为一系列“备胎”方案开始浮出水面&…

360浏览器html5无法播放,win7系统360浏览器播放不了视频的解决方法

今天和大家分享一下win7系统360浏览器播放不了视频问题的解决方法,在使用win7系统的过程中经常不知道如何去解决win7系统360浏览器播放不了视频的问题,有什么好的办法去解决win7系统360浏览器播放不了视频呢?小编教你只需要 1、视频无法正常…

html设置数字显示位数,数字万用表的显示位数和精度

数字万用表的显示位数和精度今天,我们来聊一聊数字万用表的位数和精度,到底什么是四位半?分辨率到底是哪个数?万用表的精度要如何计算?万用表的显示位数计数显示:万用表的显示位数范围。位数显示&#xff1…

w7提示无法关闭计算机,win7关不了机怎么回事?老司机教你怎么解决电脑关不了机...

win10系统的到来,慢慢的曾经称霸多年的xp已经退出了系统的舞台了,逐渐的win7也将重演历史,不过说到这个win7系统可以说是微软革命性的系统之一,其稳定、友好的界面,受到广大用户的拥戴,不过win7也有一些让人…

杭州招聘计算机专业毕业生,毕业季必看!杭州高校毕业生就业情况:这些专业最吃香!这个岗位最缺人!...

原标题:毕业季必看!杭州高校毕业生就业情况:这些专业最吃香!这个岗位最缺人!夏天,就是毕业的季节有一群人要离开校园,走上社会也有一群人要面临填志愿、选专业在杭州,什么专业最热门…

澳国立计算机录取分数,澳洲出国:2018年澳洲国立大学对高考成绩的本科录取分数线(多图)...

大师兄留学网(微信公众号:留学申请Free)是一支免费申请澳大利亚,新西兰,泰国,新加坡,马来西亚的零中介平台。大师兄留学网(微信号:Betty8990)在申请澳洲方面,有办理留学经验超过十年的学长学姐&…

寻仙手游维护公告服务器停服更新,寻仙手游3月1日停服更新公告 更新内容分享...

原标题:寻仙手游3月1日停服更新公告 更新内容分享在寻仙手游中,为了让玩家们更好的体验游戏。寻仙手游将于3月1日对游戏进行停服更新,本次更新新增了哪些新内容,今天小编就给大家带来寻仙手游3月1日停服更新公告的详细内容。寻仙手…

王者荣耀8月15日服务器维护,王者荣耀8月15日维护ios更新不了解 王者荣耀8月15日维护ios更新不了解决办法_蚕豆网新闻...

王者荣耀8月15日进行了维护更新,这次版本更新比较大,有新英雄马超等内容。但是维护完后不少玩家发现ios更新不了。大版本更新ios就很容易出现更新失败的情况,ios更新失败原因是什么?更新不了怎么解决?王者荣耀8月15日ios更新不了怎么办?第…

崩坏3服务器故障 临时维护,崩坏3 11.5游戏故障处理及补偿说明

崩坏3 11.5游戏故障补偿什么时候发?介绍了11.5游戏故障处理及补偿说明,希望这篇文章能够帮助到崩坏3的玩家!游戏介绍:崩坏3是由同名漫画改编的游戏作品,延续了崩坏学园2中的崩坏世界观,人气角色琪亚娜、雷电…

易语言通过服务器发送文件,易语言服务器与客户端发送文件

易语言服务器与客户端发送文件 内容精选换一换PL/pgSQL是一种可载入的过程语言。用PL/pgSQL创建的函数可以被用在任何可以使用内建函数的地方。例如,可以创建复杂条件的计算函数并且后面用它们来定义操作符或把它们用于索引表达式。SQL被大多数数据库用作查询语言。…

服务器将office转pdf文件,Windows服务-Office转PDF文件

一. 应用场景开发一个课件在线学习功能,要求将WORD, EXCEL, PPT类型课件可在线打开学习;最初设想使用第三方office插件,无奈价格太高放弃使用;我们最终的方案是:利用office自身的另存为功能,在服务器将上传…

最拼爹的css属性:z-index失效情况记录

最近自己用angular封装了一个多级下拉菜单的控件,使用过程中发现一个奇怪的bug 第一反应是菜单z-index太小,被覆盖了,结果设置成9999都没有效果。 调试样式后发现,是因为引用菜单控件的时候,父元素的position为fixed,右边控件的position为relative,而菜单父元素没有设置…

ubuntu nginx添加站点配置失效处理

最近开始接触阿里云服务器,一步步开始自己配置,记录下自己的一步一坑: nginx安装很简单,apt-get install nginx 成功后就可以打开默认站点 nginx配置文件在/etc/nginx目录下的nginx.conf 查看里面的文件内容可以知道&#xff0…

中用BBP公式计算_如何计算基础代谢率

了解基础代谢率(BMR)以后,可以知道身体减重、保持重量或增重时需要多少卡路里。基础代谢是身体休息的时候用掉的能量,即便没有动,身体还是在使用能量,维持体温、输送血液、呼吸、消化食物等等。基础代谢可以…

把类成员改成指针_如果类中存在管理其他类对象的指针,通过析构函数释放它们...

C.33: If a class has an owning pointer member, define a destructorC.33:如果类包含拥有所有权的指针成员,定义析构函数Reason(原因)An owned object must be deleted upon destruction of the object that owns it.从属对象必须通过拥有该对象的所有者类的析构函…

MySQL 服务无法启动--服务没有报告任何错误 ---Failed to find valid data directory.

系统重装后重新安装mysql环境,各种踩坑。服务无法启动 mysqld --console 查看详细错误:Failed to find valid data directory 发现mysql目录没有data文件夹,创建后问题依旧。 移除mysql, mysqld -remove mysql 重新初始化 mys…

hadoop fs命令无法使用_Hadoop从入门到入土(三)HDFS集群简单维护及JAVA客户端连接HDFS...

集群简单维护查看日志上篇我们搭建了集群,并且完成了hdfs的搭建,但在我的linux02和linux03上,发现一个问题,我启动了datanode之后,开始进程还在,一会就自己消失了,这是为什么呢?(如下…

c++ 函数返回空_Python all() 函数

all() 函数用于判断给定的可迭代参数 iterable 中的所有元素是否都为 TRUE,如果是返回 True,否则返回 False。元素除了是 0、空、None、False 外都算 True。语法all(iterable) # iterable -- 元组或列表。示例>>> all([a, b, c, d]) # 列表li…