CCS中CMD檔案解析

2021-08-19 22:58:12 字數 3765 閱讀 2920

gel檔案中主要包含了pll、ddr等的初始化工作,具體可以看一下gel原始碼就明白了;cmd主要是用於定義記憶體的劃分,及資料、**等的存放位置。

cmd:command命令,顧名思義就是命令檔案指定儲存區

域的分配.2812的

cmd採用的是分頁制,

其中page0用於存放程式空間,而page1用於存放資料空間。

1.)#pragma ,code_section和data_section偽指令

#pragma data_section(funca,"dataa");  ------  

函式外宣告

將funca資料塊定位於使用者自定義的段"dataa"中  

------  需要在cmd中指定dataa段的實體地址

2.)memory和sections是命令檔案中最常用的兩偽指令。memory偽指令用

來表示實際存在目標系統中的可以使用的儲存器範圍,在這裡每個儲存器都有自

己的名字,起始位址和長度。sections偽指令是用來描述輸入端是如何組合到

輸出端內的。

cmd檔案裡有兩個基本的段:初始化段和非初始化段。

初始化段包含**和常

數等必須在dsp上電之後有效的數。故初始化塊必須儲存在如片內flash等非

遺失性儲存器中,非初始化段中含有在程式執行過程中才像變數內寫資料進去

,所以非初始化段必須鏈結到易失性儲存器中如ram。

已初始化的段:.text,.cinit,.const,.econst,..pinit和.switch..

.text:所有可以執行的**和常量 

.cinit:全域性變數和靜態變數的c初始化記錄

.const:包含字串常量和初始化的全域性變數和靜態變數(由const)的初始化

和說明 

.econst:包含字串常量和初始化的全域性變數和靜態變數(由far const)的初

始化和說明 

.pinit:全域性構造器(c++)程式列表

.switch:包含switch宣告的列表

非初始化的段

:.bss,.ebss,.stack,.sysmem,和esysmem

.(更好的理解就是,這些段就是儲存空間而已) 

.bss: 為全域性變數和區域性變數保留的空間,在程式上電時.cinit空間中的資料複製

出來並儲存在.bss空間中。 

.ebss:為使用大暫存器模式時的全域性變數和靜態變數預留的空間,在程式上電

時,cinit空間中的資料複製出來並儲存在.ebss中

.stack:為系統堆疊保留的空間,用於和函式傳遞變數或為區域性變數分配空間。 

.sysmem:為動態儲存分配保留的空間。如果有巨集函式,此空間被巨集函式占用,

如果沒有的話,此空間保留為0

.esysmem:為動態儲存分配保留的空間。如果有far函式,此空間被相應的占用,

如果沒有的化,此空間保留為0.

對於程式在flash中執行時,需要注意的: dsp在150m時鐘頻率下,flash中只能提供大約120m的時鐘頻率,所以有時候我們希望在ram中執行時間敏感或計算量很大的子程式(比如ad取樣)。但是我們所有**都放在flash中,這就必須在上電後將flash中的這段敏感程式複製到ram中執行,加快速度。這是在.cmd檔案就必須劃分一段用來設定ram的載入和執行位址。程式**如下: 

sections

cmd小技巧:

如果.text檔案很大將其放在一段放不下,需將其放到兩個程式段中

最長的乙個length=0x002000,也放不下時.可以這樣處理:

page 0 :

pramh0     : origin = 0x3f8002, length = 0x0014fe

l0ram      : origin = 0x008000, length = 0x001000

sections

.text: >>pramh0|l0ram

這樣就可以將.text檔案放在兩個定義段中。

檢視段的分配及使用情況.

map的鏈結器(儲存器)分配對映檔案,鏈結器

的map檔案描述以下內容:

通過map檔案可以檢視各段的分配情況,包括段的起始位址,

使用的位元組數等配合cmd檔案的使用,可確定各個段的使用情況,從而保證程式的正常執行

和最小的空間使用

visuallinker視覺化鏈結器

