分享更有价值
被信任是一种快乐

Linux中cmd文件的作用是什么

文章页正文上

这篇文章主要介绍“Linux中cmd文件的作用是什么”,在日常操作中,相信很多人在Linux中cmd文件的作用是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux中cmd文件的作用是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧! 在Linux中,cmd文件即链接命令文件,是存放链接器的配置信息的,可简称为命令文件;cmd文件的作用是指明如何链接程序的。cmd文件由MEMORY和SECTIONS两部分组成:MEMERY用于定义每个存储器块的名字、起始地址和长度;SECTIONS主要用于描述哪个段映射到了哪段存储空间。cmd文件即链接命令文件(Linker Command Files),以后缀.cmd结尾。CMD的专业名称叫链接器配置文件,是存放链接器的配置信息的,我们简称为命令文件。从其名称可以看出,该文件的作用是指明如何链接程序的。那么我们知道,在编写TI DSP程序时,是可以将程序分为很多段,比如text、bss等,各段的作用均不相同。实际在片中运行时,所处的位置也不相同。比如text代码一般应该放在flash内,而bss的变量应该放在ram内。等等。但是对于不同的芯片,其各存储器的起止地址都是不一样的,而且,用户希望将某一段,尤其是自定义段,放在什么存储器的什么位置,这也是链接器不知道的。为了告诉链接器,即将使用的芯片其内部存储空间的分配和程序各段的具体存放位置,这就需要编写一个配置文件,即CMD文件了。cmd文件由MEMORY(即:内存)和SECTIONS(即:段)两部分组成。MEMERY用于定义每个存储器块的名字、起始地址和长度。SECTIONS主要用于描述哪个段映射到了哪段存储空间。MEMORY中又可分为PAGE0(程序存储空间)和PAGE1(数据存储空间),PAGE(即:帧)。上文所提及的段,又可分为两大类:已初始化的段和未初始化的段。已初始化的段含有真实的指令和数据,存放于程序存储空间。未初始化的段只是保留变量的地址空间,未初始化的段并不具有真实的内容,在程序运行过程中才向变量内写数据进去,存放于数据存储空间。C语言中,有许多定义好的段,如“.text”,“.const”,“.system”。对于这些定义好的段,在网上有许多关于他们的讲解,故这里笔者不再赘述。本文接下来会给读者介绍作为用户,来自己定义段的方法。cmd文件中可以写上注释,用”/*”和“*/”,包围起来,但不允许使用“//”,这点与c语言不同。编写cmd文件我们需要借助两条伪指令MEMORY和SECTIONS(必须大写)。MEMORY和SECTION的语法可在自行网上查找,本文将结合具体例子对MEMORY和SECTION中的内容进行讲解。结合笔者使用的F28335的cmd文件对MEMORY进行讲解。

