供所有c6000系列dsp開發者參考。【ti關於c6000 bootloader 文件
】dm642復位後,晶元先從ce1空間讀取1k位元組的資料到內部sram,然後從位址0開始執行。因為一般的程式都遠遠大於1k位元組,所以一般都是有乙個二級bootloader,用它來載入主程式。bootloader執行完後呼叫c_int00()來進行c執行時刻初始化,如堆疊,靜態變數等,之後會呼叫bios_init,最後開始執行main函式,main函式結束後dsp/bios的任務管理器開始執行。
具體實現起來時要稍複雜一些,因為有一些實際問題需要考慮。
1.外部儲存器一般是nor flash,容量較大時,因為dm642的ce1只有1mb空間,需要使用gpio配合的分頁模式。因為gpio的預設值是輸入,內有上拉電阻,所以bootloader需要寫在最高頁。dm642復位後採用最慢的讀寫時序。
2.bootloader需要在有限的1k位元組內完成sdram初始化,並將主程式搬運到記憶體中然後開始執行。ti的例子是用彙編寫的,因為此時c的執行環境還沒有初始化。其中最關鍵的是棧指標沒有初始化,我們給它賦值後其他部分就可以用c來寫,但要注意仍不能使用c庫函式。
彙編部分進行棧指標初始化:
_boot_sp:
mvk .s2 0x0600, b15
mvkl .s2 _boot_loader, b0
mvkh .s2 _boot_loader, b0
b .s2 b0
nop 5
boot.c進行emif初始化,並分段將主程式從flash讀入sdram
#pragma code_section(boot_loader, ".boot_load");
void boot_loader()
size=*(uint32*)program_addr;
}c_int00();//run the second bootloader
3.經常遇到的問題是bootloader除錯時執行正常,寫到flash就啟動不了。這裡的區別在於除錯時ccs負責將程式裝載到記憶體中,然後程式直接從c_int00()開始執行,而燒到flash就得一切靠自己了。除錯這個問題的辦法是ccs引導程式後,先檢視記憶體0位址處,是否是bootloader的**,如果不對就是linker的cmd檔案或dsp/bios記憶體設定有問題,需要將bootloader放在片內sram中。然後讓程式從0位址開始執行,看主程式是否正確地載入到記憶體中。
.boot_load>boot_ram
boot_ram是起始位址為0,長度1k的內部sram空間。
4.bootloader除錯完畢後就是燒寫到flash。先用ti的hex6x將輸出轉換成hex檔案,然後用flashburn或自己的**燒寫。flash的頭1k位元組是bootloader,然後是主程式的**段。**的格式可以參見boot.c
dm642 程式編寫問題
1 無法開啟某個標頭檔案 情況 在乙個工程資料夾中,新建了乙個include資料夾,將標頭檔案都放置在其裡面,但是在ccs中提示無法找到該標頭檔案。解決 在project選單裡的build option中,compiler頁內,在category裡選擇proprocessor,然後在include ...
CCS3 3之DM642開發環境建立
使用的 器是seed xdsusb2.0 5v。之前用的是ccs2.2,換成了ccs3.3的。1.安裝ccs3.3.38。在我安裝完後,並沒有急著公升級,公升級的程式是sr12 ccs v3.3 sr 3.3.82.13.exe。2.執行setup ccstudio v3.3進行設定。因為選用的是s...
ARM Linux啟動過程分析
5 呼叫 linux核心映像 bootloader完成的最後一項工作便是呼叫 linux核心。如果 linux 核心存放在 flash 中,並且可直接在上面執行 這裡的 flash 指 nor flash 那麼可直接跳轉到核心中去執行。但由於在 flash 中執行 會有種種限制,而且速度也遠不及 r...