s3c44b0開發闆中,用uboot自帶loadb指令加載應用程式到sdram中運作的方法
1.開發闆說明:
開發闆上已有移植好的uboot運作。
2.交叉編譯工具鍊為arm-linu-gcc-4.0.4
3.原理:
采用uboot自帶的指令loadb,加應用程式(.bin)加載至sdram中某一位址中,然後用go 指令從某位址處開始執行程式。
操作方法說明:
1.編寫一個測試程式,見附上的例程hello.c。
hello.c主要包含以下幾個功能,在序列槽終端列印輸出字元串,控制開發闆上的led燈,同時采用等待延時的方法循環執行。
2.編寫makefile檔案,友善調試,省得每次都要敲指令行。
3.将得到的hello.bin檔案用loadb指令加載至相應的位址(addr),該位址應與makefile檔案中-ttext指定的位址相同。
4.用go addr指令運作程式。
需要注意的問題:
1.在sdram中運作的位址選取問題:
由于uboot也是在sdram中運作的,是以,要考慮應用程式的大小,加載到某位址後,不要破壞了uboot的正常運作。
如果影響到了uboot的運作,那結果是不可預知的。是以,要避免此種情況的發生。
2.在位址連結時,需要指定程式入口位址,即arm-linux-ld -ttext 0x0c400000 -e main hello.o -o hello.elf中-e main這項。
-e指定的是入口點,即名稱,應該與應用程式中的主程式名(main)相同。
這裡的主程式指應用程式的主運作程式,并不一定是main,可任意指定,比如entry等,但-e指定的名稱必須與之相同。
3.如果在應用程式中,有多個函數時,預設情況下,是依據函數的實作順序配置設定位址值的。
如此例中,delay函數在main函數之前的話,那delay的配置設定位址,應該會是0x0c400000,而main的是0x0c400030,要比delay的靠後。
若main在delay前面,則main為0x0c400000,delay為0x0c40006c。
同時,檔案中的函數位址值可以通過hello.map檔案得知。
4.如果違反了3所述的情況,可通過檢視hello.map檔案中主程式的位址(main),然後在用go 指令時所接的位址改為主程式的起始位址的話,也是可以正确運作程式的。
資源下載下傳:
<a target="_blank" href="http://download.csdn.net/detail/mao0514/6701601">http://download.csdn.net/detail/mao0514/6701601</a>