最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

【DSP學(xué)習(xí)筆記】CMD文件的講解

2023-01-27 15:22 作者:七草稀飯  | 我要投稿

一、前言

在筆者學(xué)習(xí)F28335的過程中,發(fā)現(xiàn)網(wǎng)上少有對于cmd文件的講解,而學(xué)習(xí)DSP,肯定是要編寫或修改cmd文件的。故筆者基于自己的學(xué)習(xí)經(jīng)驗,給出了自己對于cmd文件的理解。

在正式開始學(xué)習(xí)cmd文件之前,我們首先需要知道什么是cmd文件。cmd文件即鏈接命令文件(Linker Command Files),以后綴.cmd結(jié)尾。cmd文件用于DSP代碼的定位,由于DSP編譯器的編譯結(jié)果是未定位的,因此需要用戶自定義代碼存放和加載位置。而普通的單片機,編譯器自身會定位代碼地址,故編寫cmd文件,也是學(xué)習(xí)DSP的難點之一。

二、有關(guān)cmd文件的基礎(chǔ)知識

由于cmd文件是用戶用來分配DSP工程中ROM和RAM空間的,所以我們就不得不提一下存儲器的相關(guān)知識了。而各類存儲器基本都可以劃分為以下兩類:斷電后仍然能夠保存數(shù)據(jù)的叫做非易失性存儲器(ROM類),斷電后數(shù)據(jù)丟失的叫做易失性存儲器(RAM類)。故我們分配存儲空間時,就需要將需要永久保存的數(shù)據(jù)存儲到ROM中去,如程序代碼。而如果對讀寫速度要求更高或是暫存數(shù)據(jù),則選用RAM,如程序運行時,為了提高速度,就必須在RAM中運行。

DSP的片內(nèi)存儲器很多,用戶通過cmd文件來管理、分配系統(tǒng)里的存儲器資源。值得一提的是,只要沒有被TI占用的,用戶都可以全權(quán)支配,TI聲明的保留空間(Reserved或illegal)是芯片無法訪問的,分配資源時,不能涉及這些區(qū)域。

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)上有許多關(guān)于他們的講解,故這里筆者不再贅述。本文接下來會給讀者介紹作為用戶,來自己定義段的方法。

三、MEMORY和SECTION

cmd文件中可以寫上注釋,用"/*"和“*/”,包圍起來,但不允許使用“//”,這點與c語言不同。

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

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

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

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

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

芯片數(shù)據(jù)手冊

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

僅截取了部分

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

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

四、自定義段

而知道了段的這些信息對于我們用戶來說有什么用呢?最直接的用處就是,當(dāng)編譯器提示存儲器內(nèi)存不足時,我們可以通過對應(yīng)的段名,找到對應(yīng)的存儲空間,修改其存儲空間的大小來滿足我們程序的需要。甚至我們可以通過自定義段名來存放我們的代碼和數(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存儲空間的操作。

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

至此,關(guān)于CMD文件的相關(guān)基礎(chǔ)內(nèi)容筆者介紹完畢。

由于筆者水平有限,如有不足與錯誤之處,歡迎指出。

【DSP學(xué)習(xí)筆記】CMD文件的講解的評論 (共 條)

分享到微博請遵守國家法律
双流县| 抚远县| 新野县| 麻栗坡县| 石泉县| 井冈山市| 泸州市| 交城县| 始兴县| 拉孜县| 云和县| 玉屏| 宜川县| 石首市| 东乌珠穆沁旗| 高雄县| 汉源县| 兰考县| 河东区| 南充市| 富裕县| 托克逊县| 泸西县| 中宁县| 呈贡县| 万年县| 姚安县| 汤阴县| 博白县| 确山县| 句容市| 广州市| 霍林郭勒市| 崇左市| 榆树市| 大余县| 海林市| 剑河县| 罗甸县| 汤阴县| 余庆县|