DSP bootloader學習筆記1
彭會鋒
參考:
1 TMS320F28xx DSP中內部Flash的應用研究 http://wenku.baidu.com/view/83e9837931b765ce050814fd.html
1 關於_c_int00問題
從代碼注釋可以看到 :
_c_int00 is branch to start of boot.asm in RTS libray //翻譯為中文就是:_c_int00是rts2800_ml.lib的入口地址;
- _c_int00是C初始化代碼的入口地址
- 在你用C編程的時候,DSP需要執行一段C運行支持庫代碼以完成C運行環境的初始化,_c_int00就是這段初始化代碼的入口地址,
- _c_int00函數在運行支持庫(rts,runtime-support library)中。連接器會將這個函數的入口地址放置在復位中斷向量處,使其可以在初始化時被調用。c_int0函數進行以下工作以建立C運行環境:為系統堆棧產生.stack塊,並初始化堆棧指針。從.cinit塊將初始化數據拷貝到.bss塊中相應的變量;
- 執行完初始化代碼后,就跳轉到main函數,開始運行C程序;
2 f2802x_codestartbranch.asm的分析
此文件是.asm文件,所以需要懂得些匯編指令問題,下面是一些學習到的匯編命令:
- 跳轉指令:LB;
- .set : 設置常量給標號 - The .set directive sets a constant value to a symbol;
- .ref 在別的地方定義的,在這里被應用,類似於c語言的extern;.def是在當前文件中定義變量; .global 應用的范圍相對更廣些,可以代替.ref和.def;
- .sect 定義包含代碼和數據的自定義段,類似於函數定義,注意這里的格式;
- 注釋從分號“;”開始,可以放在指令或匯編命令的后面,也可以放在單獨的一行或多行;
3 在閱讀的代碼中,我發現了一個很有意思的事情,程序應用的是rts2800_ml.lib,印象中的都是rts2800.lib,所以搜索了一些,還是有些不同的!
- rts2800.lib:C/C++運行支持庫;
- rts2800_ml.lib C/C++大內存模式運行支持庫.
- rts2800_ml.lib中有大量浮點運算處理的函數而rts2800.lib沒有
- 在指針的訪問空間上有區別,rts2800.lib中庫函數的指針為near,故不能訪問3Fxxxx,rts2800_ml.lib可以訪問(大小內存模式故名思議就是可以訪問的內存的大小有區別,小內存模式只能訪問低64k地址,也就是16位地址線)
4 最后附上一張dsp啟動的完整示意圖,方便大家理解,稍后繼續寫后續幾篇學習筆記