在Linux中,cmd文件即鏈接命令文件,是存放鏈接器的配置信息的,可簡稱為命令文件;cmd文件的作用是指明如何鏈接程序的。cmd文件由MEMORY和SECTIONS兩部分組成:MEMERY用于定義每個存儲器塊的名字、起始地址和長度;SECTIONS主要用于描述哪個段映射到了哪段存儲空間。
本教程操作環(huán)境:linux7.3系統(tǒng)、Dell G3電腦。
什么是cmd文件?
cmd文件即鏈接命令文件(Linker Command Files),以后綴.cmd結(jié)尾。
CMD的專業(yè)名稱叫鏈接器配置文件,是存放鏈接器的配置信息的,我們簡稱為命令文件。從其名稱可以看出,該文件的作用是指明如何鏈接程序的。
那么我們知道,在編寫TI DSP程序時,是可以將程序分為很多段,比如text、bss等,各段的作用均不相同。實際在片中運行時,所處的位置也不相同。比如text代碼一般應該放在flash內(nèi),而bss的變量應該放在ram內(nèi)。等等。但是對于不同的芯片,其各存儲器的起止地址都是不一樣的,而且,用戶希望將某一段,尤其是自定義段,放在什么存儲器的什么位置,這也是鏈接器不知道的。為了告訴鏈接器,即將使用的芯片其內(nèi)部存儲空間的分配和程序各段的具體存放位置,這就需要編寫一個配置文件,即CMD文件了。
cmd文件由MEMORY(即:內(nèi)存)和SECTIONS(即:段)兩部分組成。MEMERY用于定義每個存儲器塊的名字、起始地址和長度。SECTIONS主要用于描述哪個段映射到了哪段存儲空間。MEMORY中又可分為PAGE0(程序存儲空間)和PAGE1(數(shù)據(jù)存儲空間),PAGE(即:幀)。
上文所提及的段,又可分為兩大類:已初始化的段和未初始化的段。已初始化的段含有真實的指令和數(shù)據(jù),存放于程序存儲空間。未初始化的段只是保留變量的地址空間,未初始化的段并不具有真實的內(nèi)容,在程序運行過程中才向變量內(nèi)寫數(shù)據(jù)進去,存放于數(shù)據(jù)存儲空間。C語言中,有許多定義好的段,如“.text”,“.const”,“.system”。對于這些定義好的段,在網(wǎng)上有許多關于他們的講解,故這里筆者不再贅述。本文接下來會給讀者介紹作為用戶,來自己定義段的方法。
MEMORY和SECTION
cmd文件中可以寫上注釋,用"/*"和“*/”,包圍起來,但不允許使用“//”,這點與c語言不同。
編寫cmd文件我們需要借助兩條偽指令MEMORY和SECTIONS(必須大寫)。
MEMORY和SECTION的語法可在自行網(wǎng)上查找,本文將結(jié)合具體例子對MEMORY和SECTION中的內(nèi)容進行講解。
結(jié)合筆者使用的F28335的cmd文件對MEMORY進行講解。
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,存儲空間長度為0x001000的存儲空間。同理可知其他存儲空間名稱所代表的含義。
對照TI28335芯片數(shù)據(jù)手冊(僅截取了部分)可以看到,以上cmd文件的編寫是基于TI28335芯片數(shù)據(jù)手冊內(nèi)存映射一節(jié)所編寫的。我們也可參考芯片數(shù)據(jù)手冊上的內(nèi)存映射一節(jié)進行cmd文件的編寫。
接下來,筆者對SECTION所包含的內(nèi)容進行講解,同樣以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” 為編譯后生成的二進制指令代碼段,可以看到,我們將“.text”中的內(nèi)容分配到FLASHA中存儲,而FLASHA位于MEMORY中的PAGE0。
SECTION中的ramfuncs與28335的啟動有關,其本質(zhì)就是上電運行時通過“引導程序”把用戶代碼從FLASH中讀出,保存在RAM中并在RAM中運行,從而解決ROM讀寫速度慢,難以滿足高速智能芯片和RAM掉電丟失數(shù)據(jù)的問題。
自定義段
而知道了段的這些信息對于我們用戶來說有什么用呢?最直接的用處就是,當編譯器提示存儲器內(nèi)存不足時,我們可以通過對應的段名,找到對應的存儲空間,修改其存儲空間的大小來滿足我們程序的需要。甚至我們可以通過自定義段名來存放我們的代碼和數(shù)據(jù)。
通過#pragma DATA_SECTION(函數(shù)名或全局變量名,"用戶自定義在數(shù)據(jù)空間的段名")或#pragma CODE_SECTION(函數(shù)名或全局變量名,"用戶自定義在程序空間的段名")可實現(xiàn)自定義段名,從而自由的分配存儲空間。
#pragma DATA_SECTION(用于變量)
#pragma CODE_SECTION(用于函數(shù))
但使用以上指令時需注意:不能在函數(shù)體內(nèi)聲明必須在定義和使用前聲明,#pragma可以阻止對未調(diào)用的函數(shù)的優(yōu)化。
下面結(jié)合實際使用例子來具體講解:
#pragma DATA_SECTION(FFT_output, "FFT_buffer1"); float FFT_output[FFT_SIZE];
筆者聲明了一個數(shù)據(jù)段,段名為FFT_buffer1,段的內(nèi)容在變量FFT_ouput里。而聲明后才定義變量FFT_output的大小。
我們?nèi)绻胍褂眠@個自定義的段,接下來我們還要在CMD文件的SECTION中指定FFT_buffer1的存儲空間。
FFT_buffer1 : > RAML4, PAGE = 1
通過以上幾條語句,筆者實現(xiàn)了將變量的內(nèi)容存放入指定的RAML4存儲空間的操作。
從上可以得出,當全局變量所占內(nèi)存過大時,我們可以通過自定義段選擇有所余裕的存儲空間的方式,從而來解決內(nèi)存不足的問題。
相關推薦:《Linux視頻教程》
以上是Linux中cmd文件是什么的詳細內(nèi)容。更多信息請關注PHP中文網(wǎng)其他相關文章!

