我正在使用 IAR 工作台工具链在嵌入式系统中调试一些奇怪的 ARM 异常。有时,当异常被捕获时,SVC_STACK 被报告为超出范围(非常超出范围!)这是相关的,还是只是 J-Link JTAG 调试器的工件?SVC_STACK 是做什么用的?它设置为 0x1000 大小,但是当它超出范围时,它在我们的堆区域中。谢谢!
1 回答
发生异常时进入 ARMs SVC 模式(不是 IRQ 或 FIQ - 快速 IRQ)。也可以通过设置CPRS寄存器在非用户模式下直接执行代码,但我认为除了初始化系统时这种情况并不常见。
当发生异常时,处理器切换到 SVC 堆栈,该堆栈必须在系统初始化的早期设置。我猜测您的初始化代码没有正确设置 SVC 堆栈,或者可能是其中一个异常处理程序没有正确编码并且正在破坏堆栈。
第三种可能性是您使用的 RTOS 以它想要的方式设置了 ARM 堆栈(基本上覆盖了 IAR 的初始化代码可能设置的 SVC 堆栈)。如果是这种情况,可能一切正常,但 IAR 调试器认为 SVC 堆栈超出范围 - 调试器将从链接器配置文件中获取其信息 - 但如果某些东西将堆栈更改为另一个内存区域,那么调试器会感到困惑。
在使用 RTOS 时,IAR 中的用户模式堆栈一直发生在我身上——堆栈是根据不在 CSTACK 段中的任务控制块分配的,调试器认为它应该在其中,并且调试器会发出恼人的警告. 有一些项目配置设置可以用来消除警告,但我不记得它是什么 - 我们很少打扰它,只是忍受噪音。
您需要验证堆栈“在堆中向上”区域是否有效 - 如果您没有明确执行此操作的一些代码,则可能是错误的(或者您可能需要询问您的RTOS 供应商)。
ARM 架构参考手册(ARM ARM) 可从 arm.com 免费获得,其中详细介绍了 ARM 堆栈的工作原理。另一个很好的参考资料是Andrew Sloss 等人的ARM System Developer's Guide 。