Microchip
直播中

h1654155275.5795

8年用户 213经验值
私信 关注
[问答]

PIC32MZ在中断时存储错误的PC怎么解决?

嗨,我正在处理一个PIC32 MZ2048 EFH064令人震惊的崩溃。看起来当我收到中断时,错误的返回地址被存储在EPC寄存器中。我在模拟器中捕获了它,所以我有一个跟踪。我在这篇文章的末尾附上相关的片段。正如我所能想象的,这里是发生了什么:在跟踪线- 270,代码地址9D0CA08C,指令ISBNELL V1,0,ADDR。V1是1,所以分支被接受。在第-269行,执行代码地址9D0CA090、ADDU V0、S0、V0(它在BNEL之后的延迟时隙中)。在ADDU之前,V0是0000006E;在ADDU之后,V0被设置为8003AD4E。第-268行,发生中断,我们正在开始中断处理程序。我们读了原因寄存器,BD(Branch Delay)位是零。第-245行,我们瞥见了存储的PC。指令是MFC0 S6、EPC,EPC中的值是9D0CA08C——这是BNEL指令的地址。在-225、SW V0、52(S5),我们瞥见了V0。它的值是0x8003AD4E,所以我们可以确认第-269行的ADDU已经执行。在第-53行,我们执行ERET。在第-52行,我们返回atcode地址9D0CA08C,并重新执行指令BNEL V1、0、addr。在第-51行,我们重新执行eADDUV0、S0、V0。在ADDU之前,V0是800 3AD4E(第一次执行ADDU后给出的值!)在ADUU之后,V0为0075 A2E。在线路48,LB A1,8(V0),V0用作地址,当然它失败。这是我的程序崩溃的地方。问题是当PIC32被中断时,它已经在9D0CA090完成ADDU指令的执行,但是它保存的返回地址是前一条指令。所以,当中断处理程序返回时,它返回到错误的指令。这不仅是模拟器中的问题:我的硬件由于相同的原因在相同的指令上崩溃。我弄明白了吗?PIC32 MZ有bug吗?(!)有解决办法吗?谢谢你,鲍伯

回帖(14)

李天竹

2020-5-1 07:53:44
我认为模拟器和真实硬件都不太可能有同样的bug,尤其是这样的大小。
举报

唐红菊

2020-5-1 08:07:50
这在MPLAB X模拟器中再现了效果:MUC.C:TestFUNC.S:用XC32 1.40,-O1编译。它看起来非常脆弱,例如,在设置Count/Compare寄存器之前只添加一个“nop”就会使效果消失。
举报

胡芝恒

2020-5-1 08:12:53
如果我看一下ISR的拆卸列表,保存EPC寄存器的内容在代码的顶部,例如,这是我的定时器ISR,Vector表:ISR:我想知道第-268行和-245行之间所有这些指令在做什么……
举报

唐红菊

2020-5-1 08:20:51
ISR是完全不相干的。问题是,如果延迟时隙指令已经完成,为什么EPC被设置为分支指令的地址?
举报

更多回帖

发帖
×
20
完善资料,
赚取积分