Dsp BootLoader的学习
?
?(2010-07-05 21:16:55)
轉載▼
標簽:? dsp?bootloader?it | 分類:?DSP |
????以下轉載------------>>
????初學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格式),每塊數據塊起始都包含一個程序頭,每個又包含兩個內容:1、當前數據塊大小,即32位格式的數據量。2、當前數據塊在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!終于可以脫機運行程序了^_^!
總結
以上是生活随笔為你收集整理的Dsp BootLoader的学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DSP之GPIO(转)
- 下一篇: DSP 中的看门狗