ARM中断服务程序与函数调用程序

时间:2016-04-13 14:12:05

标签: assembly stack arm interrupt

我知道很多问题与此有关,但我仍然没有找到答案。我从一个C / C ++程序员的角度思考,他不完全了解机器级别的情况。

当一个函数被调用时,我知道调用函数的返回地址被压入堆栈(或链接寄存器自动获得返回地址)以及调用函数使用的所有寄存器,并且程序计数器得到函数入口点的地址。

我的主要问题是,所有这些上下文保存是在硬件中自动完成还是在软件中完成,因此编译器会为此生成汇编代码?如何将被调用函数的局部变量保存在堆栈中?

当发生中断时,我认为程序非常相似,以便进入中断服务程序,除了ISR不接受参数或返回任何内容,但主要区别是什么?中断是自动禁用还是由编译器生成代码以禁用进入ISR的中断?

非常感谢提前。

3 个答案:

答案 0 :(得分:2)

ARM具有先发制人的上下文切换功能。

对于皮质拱

内部有两个堆栈指针,主堆栈指针(MSP)和进程堆栈指针(PSP)。

当您执行上下文切换时,ARM硬件会通过硬件推送一些(但不是所有注册表和PC)然后由硬件弹出其他上下文。 通常R4-R12和LR以及PC将被推入堆栈

这个特性由KERNEL /用户空间模型使用,并且对中断没有用处。原因如下:

通过硬件,中断是跳转(C gotos),到中断向量上的固定地址。然后,该地址可以调用一个函数(您的中断处理程序)

由于您可能有多个中断级别,在执行此函数调用时,您无法依赖上下文切换,您需要将寄存器保存在堆栈中(与任何其他帧一样,但这次是在主要的栈)。

对于Classic ARM

你有多种模式,每种模式都有自己的堆栈,不同的中断被映射到不同的模式。

您没有多个中断级别,因此您可能完全依赖硬件在上下文切换时推送XPSR,PC,R0,R1,R2,R3,R12和LR。

来源:http://www.design-reuse.com/articles/25768/cortex-m-and-classical-series-arm-architecture-comparisons.html

答案 1 :(得分:0)

这取决于您正在谈论的是哪种手臂架构以及哪些指令。分支链路(BL)和分支链路交换(BLX)指令使链路寄存器r14硬编码,使得返回地址的pc被写入那里。

返回指令bx lr,mov pc,lr,软件选择lr作为返回它不像其他指令集那样硬连线。

程序员或编译器可以不使用bl指令并且可以使用堆栈,但是按照预期使用这些指令更有意义。

就函数调用中断和局部变量以及保存状态而言。软件必须在一个函数上保存状态,调用硬件不会为你做那个。在中断上保存状态,这取决于体系结构。对于传统的32位手臂,您已经/已经存储了寄存器,当您切换模式时,一些或许多寄存器会转换到另一个存储区,例如,有一些r13寄存器,一个用于用户模式,一个用于irq,等等on,这样你就不必使用不同的指令,你使用的寄存器从你下面切换出来,所以在你从用户或服务模式进入irq模式的那个方面,通过切换你的那个基本上保护或保存状态寄存器库,你想要保存自己需要做的更多状态。

现在cortex-m微控制器有点不同,当发生中断时,硬件会为您保存状态,所有寄存器,没有寄存器存储,它只是将它们压入堆栈并使用位模式返回地址表示这是一个中断并恢复寄存器/状态。

所有这些内容都记录在arm架构的架构参考手册中或特定核心的技术参考手册中。这两组文件可在infocenter.arm.com找到。

ARM内核的处理方式各不相同,传统上你有单独的irq和fiq线路进入.ARM使内核不是芯片,所以由芯片供应商来实现其余的中断设计,它差异很大。一般情况下,您(软件)有责任转到外设并告诉它从中断它的中断。如何在外围设备和内核之间锁定是可以改变的部分内容。基本上你想在离开服务程序之前让信号无效。 cortex-ms和更新的全尺寸内核可以支持数十到数百个单独的中断,使得软件工作更容易,性能更好,你不必花时间在一个通用的isr中找出是谁导致它然后分支到各种处理程序,他们接受它到每个外围设备的另一个极端,或者甚至比它更精细的可以拥有自己的isr。

有些核心更多的中断管理在核心,您可以看到arm文档,其余的中断管理是特定于该芯片的,您需要芯片供应商提供的文档来获取该信息,其中有对于中断的工作原理,这绝不是一个普遍的答案。

答案 2 :(得分:-2)

在ARM中,这是由硬件完成的。它是自动的,你不必担心。 在ISR的情况下,核心不会阻止您从其他嵌套的IRQ,但我认为在某些目标中您可以拥有无​​法进一步中断的高优先级IRQ