根据国外网友Choon Teck的反映,在Atmega2560中,avrub在运行后不能返回用户程序。我没有这个芯片,所以只是在AVR Studio中进行了软件仿真,跟踪到quit函数后,发现语句:
(*((void(*)(void))PROG_START))();
没有正常跳转到0x0000,而是跳转到了0x10000。
查看反汇编代码,发现对应的代码是:
Atmega2560
+0001F0FB: E0E0 LDI R30,0x00 Load immediate
+0001F0FC: E0F0 LDI R31,0x00 Load immediate
+0001F0FD: 9519 EICALL Extended indirect call to (Z)
+0001F0FE: 9508 RET Subroutine return
对比了Atmega1280的代码(1280是可以正常跳转的):
Atmega1280:
+0000F0F9: E0E0 LDI R30,0x00 Load immediate
+0000F0FA: E0F0 LDI R31,0x00 Load immediate
+0000F0FB: 9509 ICALL Indirect call to (Z)
+0000F0FC: 9508 RET Subroutine return
区别在于一个使用了EICALL,一个使用了ICALL。看来这个问题与跳转有一定关系,因为我对汇编不太属性,暂时还没有找出解决方法。
iuzxhl_419167310 2014-1-17 10:55
shaoziyang 2008-9-30 22:37