MEMORY
{
PAGE0:/*ProgramMemory*/
/*Memory(RAM/FLASH/OTP)blockscanbemovedtoPAGE1fordataallocation*/

ZONE0:origin=0x004000,length=0x001000/*XINTFzone0*/
RAML0:origin=0x008000,length=0x001000/*on-chipRAMblockL0*/
RAML1:origin=0x009000,length=0x001000/*on-chipRAMblockL1*/
RAML2:origin=0x00A000,length=0x001000/*on-chipRAMblockL2*/
RAML3:origin=0x00B000,length=0x001000/*on-chipRAMblockL3*/
ZONE6:origin=0x0100000,length=0x100000/*XINTFzone6*/
ZONE7A:origin=0x0200000,length=0x00FC00/*XINTFzone7-programspace*/
FLASHH:origin=0x300000,length=0x008000/*on-chipFLASH*/
FLASHG:origin=0x308000,length=0x008000/*on-chipFLASH*/
FLASHF:origin=0x310000,length=0x008000/*on-chipFLASH*/
FLASHE:origin=0x318000,length=0x008000/*on-chipFLASH*/
FLASHD:origin=0x320000,length=0x008000/*on-chipFLASH*/
FLASHC:origin=0x328000,length=0x008000/*on-chipFLASH*/
FLASHA:origin=0x338000,length=0x007F80/*on-chipFLASH*/
CSM_RSVD:origin=0x33FF80,length=0x000076/*PartofFLASHA.Programwithall0x0000whenCSMisinuse.*/
BEGIN:origin=0x33FFF6,length=0x000002/*PartofFLASHA.Usedfor"boottoFlash"bootloadermode.*/
CSM_PWL:origin=0x33FFF8,length=0x000008/*PartofFLASHA.CSMpasswordlocationsinFLASHA*/
OTP:origin=0x380400,length=0x000400/*on-chipOTP*/
ADC_CAL:origin=0x380080,length=0x000009/*ADC_calfunctioninReservedmemory*/

IQTABLES:origin=0x3FE000,length=0x000b50/*IQMathTablesinBootROM*/
IQTABLES2:origin=0x3FEB50,length=0x00008c/*IQMathTablesinBootROM*/
FPUTABLES:origin=0x3FEBDC,length=0x0006A0/*FPUTablesinBootROM*/
ROM:origin=0x3FF27C,length=0x000D44/*BootROM*/
RESET:origin=0x3FFFC0,length=0x000002/*partofbootROM*/
VECTORS:origin=0x3FFFC2,length=0x00003E/*partofbootROM*/

PAGE1:/*DataMemory*/
/*Memory(RAM/FLASH/OTP)blockscanbemovedtoPAGE0forprogramallocation*/
/*RegistersremainonPAGE1*/

BOOT_RSVD:origin=0x000000,length=0x000050/*PartofM0,BOOTromwillusethisforstack*/
RAMM0:origin=0x000050,length=0x0003B0/*on-chipRAMblockM0*/
RAMM1:origin=0x000400,length=0x000400/*on-chipRAMblockM1*/
RAML4:origin=0x00C000,length=0x001000/*on-chipRAMblockL1*/
RAML5:origin=0x00D000,length=0x001000/*on-chipRAMblockL1*/
RAML6:origin=0x00E000,length=0x001000/*on-chipRAMblockL1*/
RAML7:origin=0x00F000,length=0x001000/*on-chipRAMblockL1*/
ZONE7B:origin=0x20FC00,length=0x000400/*XINTFzone7-dataspace*/
FLASHB:origin=0x330000,length=0x008000/*on-chipFLASH*/
}

可以看到MEMORY中通常包含PAGE0和PAGE1,PAGE0中的RAML0代表起始地址为0x008000,存储空间长度为0x001000的存储空间。同理可知其他存储空间名称所代表的含义。对照TI28335芯片数据手册(仅截取了部分)可以看到,以上cmd文件的编写是基于TI28335芯片数据手册内存映射一节所编写的。我们也可参考芯片数据手册上的内存映射一节进行cmd文件的编写。接下来,笔者对SECTION所包含的内容进行讲解,同样以F28335的cmd文件为例

SECTIONS
{

/*Allocateprogramareas:*/
.cinit:>FLASHAPAGE=0
.pinit:>FLASHA,PAGE=0
.text:>FLASHAPAGE=0
codestart:>BEGINPAGE=0
ramfuncs:LOAD=FLASHD,
RUN=RAML0,
LOAD_START(_RamfuncsLoadStart),
LOAD_END(_RamfuncsLoadEnd),
RUN_START(_RamfuncsRunStart),
LOAD_SIZE(_RamfuncsLoadSize),
PAGE=0

csmpasswds:>CSM_PWLPAGE=0
csm_rsvd:>CSM_RSVDPAGE=0

/*Allocateuninitalizeddatasections:*/
.stack:>RAMM1PAGE=1
.ebss:>RAML4PAGE=1
.esysmem:>RAMM1PAGE=1

/*InitalizedsectionsgoinFlash*/
/*ForSDFlashtoprogramthese,theymustbeallocatedtopage0*/
.econst:>FLASHAPAGE=0
.switch:>FLASHAPAGE=0

/*AllocateIQmathareas:*/
IQmath:>FLASHCPAGE=0/*MathCode*/
IQmathTables:>IQTABLES,PAGE=0,TYPE=NOLOAD

/*UncommentthesectionbelowifcallingtheIQNexp()orIQexp()
functionsfromtheIQMath.liblibraryinordertoutilizethe
relevantIQMathtableinBootROM(ThissavesspaceandBootROM
is1wait-state).Ifthissectionisnotuncommented,IQmathTables2
willbeloadedintoothermemory(SARAM,Flash,etc.)andwilltake
upspace,but0wait-stateispossible.
*/
/*
IQmathTables2:>IQTABLES2,PAGE=0,TYPE=NOLOAD
{

IQmath.lib(IQmathTablesRam)

}
*/

FPUmathTables:免费云主机、域名>FPUTABLES,PAGE=0,TYPE=NOLOAD

/*AllocateDMA-accessibleRAMsections:*/
DMARAML4:>RAML4,PAGE=1
DMARAML5:>RAML5,PAGE=1
DMARAML6:>RAML6,PAGE=1
DMARAML7:>RAML7,PAGE=1

/*Allocate0x400ofXINTFZone7tostoringdata*/
ZONE7DATA:>ZONE7B,PAGE=1

/*.resetisastandardsectionusedbythecompiler.Itcontainsthe*/
/*theaddressofthestartof_c_int00forCCode./*
/*WhenusingthebootROMthissectionandtheCPUvector*/
/*tableisnotneeded.Thusthedefaulttypeissethereto*/
/*DSECT*/
.reset:>RESET,PAGE=0,TYPE=DSECT
vectors:>VECTORSPAGE=0,TYPE=DSECT

/*AllocateADC_calfunction(pre-programmedbyfactoryintoTIreservedmemory)*/
.adc_cal:load=ADC_CAL,PAGE=0,TYPE=NOLOAD

}

