exception - ARM9 SVC_STACK 超出范围?

标签 exception memory embedded arm jtag

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

最佳答案

发生异常(不是 IRQ 或 FIQ - 快速 IRQ)时,ARM 会进入 SVC 模式。也可以通过设置 CPRS 寄存器,通过在非用户模式下执行的代码直接进入,但我认为除了初始化系统时之外,这种情况并不常见。

当异常发生时,处理器切换到SVC堆栈,该堆栈必须在系统初始化的早期就设置好。我猜测您的初始化代码没有正确设置 SVC 堆栈,或者异常处理程序之一可能没有正确编码并正在破坏堆栈。

第三种可能性是您使用的 RTOS 按其想要的方式设置 ARM 堆栈(基本上覆盖 IAR 初始化代码可能设置的 SVC 堆栈)。如果是这种情况,则可能一切正常,但 IAR 调试器认为 SVC 堆栈超出范围 - 调试器将从链接器配置文件中获取其信息 - 但如果某些内容将堆栈更改为内存的另一个区域,那么调试器就会感到困惑。

在使用 RTOS 时,IAR 中的用户模式堆栈一直发生在我身上 - 堆栈是根据任务控制 block 进行分配的,而这些任务控制 block 不在调试器认为应该位于的 CSTACK 段中,并且调试器会发出令人恼火的警告。有一些项目配置设置可以用来消除警告,但我不记得它是什么 - 我们很少关心它,只是忍受噪音。

您需要验证堆栈“堆中向上”区域是否有效 - 如果您没有一些代码明确执行此操作,则很可能是错误的(或者您可能需要询问您的 RTOS 供应商)。

ARM Architecture Reference Manual (ARM ARM) 可从 arm.com 免费获取,其中详细介绍了 ARM 堆栈的工作原理。另一个很好的引用是 ARM System Developer's Guide作者:Andrew Sloss 等人。

关于exception - ARM9 SVC_STACK 超出范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1350169/

相关文章:

c# - try catch 异步异常

java - 为什么从finally block 抛出的异常会忽略从catch block 抛出的异常?

iOS 纹理占用 33% 额外内存

c# - 处理 WCF 服务错误的最佳实践?

cocoa - 现代 Cocoa 应用程序中的错误处理

Windows 中的 copymemory() 问题

memory - 即使 RAM 很慢,单周期指令也需要一个周期吗?

c - 嵌入式 C UART 约定

Cmocka-错误 : No Entries for symbol

c - 初始化一个变量,同时指定存储地址 : is it possible?