DSP bootloarder C5000

初學DSP時最頭疼的事就是DSP的bootload問題,之前學51時只要把程序寫好編譯經過後就能夠用燒寫器直接將*.hex文件燒進單片機運行。但DSP內部不帶FLASH RAM,它必須在復位期間將外部的程序加載到內部RAM以後才能運行。這有點像PC 的體系結構,PC 機中的引導加載程序由 BIOS(其本質就是一段固件程序)和位於硬盤 MBR 中的 OS Boot Loader(好比,LILO 和 GRUB 等)一塊兒組成。BIOS 在完成硬件檢測和資源分配後,將硬盤 MBR 中的 Boot Loader 讀到系統的RAM 中,而後將控制權交給 OS Boot Loader。Boot Loader 的主要運行任務就是將內核映象從硬盤上讀到 RAM 中,而後跳轉到內核的入口點去運行,也即開始啓動操做系統。我剛開始時就被這bootload搞的心焦如焚,仿真好的程序卻不能脫機運行,最好仍是老老實實看TI的DSP datasheet,通過一番周折總算搞定!爲此我想把個人調試心得寫出來與你們共享,一方面是避免初學者走彎路,另外一方面是藉此拋磚引玉望方家多斧正^_^。
簡單地說,bootloader就是在用戶程序運行以前的一段小程序,經過這段小程序初始化硬件設備、創建內存空間的映射圖,最終調用用戶程序。這段小程序其實已固化在DSP芯片TMS320VC33內部ROM中,在TMS320C3X datasheet中有源碼及功能流程圖,咱們只需知道它的功能流程便可。從流程圖咱們能夠知道在DSP上電覆位時只要DSP芯片引腳'MCBL/MP'爲高電平,TMS320VC33就開始自動執行固化在內部ROM中的bootloader程序,而後根據外部中斷引腳'INT3~INT0'判斷用戶程序的加載起始地址。 
管腳 電平 存儲空間
INT0 0 0x001000
INT1 0 0x400000
INT2 0 0xfff000
INT3 0 串口
在個人系統應用中,我將程序存儲在外部FLASH芯片39VF040中,它在系統中的起始地址爲:0X400000,因此只要DSP復位時外部中斷引腳'INT1'爲低電平,bootloader程序就開始讀取外部FLASH芯片39VF040中的用戶程序並加載到DSP內部RAM中,加載完畢後就自動跳到用戶程序的入口地址開始運行用戶程序。從bootloader的流程圖還能夠知道,bootloadr加載用戶程序時是有必定格式要求的,即存儲在用戶外部FLASH程序空間的數據結構的格式要求以下:
WORD 0 : 用戶外部FLASH芯片數據寬度,如8,16,32位等
WORD 1 : 控制字,用來寫入TMS320VC33的總線控制寄存器
WORD 2 : 數據塊大小
WORD 3 :當前上載數據塊將要裝載到DSP內部RAM中的目標地址 
WORD 4~N :用戶程序內容
用戶的程序分爲多個數據塊(由於DSP開發軟件生成的目標文件是COFF格式),每塊數據塊起始都包含一個程序頭,每一個又包含兩個內容:一、當前數據塊大小,即32位格式的數據量。二、當前數據塊在DSP內部RAM存儲的起始地址。程序頭以後就是用戶的程序內容。
講到這裏問題的關鍵就出來了:怎樣產生這樣的程序塊呢?程序內容應該爲哪一種格式*.hex、*.bin、*.out?這也是我當初最頭疼的問題。
用TI公司的DSP開發軟件Code Composer創建一個項目文件後,要作的第一件事就是編寫*.cmd命令文件,命令文件有兩個:一個是連接命令文件,另外一個是boot引導表格式生成命令文件。
連接命令文件做用是分配各個程序段在DSP內部RAM中的存儲位置,連接命令文件必須和項目文件名相同。例如項目online.mak的連接命令文件online.cmd以下所示:
-c //ROM初始化
-o online.out //產生online.out可執行文件
-m online.map //產生online.map映象文件
online.obj //連接的目標文件
-l rts30.lib //鏈入TMS320C3X運行支持庫
MEMORY
{
VECS: org=0x809fc1 len=0x3f //定義矢量的起始地址及空間的長度
RAM0: org=0x809800 len=0x7c1 //定義堆棧起始地址及空間的長度
RAM2: org=0x800000 len=0x8000 //定義用戶程序數據空間
}
SECTIONS
{
"vectors": load=VECS //將中斷向量塊安排在VECS空間
.text: load=RAM2 //將程序代碼、常量、變量等數據塊安排在RAM2空間
.cinit: load=RAM2
.const: load=RAM2
.bss: load=RAM2
.stack: load=RAM0 //將堆棧塊安排在RAM0空間
}
創建連接命令文件後,開發軟件在對用戶程序彙編連接生成目標文件的過程當中,就會按照連接命令文件對輸出的COFF格式的數據塊自動選擇存儲器地址。
boot引導表格式生成命令文件,這個文件名能夠隨意取,例如可取名爲hex.cmd。先頭講到TMS320VC33的bootloader程序加載用戶程序是有必定格式,boot引導表格式生成命令文件就是將用戶的目標文件轉換成符合要求的格式,舉例以下:hex.cmd
online.out //要進行轉換的目標文件
-map hex.map //生成映象文件 
-boot //產生裝載程序
-image //輸出文件去掉地址映象
-i //創建INTEL十六進制文件的輸出
-memwidth 8 //用戶程序存儲器的數據寬度
-cg 10e8h //總線控制字
-e 00803f86h //程序裝載完成後的執行地址即爲_c_int00的地址,可查看online.map文件*/
ROMS //ROM的映射範圍,及用戶程序在外部FLASH中的地址空間 { FLASH1: org=0,len=10000h,romwidth=8,files={online1.hex}  FLASH2: org=10000h,len=10000h,romwidth=8,files={online2.hex} } 寫好格式轉換命令文件後,在WINDOWS的命令提示符工具下用'cd'命令進入用戶程序目標文件所在目錄,而後運行hex30 hex.cmd便可根據格式命令文件hex.cmd的要求產生兩個hex格式的文件online1.hex和online2.hex。其中hex30是DSP開發軟件自帶的程序。由於Intel格式中除了數據以外還有起始符、字節個數、起始地址、類型以及校驗位等各類信息,並不是純粹數據的HEX格式表示。因此還不能直接燒進FLASH芯片,一樣在命令提示符下運行hexbin程序,將online1.hex和online2.hex分別轉換成online1.bin和online2.bin,就可獲得純粹數據格式的燒寫文件,好了,只要把剛纔兩個文件燒進FLASH芯片,重啓系統,OK!終於能夠脫機運行程序了^_^!
相關文章
相關標籤/搜索