【发布时间】:2010-11-23 22:11:10
【问题描述】:
我正在使用 IAR 工作台工具链在嵌入式系统中调试一些奇怪的 ARM 异常。有时,当异常被捕获时,SVC_STACK 被报告为超出范围(非常超出范围!)这是相关的,还是只是 J-Link JTAG 调试器的工件? SVC_STACK 是做什么用的?它被设置为 0x1000 大小,但是当它超出范围时,它就在我们的堆区域中。谢谢!
【问题讨论】:
标签: exception memory embedded arm jtag
我正在使用 IAR 工作台工具链在嵌入式系统中调试一些奇怪的 ARM 异常。有时,当异常被捕获时,SVC_STACK 被报告为超出范围(非常超出范围!)这是相关的,还是只是 J-Link JTAG 调试器的工件? SVC_STACK 是做什么用的?它被设置为 0x1000 大小,但是当它超出范围时,它就在我们的堆区域中。谢谢!
【问题讨论】:
标签: exception memory embedded arm jtag
当异常发生时进入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。
【讨论】: