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小技巧:ui

若是.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.spa

MEMORY是用來指定芯片的rom和ram的大小和劃分出幾個區間..net

MEMORYblog

{索引

PAGE 0 ...  ROM
PAGE 1....     RAM
}內存

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


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可執行代碼

相關文章
相關標籤/搜索