a1z26 发表于 2009-11-30 21:59:43

傻孩子,帮忙看看这是什么问题

用AVR Dragon调试Atmega16,将程序下载到芯片单步运行,发现调用子函数时压栈的并不是下一条语句的地址,但能正确返回。这是什么缘故?在IAR for AVR和AVR Studio下均有此问题。比方说

    地址            代码
   0x198         call USART_Init
   0x19C         ...........

在进入USART_Init时,应该把0x19C压栈,但硬件仿真时实际压栈的值是0x20CE,
不知道这个是怎么来的?

a1z26 发表于 2009-11-30 22:10:28

PS:

在AVR Studio里软件仿真时,压栈的就是下一句的实际地址,硬件仿真时压栈的就成了实际地址 + 0x2000.

在IAR FOR AVR 下软件仿真也是正常的,硬件仿真也是偏移了0x2000.

不知道这个0x2000是怎么来的?

Gorgon_Meducer 发表于 2009-11-30 23:05:51

这个情况我没有注意过,应该是JTAGOCD协议里面的一个特殊处理吧,比如虚拟地址空间影射。
具体情况我也不清楚,你可以发送中文邮件到 avr.cn@atmel.com获取答案。

a1z26 发表于 2009-12-1 08:15:09

好吧,我试试。

a1z26 发表于 2009-12-1 21:43:06

发了封邮件去问,一天了,没人理我。

Gorgon_Meducer 发表于 2009-12-2 09:34:28

看到你的邮件了,正在走内部流程。因为这牵涉到OCD协议,可能会有点麻烦。

a1z26 发表于 2009-12-2 09:40:59

属于保密内容?

a1z26 发表于 2009-12-4 08:29:20

有信儿了,官方答案:

“这种偏移量的正常,这是由于硬件仿真器的设计机制决定的。不只是ATMEL的仿真器存在这样的情况,其它的也存在这样的情况。但是为什么要加0x2000,而不是其它数值,这涉及仿真器的设计的内部信息,是不对外公开的。”

其他的也存在这种情况?哪些?我用过J-LINK,没有这种情况。

Gorgon_Meducer 发表于 2009-12-4 09:38:18

他的意思是,非官方的仿真器也存在这样的问题,这是OCD协议决定的。并不是说其他芯片的仿真器也有这种情况。

a1z26 发表于 2009-12-7 19:36:43

看来也只能到这了。傻孩子,谢谢!
页: [1]
查看完整版本: 傻孩子,帮忙看看这是什么问题