可以看到SECTION中包含了各种段名。以“.text”为例 ,“.text” 为编译后生成的二进制指令代码段,可以看到,我们将“.text”中的内容分配到FLASHA中存储,而FLASHA位于MEMORY中的PAGE0。SECTION中的ramfuncs与28335的启动有关,其本质就是上电运行时通过“引导程序”把用户代码从FLASH中读出,保存在RAM中并在RAM中运行,从而解决ROM读写速度慢,难以满足高速智能芯片和RAM掉电丢失数据的问题。而知道了段的这些信息对于我们用户来说有什么用呢?最直接的用处就是,当编译器提示存储器内存不足时,我们可以通过对应的段名,找到对应的存储空间,修改其存储空间的大小来满足我们程序的需要。甚至我们可以通过自定义段名来存放我们的代码和数据。通过#pragma DATA_SECTION(函数名或全局变量名,”用户自定义在数据空间的段名”)或#pragma CODE_SECTION(函数名或全局变量名,”用户自定义在程序空间的段名”)可实现自定义段名,从而自由的分配存储空间。#pragma DATA_SECTION(用于变量)#pragma CODE_SECTION(用于函数)但使用以上指令时需注意:不能在函数体内声明必须在定义和使用前声明,#pragma可以阻止对未调用的函数的优化。下面结合实际使用例子来具体讲解:

#pragmaDATA_SECTION(FFT_output,"FFT_buffer1");
floatFFT_output[FFT_SIZE];

笔者声明了一个数据段,段名为FFT_buffer1,段的内容在变量FFT_ouput里。而声明后才定义变量FFT_output的大小。我们如果想要使用这个自定义的段,接下来我们还要在CMD文件的SECTION中指定FFT_buffer1的存储空间。

FFT_buffer1		:>RAML4,PAGE=1

通过以上几条语句,笔者实现了将变量的内容存放入指定的RAML4存储空间的操作。从上可以得出,当全局变量所占内存过大时,我们可以通过自定义段选择有所余裕的存储空间的方式,从而来解决内存不足的问题。到此,关于“Linux中cmd文件的作用是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注云技术网站,小编会继续努力为大家带来更多实用的文章!

相关推荐: 怎么保留win10安装win11

本篇内容主要讲解“怎么保留win10安装win11”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么保留win10安装win11”吧!1、在win10系统中,打开虚拟机软件,然后点击新建虚拟机。2、把下载好的win…

文章页内容下
赞(0) 打赏
版权声明:本站采用知识共享、学习交流,不允许用于商业用途;文章由发布者自行承担一切责任,与本站无关。
文章页正文下
文章页评论上

云服务器、web空间可免费试用

宝塔面板主机、支持php,mysql等,SSL部署;安全高速企业专供99.999%稳定,另有高防主机、不限制内容等类型,具体可咨询QQ:360163164,Tel同微信:18905205712

主机选购导航云服务器试用

登录

找回密码

注册