您好!
在我的 main()函数上添加了一个 for ()循环后,程序 sud延迟 开始被捕获在 ITRAP0中。 但是、它不是被添加到新的行中、而是被执行的第一个设置函数所捕获。 查看反汇编、这发生在 LRETR 指令之后。 查看 ITRAP0之前的 RPC 寄存器、寄存器值始终为0x0000、这意味着它没有恢复程序计数器。 经过一些挖掘后、我注意到正在发生的情况是、程序正在进入多个函数、但只能"返回"一次、因为在此之后、RPC 寄存器将始终导致0x0000和 ITRAP0。 由于 LRETR 指令应从堆栈中检索值、因此我转到那里、发现堆栈上没有写入任何值。 查看堆栈指针、它没有指向链接器中指定的地址(RAMM1、从0x0400开始)、而是指向指定值以外的值、包括 DMA 寄存器中间的地址。
此代码从另一个正常工作的程序中更改、堆栈位于正确的地址中。 添加或删除代码行(例如将 for ()循环扩展为直接执行)只会更改栈的新地址。
堆栈指针正确启动,但在进入 main()之后,在第一个安装函数之前,我找到了这些修改堆栈指针的汇编指令
MOVL * SP++、XAR1 MOVL * SP++、XAR2 MOVZ AR2、@SP SubB XAR2、#6 ADD @SP、 第670号
为"#670"是指在我添加或删除代码行时发生变化的数字(多个变量属性)。 在我用来启动此操作的函数代码中,在进入 main()之后但在执行第一个设置函数之前执行的唯一指令是 ADDB SP,#4。
什么可能导致堆栈以这种方式运行? 在 RAM 中分配扇区(与堆栈不在同一位置)是否会导致此行为?
感谢你的任何帮助