久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

Linux中cmd文件的作用是什么

共計(jì) 7317 個(gè)字符,預(yù)計(jì)需要花費(fèi) 19 分鐘才能閱讀完成。

這篇文章主要介紹“Linux 中 cmd 文件的作用是什么”,在日常操作中,相信很多人在 Linux 中 cmd 文件的作用是什么問(wèn)題上存在疑惑,丸趣 TV 小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”Linux 中 cmd 文件的作用是什么”的疑惑有所幫助!接下來(lái),請(qǐng)跟著丸趣 TV 小編一起來(lái)學(xué)習(xí)吧!

在 Linux 中,cmd 文件即鏈接命令文件,是存放鏈接器的配置信息的,可簡(jiǎn)稱(chēng)為命令文件;cmd 文件的作用是指明如何鏈接程序的。cmd 文件由 MEMORY 和 SECTIONS 兩部分組成:MEMERY 用于定義每個(gè)存儲(chǔ)器塊的名字、起始地址和長(zhǎng)度;SECTIONS 主要用于描述哪個(gè)段映射到了哪段存儲(chǔ)空間。

什么是 cmd 文件?

cmd 文件即鏈接命令文件(Linker Command Files),以后綴.cmd 結(jié)尾。

CMD 的專(zhuān)業(yè)名稱(chēng)叫鏈接器配置文件,是存放鏈接器的配置信息的,我們簡(jiǎn)稱(chēng)為命令文件。從其名稱(chēng)可以看出,該文件的作用是指明如何鏈接程序的。

那么我們知道,在編寫(xiě) TI DSP 程序時(shí),是可以將程序分為很多段,比如 text、bss 等,各段的作用均不相同。實(shí)際在片中運(yùn)行時(shí),所處的位置也不相同。比如 text 代碼一般應(yīng)該放在 flash 內(nèi),而 bss 的變量應(yīng)該放在 ram 內(nèi)。等等。但是對(duì)于不同的芯片,其各存儲(chǔ)器的起止地址都是不一樣的,而且,用戶(hù)希望將某一段,尤其是自定義段,放在什么存儲(chǔ)器的什么位置,這也是鏈接器不知道的。為了告訴鏈接器,即將使用的芯片其內(nèi)部存儲(chǔ)空間的分配和程序各段的具體存放位置,這就需要編寫(xiě)一個(gè)配置文件,即 CMD 文件了。

cmd 文件由 MEMORY(即:內(nèi)存)和 SECTIONS(即:段)兩部分組成。MEMERY 用于定義每個(gè)存儲(chǔ)器塊的名字、起始地址和長(zhǎng)度。SECTIONS 主要用于描述哪個(gè)段映射到了哪段存儲(chǔ)空間。MEMORY 中又可分為 PAGE0(程序存儲(chǔ)空間)和 PAGE1(數(shù)據(jù)存儲(chǔ)空間),PAGE(即:幀)。

上文所提及的段,又可分為兩大類(lèi):已初始化的段和未初始化的段。已初始化的段含有真實(shí)的指令和數(shù)據(jù),存放于程序存儲(chǔ)空間。未初始化的段只是保留變量的地址空間,未初始化的段并不具有真實(shí)的內(nèi)容,在程序運(yùn)行過(guò)程中才向變量?jī)?nèi)寫(xiě)數(shù)據(jù)進(jìn)去,存放于數(shù)據(jù)存儲(chǔ)空間。C 語(yǔ)言中,有許多定義好的段,如“.text”,“.const”,“.system”。對(duì)于這些定義好的段,在網(wǎng)上有許多關(guān)于他們的講解,故這里筆者不再贅述。本文接下來(lái)會(huì)給讀者介紹作為用戶(hù),來(lái)自己定義段的方法。

MEMORY 和 SECTION

cmd 文件中可以寫(xiě)上注釋?zhuān)?/* 和“*/”,包圍起來(lái),但不允許使用“//”,這點(diǎn)與 c 語(yǔ)言不同。

編寫(xiě) cmd 文件我們需要借助兩條偽指令 MEMORY 和 SECTIONS(必須大寫(xiě))。

MEMORY 和 SECTION 的語(yǔ)法可在自行網(wǎng)上查找,本文將結(jié)合具體例子對(duì) MEMORY 和 SECTION 中的內(nèi)容進(jìn)行講解。

