原创 AVRUB中发现一处bug

2008-9-25 20:16 3111 6 7 分类: MCU/ 嵌入式

根据国外网友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。看来这个问题与跳转有一定关系,因为我对汇编不太属性,暂时还没有找出解决方法。

 

 
PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

iuzxhl_419167310 2014-1-17 10:55

谢谢分享。

shaoziyang 2008-9-30 22:37

暂时可以用下面语句 asm volatile("jmp 0x0000"); 取代 (*((void(*)(void))PROG_START))(); 但是,使用jmp后,最终代码的长度会增加。
相关推荐阅读
shaoziyang 2017-12-15 11:06
《micropython 入门指南》正式出版了
第一本专门介绍MicroPython的中文图书《MicroPython入门指南》由电子工业出版社正式出版了(各大书店和网络书店都有)。MicroPython是近年开源社区中最热门的项目之一,它功能强大...
shaoziyang 2017-11-01 15:30
《MicoPython入门指南》一书即将发行
《MicoPython入门指南》一书即将发行,这是第一本专业介绍MicroPython的中文书籍,请大家多关注和支持。​​...
shaoziyang 2017-07-13 19:50
micro:bit 专用电池扩展板
最近Microbit这么火,就想着要做点什么,于是就有了这个Microbit的专用电池扩展板。它完美配合原版的microbit,可以为microbit增加电池、蜂鸣器功能,功能上超过 MI:power...
shaoziyang 2017-06-13 09:09
用pyboard的dac播放音乐
官方的PyBoard带有DAC功能,使用DAC,我们可以播放简单的音乐。 先准备好两根铜丝,一个有源音箱,一个音频线。 然后从官方网站下载两个文件: http://micropython.org/...
shaoziyang 2017-06-13 09:03
microbit巡线小车 BoBBoT
BoBBoT 是一个使用 BBC micro:bit 控制的巡线小车套件,它很容易组装。 它特别为儿童设计,让孩子可以通过实践学习计算机科学概念。使用 BoBBoT 可以学习: 算法设计 (流程图和...
shaoziyang 2017-06-12 08:29
micropython升级到了 1.9.1
micropython升级到了 1.9.1,主要改进有: v1.9.1 修复了 stm32 的 USB 存储, lwIP 绑定和 VFS 问题 This release provides an imp...
EE直播间
更多
我要评论
1
6
关闭 站长推荐上一条 /3 下一条