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