用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 命令時所接的地址改為主程序的起始地址的話,也是可以正確運行程序的。
資源下載:
https://download.csdn.net/detail/mao0514/6701601
最後更新:2017-04-03 12:53:43