天天看點

用UBOOT自帶loadb指令加載應用程式到SDRAM中運作的方法

  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>