1. 程式人生 > >Application terminated, rc = 0x1;當執行裸機程式時出現

Application terminated, rc = 0x1;當執行裸機程式時出現

fff210 # go 30008000

Starting application at 0x30008000 …

Application terminated, rc = 0x1

fff210 # OK

有些網頁上的解決方法是:
uboot下跑arm裸機程式

寫了main()函式,

也去了頭轉換了格式(arm-linux-objcopy main -O binary main.bin )

可是go的時候還是跑不起來(會出現## Starting application at 0x30000000 …

Application terminated, rc = 0x1)

原因何在?

答曰:把main()函式放到原始碼開頭 再編譯即可執行哇

經驗證此種方法可行。

還有一種方法就是,改變Makefile檔案:
將主檔案放前,被呼叫的檔案放後面。
改變前:
arm-linux-ld -Ttext 30000000 -o led.elf led.o start.o
改變後:
arm-linux-ld -Ttext 30000000 -o led.elf start.o led.o
這樣一樣可以解決問題。
在uboot的命令列下,執行go命令,執行do_go函式,
do_go
rc = do_go_exec ((void *)addr, argc - 1, argv + 1);
if (rc != 0) rcode = 1;
printf ("## Application terminated, rc = 0x%lX\n", rc);

unsigned long do_go_exec (ulong (*entry)(int, char *[]), int argc, char *argv[])
{
return entry (argc, argv);
}
rc的值決定是否繼續執行,而rc的值取決於do_go_exec的執行結果。
do_go_exec的輸入的第一個引數是我們"go 0x30000000"中的0x30000000
第二個引數是,我們輸入引數的個數(2 - 1),第三個引數是我們輸入引數的指標陣列的第二個元素(argv[1],0x30000000)。
第一個引數0x30000000被看成是ulong (*entry)(int, char *[])型的函式指標,是這類函式的首地址。
在do_go_exec裡面執行entry(1,0x30000000)。
編譯時連線的順序不一樣,就會出現先執行led.o函式的情況,由於led.o函式不滿足entry型別函式指標的條件,所以執行錯誤(或返回值為1),rc = 1;
do_go函式返回1。表明整個程式執行失敗。