中断处理程序的编译方式与子例程调用的编译方式不得相同。除了保存非易失性寄存器外,中断处理程序还必须保存当前使用的易失性寄存器。发生中断时,中断处理程序还应存储机器状态寄存器 (RMSR) 的值。
-
interrupt_handler
- 为了区分中断处理程序与子例程,
mb-gcc
会在代码声明中查找属性 (interrupt_handler
)。该属性定义如下:void function_name () __attribute__ ((interrupt_handler));
注释: 仅限在原型中为中断处理程序提供属性,不得在定义中提供该属性。中断处理程序还可能会调用其他函数,这些函数可能会使用易失性寄存器。为了在易失性寄存器中保留正确的值,如果中断处理程序是非叶函数,那么它会保存所有易失性寄存器。
注释: 调用其他子例程的函数称为非叶函数。中断处理程序在微处理器软件规范 (MSS) 文件内进行定义。这些定义会将属性自动添加到中断处理器程序函数中。中断处理程序使用
rtid
指令返回至已中断的函数。 -
save_volatiles
-
MicroBlaze 编译器提供了
save_volatiles
属性,该属性与interrupt_handler
属性类似,但使用rtsd
代替rtid
来执行返回。该属性会为非页函数保存所有易失性寄存器,对于叶函数,则仅保存已使用的易失性寄存器。void function_name () __attribute__((save_volatiles));
-
fast_interrupt
-
MicroBlaze 编译器可提供
fast_interrupt
属性,该属性与 interrupt_handler 属性类似。出现快速中断时,MicroBlaze 会跳至中断例程地址,而不是跳至固定地址 0x10。不同于普通中断,在 C 语言函数上使用
fast_interrupt
属性时,MicroBlaze 仅保存最少量的寄存器。void function_name () __attribute__ ((fast_interrupt));
属性 | 函数 |
---|---|
interrupt_handler | 该属性不仅可保存非易失性寄存器,还可用于保存机器状态寄存器和所有易失性寄存器。中断处理程序会返回 rtid。如果中断处理程序为叶函数,那么仅保存该函数所使用的易失性寄存器。 |
save_volatiles | 该属性与 interrupt_handler 类似,但它使用 rtsd 代替 rtid 来返回至中断的函数。 |
fast_interrupt | 该属性与 interrupt_handler 类似,但它会直接跳至中断例程地址,而不是跳至固定地址 0x10。 |