Assembly ARM中断服务程序与功能调用程序

Assembly ARM中断服务程序与功能调用程序,assembly,stack,arm,interrupt,Assembly,Stack,Arm,Interrupt,我知道有很多关于这方面的问题被问到,但我仍然没有找到我的答案。我是从一个C/C++程序员的角度来思考的,他不完全了解机器级别发生的事情 调用函数时,我知道调用函数的返回地址与调用函数使用的所有寄存器一起推送到堆栈上(或链接寄存器自动获取返回地址),程序计数器获取函数入口点的地址 我的主要问题是,所有这些上下文的保存是在硬件中自动完成的,还是在软件中完成的,因此编译器会为此生成汇编代码?被调用函数的局部变量如何保存在堆栈上 当一个中断发生时,我相信这个过程是非常相似的,以便转到中断服务例程,除了I

我知道有很多关于这方面的问题被问到,但我仍然没有找到我的答案。我是从一个C/C++程序员的角度来思考的,他不完全了解机器级别发生的事情

调用函数时,我知道调用函数的返回地址与调用函数使用的所有寄存器一起推送到堆栈上(或链接寄存器自动获取返回地址),程序计数器获取函数入口点的地址

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

当一个中断发生时,我相信这个过程是非常相似的,以便转到中断服务例程,除了ISR不接受参数或返回任何东西,但是主要的区别是什么?中断是自动禁用的,还是由编译器生成代码在输入ISR时禁用中断


非常感谢。在ARM中,这是由硬件完成的。这是自动的,你不必担心。
在ISR的情况下,核心不会阻止您使用其他嵌套的IRQ,但我认为在某些目标中,您可以使用高优先级的IRQ,不能进一步中断。

在asm术语中,流程没有“局部变量”。它只有固定数量的架构寄存器。如果变量多于regs,那么实现函数的代码就必须将一些变量溢出到堆栈中

在具有权限分离和内存保护的多任务操作系统中,ISR根本不使用用户空间堆栈。它们使用内核堆栈,否则用户空间进程的其他线程可能会干扰内核的ISR

我假设ARM与其他架构类似,比如x86,硬件保存中断返回地址,但保留其余架构状态(包括寄存器)取决于软件。不需要所有寄存器的小型ISR甚至不需要保存所有寄存器


哦,事实上Jester的评论提醒了我ARM有一组单独的用于ISR的REG,所以是的,硬件确实负责保存大多数REG。(这只是对这部分问题的部分回答。我的主要目的是指出需要保存的只是寄存器,即固定大小的内容。)

这取决于您所谈论的arm体系结构和说明。分支链路(BL)和分支链路交换(BLX)指令对链路寄存器r14进行硬编码,以便将返回地址的pc写入其中

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

程序员或编译器可以自由地不使用bl指令,也可以使用堆栈,但按照预期使用这些指令更有意义

至于中断和局部变量以及保存函数调用的状态。软件必须保存一个函数的状态,调用硬件不能为您这样做。在中断上保存状态,这取决于体系结构。对于传统的32位arm,您有/已经存储寄存器组,当您切换模式时,一些或多个寄存器切换到另一个组,例如,有许多r13寄存器,一个用于用户模式,一个用于irq,等等,这样,你就不必使用不同的指令,你正在使用的寄存器从你下面切换出来,因此,在这方面,当你从用户或服务模式切换到irq模式时,基本上是通过将你从寄存器库中切换出来来保护或保存状态,任何你想要保存的状态你都需要自己做

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

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

arm内核处理中断的方式各不相同,传统上有单独的irq和fiq行。ARM制造的是核心而不是芯片,所以剩下的中断设计由芯片供应商来实现,而且差别很大。通常情况下,尽管您(软件)有一些责任去外围设备,并告诉它从其末端取消中断。它是如何在外围设备和核心设备之间锁定的,这是可以改变的部分内容。基本上,您希望在离开服务例程之前解除对信号的评估。cortex ms和更新的全尺寸内核可以支持数十到数百个独立中断,使软件工作更轻松,性能更好您不必花时间在一个通用isr中找出是谁造成的,然后转移到不同的处理程序,他们把它带到每个外围设备的另一个极端,甚至比拥有自己的isr更细粒度


一些内核更多的中断管理在内核中,您可以看到arm文档,其余的中断管理是特定于该芯片的,您需要芯片供应商的文档来获取该信息,对于中断如何工作,没有一个通用的答案。

arm具有先发制人的上下文切换

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

当您进行上下文切换时,ARM硬件会按硬件推送一些(但不是所有)注册表