ti公司出品的dsp軟體開發環境ccs還提

供了一種視覺化生成儲存器配置檔案的工具:visuallinker視覺化鏈結器。如果程式原來包

含了乙個鏈結器命令檔案(.cmd檔案),則當建立視覺化鏈結檔案的時候,原來cmd檔案中的

記憶體配置仍然會被使用。如果讀者想修改記憶體配置,雙擊.rcp檔案就會在ccs中開啟視覺化

鏈結器的圖形介面,調整每個記憶體模組的大小,直到認為合適,然後只需要重新連編,程

序即可生成新的輸出檔案,重複上面的步驟,直到出現滿意的結果。

cmd主要是用來分配rom和ram空間用的,它告訴鏈結程式怎樣計算位址和分配空間.所以不同的晶元就有不同大小的rom和ram.放使用者程式的地方也不盡相同.所以要根據晶元進行修改.分兩部分.memory和sections.

memory是用來指定晶元的rom和ram的大小和劃分出幾個區間.

memory

(`page裡包含的區間名字與其後面的引數反映了該區間的起始位址和長度.)

sections

sections:在程式裡新增段名.***x(如.vectors.)用來指定該段名以下,另乙個段名以上的程式(屬於page0)或資料(屬於page1)放到「>」符號後的空間名字所在的地方。下面給出乙個簡單的例子:

memory

sections

> low page 0

.cinit : > low page 0

.switch : > low page 0

.const : > saram page 1

.data : > saram page 1

.bss : > saram page 1

.stack : > saram page 1

.sysmem : > saram page 1

}cmd檔案由三部分組成:(1) 輸入輸出定義;(2) memory命令;(3) section命令。

輸入/輸出定義:這一部分,可以通過ccs的「build option........」選單設定

。obj 鏈結的目標檔案

。lib 鏈結的庫檔案

。map 生成的交叉索引檔案

。out 生成的可執行**

memory命令:描述系統實際的硬體資源

section命令:描述「段」如何定位

下面給出乙個例子:

-c-o hello.out

-m hello.map

-stack 100

-l rts2xx.lib

memory

sections

儲存模型說明:

.cinit 存放程式中的變數初值和常量

.const 存放程式中的字元常量、浮點常量和用const宣告的常量

.switch 存放程式中switch語句的跳轉位址表

.text 存放程式**

.bss 為程式中的全域性和靜態變數保留儲存空間

.far 為程式中用far宣告的全域性和靜態變數保留空間

.stack 為程式系統堆疊保留儲存空間,用於儲存返回位址、函式間的引數傳遞、儲存區域性變數和儲存中間結果

.sysmem 用於程式中的malloc 、calloc 、和realoc 函式動態分配儲存空間.text可執行**

CCS5 5 CMD檔案小結

section目標檔案中最小單位稱為塊,乙個塊就是最終在儲存器映象中佔據連續空間的一段程式碼或資料。1 coff目標檔案包含三個預設的塊 text可執行程式碼 data已初始化資料 bss為未初始化資料保留的空間 2 彙編器對塊的處理 未初始化塊 bss 變數存放空間 usect 使用者自定義的未初...

鏈結命令檔案( cmd)解析

彙編器對段的處理是通過段偽指令來區別各個段,並將段名相同的語句彙編在一起。預備知識 鏈結器的主要任務是 根據鏈結命令檔案 cmd檔案 將乙個或多個coff目標檔案鏈結起來,生成儲存器映像檔案 map 和可執行檔案 out coff目標模組 c 不區分大小寫 h 不太重要 test.obj 輸入的目標...

CCS中gel檔案的作用

在開始學習dsp時,有時會遇到這樣的錯誤 data verification failed at address 0x8 x,仔細觀察會發現,出錯的位址出現在外部儲存器空間,此時程式還沒有執行,所以cpu的暫存器都還沒有配置,外部儲存器暫存器emif當然也沒有配置,所以在裝載中,編譯器找不到這個位址...