【发布时间】:2011-09-14 00:30:45
【问题描述】:
这一直困扰着我一整天。当程序设置自己在接收到某个中断时调用函数时,我知道在程序中断时将寄存器压入堆栈,但我想不通的是:寄存器如何脱离堆?我知道编译器不知道函数是否是中断处理程序,也不知道中断给函数提供了多少参数。那么它到底是如何关闭寄存器的呢?
【问题讨论】:
标签: stack signals interrupt cpu-registers
这一直困扰着我一整天。当程序设置自己在接收到某个中断时调用函数时,我知道在程序中断时将寄存器压入堆栈,但我想不通的是:寄存器如何脱离堆?我知道编译器不知道函数是否是中断处理程序,也不知道中断给函数提供了多少参数。那么它到底是如何关闭寄存器的呢?
【问题讨论】:
标签: stack signals interrupt cpu-registers
这取决于编译器、操作系统和 CPU。
对于低级嵌入的东西,可以直接调用 ISR 以响应中断,编译器通常会对将给定例程标记为 ISR 的语言(通常是 C 或 C++)进行一些扩展,并且寄存器将在这样一个例程的开始和结束时被保存和恢复。 [1]
对于常见的桌面/服务器操作系统,尽管中断和用户代码之间通常存在一定程度的抽象——中断通常首先由一些内核代码处理,然后再传递给用户例程,在这种情况下,内核代码负责保存和恢复寄存器,用户提供的 ISR 并没有特殊。
[1] 例如Keil 8051 C 编译器:
void Some_ISR(void) interrupt 0 // this routine will get called in response to interrupt 0
{
// compiler generates preamble to save registers
// ISR code goes here
// compiler generates code to restore registers and
// do any other special end-of-ISR stuff
}
【讨论】: