__attribute__((__interrupt__, no_auto_psv)) 是做什么的?

jas*_*ong 6 c gcc interrupt pic

void __attribute__((__interrupt__, no_auto_psv)) _T1Interrupt(void) // 5 Hz
Run Code Online (Sandbox Code Playgroud)

__attribute__指令或宏来自 GCC,但__interrupt__不是 no_auto_psv,它特定于硬件。那么,GCC编译器是如何理解__interrupt__no_auoto_psv,我搜索了一下,在其他地方没有找到任何声明。

那么基本上该_T1Interrupt函数不带任何参数,也不返回任何内容,但具有上述属性?

Jas*_*n S 5

特别是,这些属性是用于 16 位 PIC24 和 dsPIC 的 Microchip XC16 编译器中使用的特定于平台的扩展。

属性本质上是添加到编译器的解析树中的额外信息。它们存在于 C 语言语义之外,用于提供编译器用于与您的期望一致的行为的附加信息。在本例中__interrupt__,告诉它将该函数视为 ISR(其函数序言和结尾与普通函数略有不同:与普通函数相比,dsPIC ISR 使用返回RETFIE指令RETURN),并no_auto_psv控制编译器是否设置PSVPAG寄存器:

使用 no_auto_psv 属性省略了将 PSVPAG 值重新初始化为 auto psv 变量(const 或放置在 auto_psv 空间中的变量)的默认值的代码。如果您的代码未显式修改 PSVPAG 寄存器或使用编译器管理的psvprog限定符,则使用 no_auto_psv 是安全的。另外,如果您的中断服务例程(或中断服务例程调用的函数)不使用任何 const 或 space auto_psv 变量,则使用 no_auto_psv 是安全的。

(来自http://www.microchip.com/forums/m394382.aspx


unw*_*ind 2

的文档__attribute__()说:

GCC 插件可以提供它们自己的属性。

所以也许这就是它在您的情况下的使用方式。