結(jié)合筆者使用的 F28335 的 cmd 文件對(duì) MEMORY 進(jìn)行講解。

MEMORY
PAGE 0: /* Program Memory */
 /* Memory (RAM/FLASH/OTP) blocks can be moved to PAGE1 for data allocation */
 
 ZONE0 : origin = 0x004000, length = 0x001000 /* XINTF zone 0 */
 RAML0 : origin = 0x008000, length = 0x001000 /* on-chip RAM block L0 */
 RAML1 : origin = 0x009000, length = 0x001000 /* on-chip RAM block L1 */
 RAML2 : origin = 0x00A000, length = 0x001000 /* on-chip RAM block L2 */
 RAML3 : origin = 0x00B000, length = 0x001000 /* on-chip RAM block L3 */
 ZONE6 : origin = 0x0100000, length = 0x100000 /* XINTF zone 6 */ 
 ZONE7A : origin = 0x0200000, length = 0x00FC00 /* XINTF zone 7 - program space */ 
 FLASHH : origin = 0x300000, length = 0x008000 /* on-chip FLASH */
 FLASHG : origin = 0x308000, length = 0x008000 /* on-chip FLASH */
 FLASHF : origin = 0x310000, length = 0x008000 /* on-chip FLASH */
 FLASHE : origin = 0x318000, length = 0x008000 /* on-chip FLASH */
 FLASHD : origin = 0x320000, length = 0x008000 /* on-chip FLASH */
 FLASHC : origin = 0x328000, length = 0x008000 /* on-chip FLASH */
 FLASHA : origin = 0x338000, length = 0x007F80 /* on-chip FLASH */
 CSM_RSVD : origin = 0x33FF80, length = 0x000076 /* Part of FLASHA. Program with all 0x0000 when CSM is in use. */
 BEGIN : origin = 0x33FFF6, length = 0x000002 /* Part of FLASHA. Used for  boot to Flash  bootloader mode. */
 CSM_PWL : origin = 0x33FFF8, length = 0x000008 /* Part of FLASHA. CSM password locations in FLASHA */
 OTP : origin = 0x380400, length = 0x000400 /* on-chip OTP */
 ADC_CAL : origin = 0x380080, length = 0x000009 /* ADC_cal function in Reserved memory */
 
 IQTABLES : origin = 0x3FE000, length = 0x000b50 /* IQ Math Tables in Boot ROM */
 IQTABLES2 : origin = 0x3FEB50, length = 0x00008c /* IQ Math Tables in Boot ROM */ 
 FPUTABLES : origin = 0x3FEBDC, length = 0x0006A0 /* FPU Tables in Boot ROM */
 ROM : origin = 0x3FF27C, length = 0x000D44 /* Boot ROM */ 
 RESET : origin = 0x3FFFC0, length = 0x000002 /* part of boot ROM */
 VECTORS : origin = 0x3FFFC2, length = 0x00003E /* part of boot ROM */
 
PAGE 1 : /* Data Memory */
 /* Memory (RAM/FLASH/OTP) blocks can be moved to PAGE0 for program allocation */
 /* Registers remain on PAGE1 */
 
 BOOT_RSVD : origin = 0x000000, length = 0x000050 /* Part of M0, BOOT rom will use this for stack */
 RAMM0 : origin = 0x000050, length = 0x0003B0 /* on-chip RAM block M0 */
 RAMM1 : origin = 0x000400, length = 0x000400 /* on-chip RAM block M1 */
 RAML4 : origin = 0x00C000, length = 0x001000 /* on-chip RAM block L1 */
 RAML5 : origin = 0x00D000, length = 0x001000 /* on-chip RAM block L1 */
 RAML6 : origin = 0x00E000, length = 0x001000 /* on-chip RAM block L1 */
 RAML7 : origin = 0x00F000, length = 0x001000 /* on-chip RAM block L1 */
 ZONE7B : origin = 0x20FC00, length = 0x000400 /* XINTF zone 7 - data space */
 FLASHB : origin = 0x330000, length = 0x008000 /* on-chip FLASH */
}

