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當然也沒有配置,所以在裝載中,編譯器找不到這個位址...