【问题标题】:Not Understanding ARM Hardware Stacks (using IAR)不了解 ARM 硬件堆栈(使用 IAR)
【发布时间】:2012-10-29 07:43:06
【问题描述】:

我目前正在使用 IAR Embedded Workbench 为 NXP LPC2378 micro 进行开发。我想我遇到了我的 IRQ 和 CSTACK 需要更大的问题,因为 CPU 不断崩溃,我注意到这些区域会“溢出”到周围的内存区域。我想我真的不明白这些和其他内存区域的用途是什么?我使用为 ISR 保留 RAM 的 RTOS (CMX),但这似乎是为了不同的东西。

当我使用 RTOS 时,IRQ_STACK、CSTACK、SVC_STACK、FIQ_STACK、UND_STACK 和 ABT_STACK 是什么,或者它们是完全独立的?

【问题讨论】:

  • 在我的脑海中,IRQ、SVC、FIQ、UND 寄存器取决于当前的 ARM 模式。确保这些寄存器在您当前的模式下可用,以免区域溢出。
  • 匿名,它们是可用的,但它们有什么用途(一般意义上)?
  • 用户:大多数任务运行的非特权模式 FIQ:在引发高优先级(快速)中断时进入 IRQ:在引发低优先级(正常)中断时进入主管:在复位时进入,当执行软件中断指令 Abort :用于处理内存访问违规 Undef :用于处理未定义的指令 System :使用与用户模式相同的寄存器的特权模式

标签: c arm microcontroller microprocessors iar


【解决方案1】:

LPC23XX 有几种不同的模式。每种模式都有自己的堆栈。诸如中断之类的事情涉及通过在切换到其他模式之前保存上下文寄存器(我相信是当前模式的堆栈)来切换模式。

您正在使用 RTOS 并不会改变这些堆栈的用途,但有时 RTOS 可能对它们有要求(您可能想查找 CMX)。

  • IRQ_STACK - 中断 (IRQ) 模式堆栈。
  • CSTACK - 用户和系统模式堆栈。这是您大部分时间执行代码的常规堆栈。
  • SVC_STACK - 主管模式堆栈。有些指令只能在 SVC 模式下运行。 IIRC CPU 在此模式下启动,并在初始设置完成后退出。
  • FIQ_STACK - FIQ 中断模式堆栈。快速中断 (FIQ) 可以在 IRQ 期间发生 - 它们就像更高优先级的 IRQ。 FIQ 和 IRQ 在 FIQ 中被禁用。
  • UND_STACK未定义的指令模式堆栈。
  • ABT_STACK 中止模式堆栈,用于数据中止等。 (您可以将处理程序设置为在触发中止时运行。)

我不熟悉 IAR,但如果这些是尺寸,那么它们相当于 uVision 中的 UND_Stack_SizeSVC_Stack_SizeABT_Stack_SizeFIQ_Stack_SizeIRQ_Stack_SizeUSR_Stack_SizeISR_Stack_Size 或等效值应该是前五个的总和。

请记住,堆栈溢出会导致坏事发生。你很可能需要让你的堆栈更大,但就像我说的,你可能需要查找最小值。 CMX 的必需值。

【讨论】:

  • 一个很好的解释,但还有一个问题可能对我有帮助。这些堆栈存储什么?他们是在整个调用堆栈中存储调用堆栈和局部变量,还是在做不同的事情?
  • @Seidleroni,这些堆栈,无论模式如何,都将存储链接寄存器、堆栈指针、程序计数器(pc)和当前程序状态寄存器(cpsr)。除了 FIQ 模式,它们还有 13 个寄存器来存储局部变量等。FIQ 模式有 8 个寄存器来存储局部变量。
  • 首先,是的,它们是相关模式的调用堆栈,因此它们确实存储了您的局部变量。其次,这不一定是它们存储的 all (例如,当您模式/上下文切换时,其他数据(例如上下文寄存器)被推送到堆栈中)。有关 LR、SP、PC 和 CPSR 存储位置的一些信息,另请参阅 en.wikipedia.org/wiki/Calling_convention#ARM
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-01
  • 2011-10-26
  • 2018-07-18
  • 1970-01-01
  • 2020-10-03
  • 1970-01-01
相关资源
最近更新 更多