可以看到 MEMORY 中通常包含 PAGE0 和 PAGE1,PAGE0 中的 RAML0 代表起始地址為 0x008000,存儲(chǔ)空間長(zhǎng)度為 0x001000 的存儲(chǔ)空間。同理可知其他存儲(chǔ)空間名稱(chēng)所代表的含義。

對(duì)照 TI28335 芯片數(shù)據(jù)手冊(cè)(僅截取了部分)可以看到,以上 cmd 文件的編寫(xiě)是基于 TI28335 芯片數(shù)據(jù)手冊(cè)內(nèi)存映射一節(jié)所編寫(xiě)的。我們也可參考芯片數(shù)據(jù)手冊(cè)上的內(nèi)存映射一節(jié)進(jìn)行 cmd 文件的編寫(xiě)。

接下來(lái),筆者對(duì) SECTION 所包含的內(nèi)容進(jìn)行講解,同樣以 F28335 的 cmd 文件為例

SECTIONS
 
 /* Allocate program areas: */
 .cinit :   FLASHA PAGE = 0
 .pinit :   FLASHA, PAGE = 0
 .text :   FLASHA PAGE = 0
 codestart :   BEGIN PAGE = 0
 ramfuncs : LOAD = FLASHD, 
 RUN = RAML0, 
 LOAD_START(_RamfuncsLoadStart),
 LOAD_END(_RamfuncsLoadEnd),
 RUN_START(_RamfuncsRunStart),
 LOAD_SIZE(_RamfuncsLoadSize),
 PAGE = 0
 
 csmpasswds :   CSM_PWL PAGE = 0
 csm_rsvd :   CSM_RSVD PAGE = 0
 
 /* Allocate uninitalized data sections: */
 .stack :   RAMM1 PAGE = 1
 .ebss :   RAML4 PAGE = 1
 .esysmem :   RAMM1 PAGE = 1
 
 /* Initalized sections go in Flash */
 /* For SDFlash to program these, they must be allocated to page 0 */
 .econst :   FLASHA PAGE = 0
 .switch :   FLASHA PAGE = 0 
 
 /* Allocate IQ math areas: */
 IQmath :   FLASHC PAGE = 0 /* Math Code */
 IQmathTables :   IQTABLES, PAGE = 0, TYPE = NOLOAD 
 
 /* Uncomment the section below if calling the IQNexp() or IQexp()
 functions from the IQMath.lib library in order to utilize the 
 relevant IQ Math table in Boot ROM (This saves space and Boot ROM 
 is 1 wait-state). If this section is not uncommented, IQmathTables2
 will be loaded into other memory (SARAM, Flash, etc.) and will take
 up space, but 0 wait-state is possible.
 */
 /*
 IQmathTables2 :   IQTABLES2, PAGE = 0, TYPE = NOLOAD 
 {
 
 IQmath.lib IQNexpTable.obj  (IQmathTablesRam)
 
 }
 */
 
 FPUmathTables :   FPUTABLES, PAGE = 0, TYPE = NOLOAD 
 
 /* Allocate DMA-accessible RAM sections: */
 DMARAML4 :   RAML4, PAGE = 1
 DMARAML5 :   RAML5, PAGE = 1
 DMARAML6 :   RAML6, PAGE = 1
 DMARAML7 :   RAML7, PAGE = 1
 
 /* Allocate 0x400 of XINTF Zone 7 to storing data */
 ZONE7DATA :   ZONE7B, PAGE = 1
 
 /* .reset is a standard section used by the compiler. It contains the */ 
 /* the address of the start of _c_int00 for C Code. /*
 /* When using the boot ROM this section and the CPU vector */
 /* table is not needed. Thus the default type is set here to */
 /* DSECT */ 
 .reset :   RESET, PAGE = 0, TYPE = DSECT
 vectors :   VECTORS PAGE = 0, TYPE = DSECT
 
 /* Allocate ADC_cal function (pre-programmed by factory into TI reserved memory) */
 .adc_cal : load = ADC_CAL, PAGE = 0, TYPE = NOLOAD
 
}

可以看到 SECTION 中包含了各種段名。以“.text”為例,“.text”為編譯后生成的二進(jìn)制指令代碼段,可以看到,我們將“.text”中的內(nèi)容分配到 FLASHA 中存儲(chǔ),而 FLASHA 位于 MEMORY 中的 PAGE0。

