CCS中CMD文件解析


http://blog.csdn.net/u011392772/article/details/49760897

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 {……… 
   ramfuncs      :   LOAD = FLASHD, 
                              RUN = RAML0, 
                              LOAD_START(_RamfuncsLoadStart),
                              LOAD_END(_RamfuncsLoadEnd),
                              RUN_START(_RamfuncsRunStart),
                              PAGE = 0
  }

cmd小技巧:

如果.text文件很大將其放在一段放不下,需將其放到兩個程序段中
最長的一個length=0x002000,也放不下時.可以這樣處理:
PAGE 0 :
            PRAMH0     : origin = 0x3F8002, length = 0x0014FE
            L0RAM      : origin = 0x008000, length = 0x001000
 
SECTIONS
              .text:{*(.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 0 ...  ROM
PAGE 1....     RAM
}

(`PAGE里包含的區間名字與其后面的參數反映了該區間的起始地址和長度.)


SECTIONS
{
.vectors .................
.reset .................
................
}

SECTIONS:在程序里添加段名.XXXX(如.vectors.)用來指定該段名以下,另一個段名以上的程序(屬於PAGE0)或數據(屬於PAGE1)放到“>”符號后的空間名字所在的地方。下面給出一個簡單的例子:

MEMORY
{

PAGE 0: VECS: origin = 00000h, length = 00040h
LOW: origin = 00040h, length = 03FC0h
SARAM: origin = 04000h, length = 00800h
B0: origin = 0FF00h, length = 00100h
PAGE 1: B0: origin = 00200h, length = 00100h
B1: origin = 00300h, length = 00100h
B2: origin = 00060h, length = 00020h
SARAM: origin = 08000h, length = 00800h

}

SECTIONS
{

.text : { } > 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
{
   PAGE 0: VECT:origin=0x8000,length 0x040
   PAGE 0: PROG:origin=0x8040,length 0x6000
   PAGE 1: DATA:origin=0x8000,length 0x400
}
SECTIONS
{
.vextors >VECT PAGE 0
.text >PROG PAGE 0
.bss >DATA PAGE 1
.const >DATA PAGE 1
}

存儲模型說明:

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

.const 存放程序中的字符常量、浮點常量和用const聲明的常量

.switch 存放程序中switch語句的跳轉地址表

.text 存放程序代碼

.bss 為程序中的全局和靜態變量保留存儲空間

.far 為程序中用far聲明的全局和靜態變量保留空間

.stack 為程序系統堆棧保留存儲空間,用於保存返回地址、函數間的參數傳遞、存儲局部變量和保存中間結果

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM