这篇文章主要介绍“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”吧!1、在win10系统中,打开虚拟机软件,然后点击新建虚拟机。2、把下载好的win…