熱AI工具

Undress AI Tool
免費脫衣服圖片

Undresser.AI Undress
人工智能驅(qū)動的應用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover
用于從照片中去除衣服的在線人工智能工具。

Clothoff.io
AI脫衣機

Video Face Swap
使用我們完全免費的人工智能換臉工具輕松在任何視頻中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的代碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
功能強大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6
視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版
神級代碼編輯軟件(SublimeText3)

在CentOS上集成Postman應用可以通過多種方法來實現(xiàn),以下是詳細的步驟和建議:通過下載安裝包安裝Postman下載Postman的Linux版本安裝包:訪問Postman官方網(wǎng)站,選擇適用于Linux的版本進行下載。解壓安裝包:使用以下命令將安裝包解壓到指定目錄,例如/opt:sudotar-xzfpostman-linux-x64-xx.xx.xx.tar.gz-C/opt請注意將“postman-linux-x64-xx.xx.xx.tar.gz”替換為您實際下載的文件名。創(chuàng)建符號

【常見目錄說明】目錄/bin存放二進制可執(zhí)行文件(ls,cat,mkdir等),常用命令一般都在這里。/etc存放系統(tǒng)管理和配置文件/home存放所有用戶文件的根目錄,是用戶主目錄的基點,比如用戶user的主目錄就是/home/user,可以用~user表示/usr用于存放系統(tǒng)應用程序,比較重要的目錄/usr/local?本地系統(tǒng)管理員軟件安裝目錄(安裝系統(tǒng)級的應用)。這是最龐大的目錄,要用到的應用程序和文件幾乎都在這個目錄。/usr/x11r6?存放x?window的目錄/usr/bin?眾多

在PyCharm中設置解釋器的位置可以通過以下步驟實現(xiàn):1.打開PyCharm,點擊“File”菜單,選擇“Settings”或“Preferences”。2.找到并點擊“Project:[你的項目名]”,然后選擇“PythonInterpreter”。3.點擊“AddInterpreter”,選擇“SystemInterpreter”,瀏覽到Python安裝目錄,選中Python可執(zhí)行文件,點擊“OK”。設置解釋器時需注意路徑正確性、版本兼容性和虛擬環(huán)境的使用,以確保項目順利運行。

Java與其他編程語言的主要區(qū)別在于其“一次編寫,到處運行”的跨平臺特性。1.Java的語法接近C ,但去掉了容易出錯的指針操作,適合大型企業(yè)應用。2.與Python相比,Java在性能和大規(guī)模數(shù)據(jù)處理上更具優(yōu)勢。Java的跨平臺優(yōu)勢源于Java虛擬機(JVM),它能在不同平臺上運行相同的字節(jié)碼,簡化開發(fā)和部署,但需注意避免使用平臺特定API以保持跨平臺性。

了解Nginx的配置文件路徑和初始設置非常重要,因為它是優(yōu)化和管理Web服務器的第一步。1)配置文件路徑通常是/etc/nginx/nginx.conf,使用nginx-t命令可以查找并測試語法。2)初始設置包括全局設置(如user、worker_processes)和HTTP設置(如include、log_format),這些設置允許根據(jù)需求進行定制和擴展,錯誤配置可能導致性能問題和安全漏洞。

MySQL的安裝和配置可以通過以下步驟完成:1.從官方網(wǎng)站下載適合操作系統(tǒng)的安裝包。2.運行安裝程序,選擇“開發(fā)者默認”選項并設置root用戶密碼。3.安裝后配置環(huán)境變量,確保MySQL的bin目錄在PATH中。4.創(chuàng)建用戶時遵循最小權限原則并設置強密碼。5.優(yōu)化性能時調(diào)整innodb_buffer_pool_size和max_connections參數(shù)。6.定期備份數(shù)據(jù)庫并優(yōu)化查詢語句以提高性能。

Informix和MySQL均為廣受青睞的關系型數(shù)據(jù)庫管理系統(tǒng),它們在Linux環(huán)境下均表現(xiàn)優(yōu)異并得到廣泛應用。以下是對兩者在Linux平臺上的對比分析:安裝與配置Informix:在Linux上部署Informix需要下載對應的安裝文件,隨后依據(jù)官方文檔指引完成安裝及配置流程。MySQL:MySQL的安裝過程較為簡便,可通過系統(tǒng)的包管理工具(例如apt或yum)輕松實現(xiàn)安裝,并且網(wǎng)絡上有大量的教程和社區(qū)支持可供參考。性能表現(xiàn)Informix:Informix以卓越的性能和

參加VSCode線下技術交流活動的經(jīng)驗非常豐富,主要收獲包括插件開發(fā)的分享、實戰(zhàn)演示和與其他開發(fā)者的交流。1.插件開發(fā)的分享:了解了如何利用VSCode的插件API提升開發(fā)效率,如自動格式化和靜態(tài)分析插件。2.實戰(zhàn)演示:學習了如何使用VSCode進行遠程開發(fā),認識到其靈活性和擴展性。3.與開發(fā)者交流:獲取了優(yōu)化VSCode啟動速度的技巧,如減少啟動時加載的插件數(shù)量和管理插件加載順序??傊?,這次活動讓我受益匪淺,強烈推薦對VSCode感興趣的人參加。