傻孩子,帮忙看看这是什么问题
用AVR Dragon调试Atmega16,将程序下载到芯片单步运行,发现调用子函数时压栈的并不是下一条语句的地址,但能正确返回。这是什么缘故?在IAR for AVR和AVR Studio下均有此问题。比方说地址 代码
0x198 call USART_Init
0x19C ...........
在进入USART_Init时,应该把0x19C压栈,但硬件仿真时实际压栈的值是0x20CE,
不知道这个是怎么来的? PS:
在AVR Studio里软件仿真时,压栈的就是下一句的实际地址,硬件仿真时压栈的就成了实际地址 + 0x2000.
在IAR FOR AVR 下软件仿真也是正常的,硬件仿真也是偏移了0x2000.
不知道这个0x2000是怎么来的? 这个情况我没有注意过,应该是JTAGOCD协议里面的一个特殊处理吧,比如虚拟地址空间影射。
具体情况我也不清楚,你可以发送中文邮件到 avr.cn@atmel.com获取答案。 好吧,我试试。 发了封邮件去问,一天了,没人理我。 看到你的邮件了,正在走内部流程。因为这牵涉到OCD协议,可能会有点麻烦。 属于保密内容? 有信儿了,官方答案:
“这种偏移量的正常,这是由于硬件仿真器的设计机制决定的。不只是ATMEL的仿真器存在这样的情况,其它的也存在这样的情况。但是为什么要加0x2000,而不是其它数值,这涉及仿真器的设计的内部信息,是不对外公开的。”
其他的也存在这种情况?哪些?我用过J-LINK,没有这种情况。 他的意思是,非官方的仿真器也存在这样的问题,这是OCD协议决定的。并不是说其他芯片的仿真器也有这种情况。 看来也只能到这了。傻孩子,谢谢!
页:
[1]