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。表明整个程序执行失败。

猜你喜欢

转载自blog.csdn.net/smilefxx/article/details/84144081