【问题标题】:ARM9 SVC_STACK out of range?ARM9 SVC_STACK 超出范围?
【发布时间】:2010-11-23 22:11:10
【问题描述】:

我正在使用 IAR 工作台工具链在嵌入式系统中调试一些奇怪的 ARM 异常。有时,当异常被捕获时,SVC_STACK 被报告为超出范围(非常超出范围!)这是相关的,还是只是 J-Link JTAG 调试器的工件? SVC_STACK 是做什么用的?它被设置为 0x1000 大小,但是当它超出范围时,它就在我们的堆区域中。谢谢!

【问题讨论】:

    标签: exception memory embedded arm jtag


    【解决方案1】:

    当异常发生时进入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

    【讨论】:

    • 谢谢 - 钱。来自 IAR -“EWARM 4.42 版的堆栈插件不支持 RTOS,因此它总是会抱怨堆栈溢出。如果您使用的是 RTOS,则应该禁用堆栈插件”。该死 - 我希望就是这样 - 更多调试!
    猜你喜欢
    • 2023-03-27
    • 2012-05-04
    • 2018-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-09
    • 2014-02-25
    • 2013-02-28
    相关资源
    最近更新 更多