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,一经查实,立即删除!

相关文章

w ndows7与XP哪个好,windows7和xp哪个好 windows7好用吗

经常可以在电脑百事各个QQ群中看到电脑爱好者朋友问各种各样的电脑问题,有的朋友问的问题特别搞笑,其实很多问题都问的等于没人能够被你满意答案,比如有人问过一些比较搞笑的问题,如谁能给介绍一个500G内存,800元的独立…

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

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

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

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

signature=27ba8feff228d8babc1d1762f8da4445,Embedding digital signatures into digital payloads

摘要:A file may be transferred from one processor-based system to another. The file may include executable binary data together with an integrated digital signature. Each time a receiving processor-based system boots, the digital signature is au…

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

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

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

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

计算机网络技术专业发展现状,计算机网络技术的发展现状和前景

摘 要:计算机和网络目前已经在我国社会得到普及化应用,对人们生活的方方面面和社会各项工作的开展都产生了革命性的巨大影响。但是,也不得不看到目前我国计算机网络技术发展中仍然存在一些问题,例如计算机网络技术创新性应用和开发…

计算机专业论文要交源代码吗,计算机毕业论文源代码.doc

计算机毕业论文源代码.doc计算机毕业论文源代码计算机毕业论文源代码:会计信息生产社会化仿真系统1.折旧年限表(company_zjnx)建表源程序:CREATE TABLE [dbo].[company_zjnx] ([cname] [char] (40) COLLATE Chinese_PRC_CI_AS NULL ,[obj_name] [char] (…

广西高职计算机网络技术,计算机网络技术专业考试大纲-广西职业技术学院.DOC...

计算机网络技术专业考试大纲-广西职业技术学院2011年广西职业技术学院面向中等职业学校毕业生对口招生考试《计算机网络技术》专业课考试大纲一.考试性质广西职业技术学院面向中等职业学校毕业生对口招生《计算机网络技术》专业测试是由已参加2011年普通高考报名的我…

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

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

r导出html怎么保存,做植物谱系图,用Phylomatic软件将网页中的输出结果拷贝到文本文件中, 并另存为phylo...

我是一个本科生,大四做毕设,要用到Phylomatic在线软件,我对计算机不是很熟,我的专业也只是环境科学,跟植物无关,所以对此非常不熟悉,用R做完plantlist后,再用Phylomatic在线软件&…

学计算机广东2B大学,2021年广东省较好的2B大学排名,广东2B大学排名出炉

广东省较好的2B大学排名,广东2B大学排名出炉广东2B大学排名:北京师范大学珠海分校珠海市外生源投档线文科达541分,理科达519分;广东外语外贸大学南国商学院投档线文科534分,理科513分;吉林大学珠海学院珠海市外生源投档线文科达531分&#xf…

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

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

sendmail发送html邮件,尝试使用sendmail发送/发送html电子邮件,但显示电子邮件的源代码...

我试图在PHP中发送HTML电子邮件,但它始终显示电子邮件程序中电子邮件的源代码。但它应该将html电子邮件呈现为html,而不是将源代码显示为电子邮件内容。尝试使用sendmail发送/发送html电子邮件,但显示电子邮件的源代码我把我的邮件是这样的&a…

计算机语言史话论文,【论文节选】自然语言处理发展历史。

说实话看完文章有点失望,作者带有一贯的学术吹嘘风,就像吹嘘云计算,物联网等等。谈到现状,只字不提问题,一句话“一旦自然语言处理的研究获得成功,那么机器将能够进行思考,人类将得到继工业革命…

vue开发跨平台应用

native script 开发android和ios的框架,js引擎和本地交互没有webview,更加高效 npm install -g nativescript ns create my-app --js ns create my-app --template typescript ns create my-app --template angular ns create my-app --template vue 编译 ns build android …

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

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

澳国立计算机录取分数,澳洲出国: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更新不了怎么办?第…