中断处理程序 - 2023.2 简体中文

Vitis 统一软件平台文档 嵌入式软件开发 (UG1400)

Document ID
UG1400
Release Date
2023-12-13
Version
2023.2 简体中文

中断处理程序的编译方式与子例程调用的编译方式不得相同。除了保存非易失性寄存器外,中断处理程序还必须保存当前使用的易失性寄存器。发生中断时,中断处理程序还应存储机器状态寄存器 (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));
表 1. 属性的使用
属性 函数
interrupt_handler 该属性不仅可保存非易失性寄存器,还可用于保存机器状态寄存器和所有易失性寄存器。中断处理程序会返回 rtid。如果中断处理程序为叶函数,那么仅保存该函数所使用的易失性寄存器。
save_volatiles 该属性与 interrupt_handler 类似,但它使用 rtsd 代替 rtid 来返回至中断的函数。
fast_interrupt 该属性与 interrupt_handler 类似,但它会直接跳至中断例程地址,而不是跳至固定地址 0x10。