天天看點

TI DSP處理器中CMD 檔案的那些事兒使用 CMD 檔案的檔案結構

如果從事 TI DSP 處理器開發,CMD 檔案一定是不可忽略的重要檔案。當然,CMD 檔案也并不是 DSP 處理器的專利,開發 TI ARM(不運作 HLOS 高階作業系統),MCU 等處理器也都會遇到 CMD 檔案。本文就以C6000 DSP CMD 檔案為例,給大家說說 CMD 檔案的那些事。

首先,需要知道 CMD 檔案到底是什麼檔案?

CMD 即Linker Command Files 指令連結檔案。CMD 發揮作用的階段是在我們程式開發的連結階段。即下圖 Linker 階段。

TI DSP處理器中CMD 檔案的那些事兒使用 CMD 檔案的檔案結構

需要注意的是英文 LinkerCommand Files 中的 Files 是複數,也就是說在一個 DSP 項目中,CMD 檔案可以不止一個。不論是否運作實時作業系統,都可以有多個 CMD 檔案,但是不同的 CMD 檔案中的内容不能有沖突,否則編譯工具鍊會報連結錯誤!

既然 CMD 檔案在連結階段發揮作用,那麼就需要知道編譯工具鍊在連結階段究竟做了些什麼?

n 配置設定段到目标系統可配置記憶體區域

n 重新定位符号和段并指派最終位址

n 解析不同檔案中未定義的外部引用

n 配置設定段到特定的記憶體區域

n 合并目标檔案段

n 定義或重定義連結時全局符号

說了這麼多,簡而言之連結過程主要是一些對符号和程式段記憶體配置設定的操作。而 CMD 檔案最主要的功能就是記憶體配置設定。

使用 CMD 檔案的檔案結構

CMD 檔案主要有三部分内容

1、連結選項

可以在 CMD 檔案修改連結選項,比如

-heap 0x1000

-stack 0x1000

這兩個參數是指定堆和棧的大小,這裡需要注意的是堆棧,雖然一般都放在一起描述,但它們可不是一回事。

-l../../../Library/Codec/h264hpvdec_ti.le66

還可以連結靜态庫(-l 小寫英文字母 L),這裡使用的是相對路徑。

2、MEMORY 指令 - 目标處理器記憶體區域描述

這一部分主要是描述目标處理器中記憶體區域,隻要是可通路的記憶體區域都可以在這裡描述,當然需要用到的記憶體空間要描述,不用到的可以不用描述。需要注意的是,這個記憶體描述僅在 CMD 檔案中有效,不會影響其它檔案,也不可以在其它檔案中引用。

文法

MEMORY

{

name 1 [( attr )] : origin = expression , length = expression [, fill = constant]

.

.

name n [( attr )] : origin = expression , length = expression [, fill = constant]

}

name 命名一段記憶體區域,長度 1 - 64 個字元,可以使用 A - Z,a - z,$,.以及 _。

attr 為這段記憶體區域指定 1 - 4 個屬性。可選參數。屬性限制對于段的配置設定。如果,不指定該參數即代表不限制該記憶體段屬性。有效的屬性有

R 記憶體區域可讀

W 記憶體區域可寫

X 記憶體區域包含可執行代碼

I 記憶體區域可被初始化

origin :指定記憶體區域起始位址,也可以寫作 origin,org 或 o。位址以位元組為機關的 32 位常量表達式,可以是十六進制、十進制或者八進制。

length: 指定記憶體區域長度,也可以寫作 length,len 或 l。可以是十六進制、十進制或者八進制。

fill :使用指定字元填充記憶體區域,也可以寫作fill 或 f。可選參數。填充字元為一個整數常量,可以是十六進制、十進制或者八進制。 fill 用于填充一段不用來配置設定段的記憶體區域。

位址操作可以使用的表達式,表達式的規則與标準 C語言一緻。

單目運算符 - ~ !

雙目運算符 * / % + -<<>> == = <<= >>= & | && ||

其它 START SIZE END 這三個關鍵字分别用于擷取引用記憶體區域的起始位址、大小及結束位址。

使用表達式描述位址的範例。
/********************************************************/
/* 範例*/
/********************************************************/
file1.obj file2.obj /* 輸入檔案 */
--output_file=prog.out /* 選項 */
#define ORIGIN 0x00000000
#define BUFFER 0x00000200
#define CACHE 0x0001000

MEMORY
{
FAST_MEM (RX): origin =ORIGIN + CACHE length = 0x00001000 + BUFFER
SLOW_MEM (RW): origin = end(FAST_MEM)length = 0x00001800 - size(FAST_MEM)
EXT_MEM (RX): origin = 0x10000000 length = size(FAST_MEM) - CACHE
}
           

3、SECTIONS 指令 - 配置設定程式段到記憶體

描述輸入段如何合并到輸出段;

定義可執行檔案中的輸出段;

指定輸出段放置到的記憶體區域;

允許重命名輸出段。

SECTIONS

{

name : [property [, property] [, property] … ]

name : [property [, property] [, property] … ]

name : [property [, property] [, property] … ]

}

加載配置設定:定義段被加載到的記憶體區域

文法: load = 區域 或 >區域

運作配置設定 :定義段運作的記憶體區域

文法: run = 區域 或 run > 區域

輸入段:定義用于組成輸出段的輸入段(目标檔案)

文法: { 輸入段 }

段類型:定義特定段标志

文法: type = COPY 或 type = DSECT 或 type = NOLOAD

填充值:定義用來填充未初始化區域(Hole)值

文法: fill = 值 或 名稱: [屬性= 值]

SECTIONS 指令範例
/**************************************************/
/* 範例*/
/**************************************************/
file1.obj file2.obj /* 輸入檔案 */
--output_file=prog.out /* 選項 */
SECTIONS
{
.text: load =EXT_MEM, run = 
.const: load =FAST_MEM
.bss: load =SLOW_MEM
.vectors: load =
{
t1.obj(.intvec1)
t2.obj(.intvec2)
endvec = .;
}
.data:alpha: align =
.data:beta: align =
}
           

結合前面的範例,最終的記憶體配置設定如下圖所示

TI DSP處理器中CMD 檔案的那些事兒使用 CMD 檔案的檔案結構

此外,有部分段由編譯器及程式設計語言(C++ / C / 彙編)定義,當然開發人員也可以自行定義段。

編譯工具建立的已初始化的程式段(EABI)

TI DSP處理器中CMD 檔案的那些事兒使用 CMD 檔案的檔案結構

編譯工具建立的未初始化的程式段(COFFABI 及 EABI)

TI DSP處理器中CMD 檔案的那些事兒使用 CMD 檔案的檔案結構

自行定義段名稱不能跟這些名稱沖突。

TI DSP處理器中CMD 檔案的那些事兒使用 CMD 檔案的檔案結構
TI DSP處理器中CMD 檔案的那些事兒使用 CMD 檔案的檔案結構

繼續閱讀