SECTION 中的 ramfuncs 與 28335 的啟動(dòng)有關(guān),其本質(zhì)就是上電運(yùn)行時(shí)通過(guò)“引導(dǎo)程序”把用戶(hù)代碼從 FLASH 中讀出,保存在 RAM 中并在 RAM 中運(yùn)行,從而解決 ROM 讀寫(xiě)速度慢,難以滿(mǎn)足高速智能芯片和 RAM 掉電丟失數(shù)據(jù)的問(wèn)題。

自定義段

而知道了段的這些信息對(duì)于我們用戶(hù)來(lái)說(shuō)有什么用呢?最直接的用處就是,當(dāng)編譯器提示存儲(chǔ)器內(nèi)存不足時(shí),我們可以通過(guò)對(duì)應(yīng)的段名,找到對(duì)應(yīng)的存儲(chǔ)空間,修改其存儲(chǔ)空間的大小來(lái)滿(mǎn)足我們程序的需要。甚至我們可以通過(guò)自定義段名來(lái)存放我們的代碼和數(shù)據(jù)。

通過(guò) #pragma DATA_SECTION(函數(shù)名或全局變量名, 用戶(hù)自定義在數(shù)據(jù)空間的段名) 或 #pragma CODE_SECTION(函數(shù)名或全局變量名, 用戶(hù)自定義在程序空間的段名) 可實(shí)現(xiàn)自定義段名,從而自由的分配存儲(chǔ)空間。

#pragma DATA_SECTION(用于變量)

#pragma CODE_SECTION(用于函數(shù))

但使用以上指令時(shí)需注意:不能在函數(shù)體內(nèi)聲明必須在定義和使用前聲明,#pragma 可以阻止對(duì)未調(diào)用的函數(shù)的優(yōu)化。

下面結(jié)合實(shí)際使用例子來(lái)具體講解:

#pragma DATA_SECTION(FFT_output,  FFT_buffer1 
float FFT_output[FFT_SIZE];

筆者聲明了一個(gè)數(shù)據(jù)段,段名為 FFT_buffer1,段的內(nèi)容在變量 FFT_ouput 里。而聲明后才定義變量 FFT_output 的大小。

我們?nèi)绻胍褂眠@個(gè)自定義的段,接下來(lái)我們還要在 CMD 文件的 SECTION 中指定 FFT_buffer1 的存儲(chǔ)空間。

FFT_buffer1 :   RAML4, PAGE = 1

通過(guò)以上幾條語(yǔ)句,筆者實(shí)現(xiàn)了將變量的內(nèi)容存放入指定的 RAML4 存儲(chǔ)空間的操作。

從上可以得出,當(dāng)全局變量所占內(nèi)存過(guò)大時(shí),我們可以通過(guò)自定義段選擇有所余裕的存儲(chǔ)空間的方式,從而來(lái)解決內(nèi)存不足的問(wèn)題。

到此,關(guān)于“Linux 中 cmd 文件的作用是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注丸趣 TV 網(wǎng)站,丸趣 TV 小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

正文完
 
丸趣
版權(quán)聲明:本站原創(chuàng)文章,由 丸趣 2023-07-12發(fā)表,共計(jì)7317字。
轉(zhuǎn)載說(shuō)明:除特殊說(shuō)明外本站除技術(shù)相關(guān)以外文章皆由網(wǎng)絡(luò)搜集發(fā)布,轉(zhuǎn)載請(qǐng)注明出處。
評(píng)論(沒(méi)有評(píng)論)
主站蜘蛛池模板: 青海省| 仁寿县| 句容市| 米泉市| 福鼎市| 饶河县| 镇平县| 武功县| 尼勒克县| 合肥市| 永年县| 安义县| 红河县| 云霄县| 临西县| 宜昌市| 城固县| 东乡族自治县| 海淀区| 时尚| 达州市| 平顶山市| 邵阳市| 绥中县| 泽库县| 巴彦县| 剑河县| 金塔县| 通城县| 博野县| 泰兴市| 安西县| 靖西县| 腾冲县| 湟中县| 新河县| 永胜县| 深泽县| 庆阳市| 清远市| 京山县|