閱讀959 返回首頁    go 阿裏雲 go 技術社區[雲棲]


用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

  上一篇:go Java 枚舉--枚舉的作用
  下一篇:go Oracle中Lpad函數和Rpad函數的用法