void __attribute__((__interrupt__, no_auto_psv)) _T1Interrupt(void) // 5 Hz

__attribute__指令或宏来自gcc,但__interrupt__no_auto_psv不是,它特定于硬件。所以,gcc编译器是如何理解__interrupt__no_auoto_psv的,我在其他地方搜索并没有找到任何声明。
所以基本上,_T1Interrupt函数不接受参数,只返回上面的属性?

最佳答案

特别是,这些属性是用于16位pic24和dspic的微芯片xc16编译器中的特定于平台的扩展。
属性本质上是添加到编译器的解析树中的额外信息。它们存在于C语言语义之外,并提供编译器使用的附加信息来一致地满足您的期望。在这种情况下,__interrupt__告诉它将函数视为isr(函数prolog和epilog与普通函数略有不同:dspic isr使用RETFIE返回指令,而RETURN用于普通函数),并且no_auto_psv控制编译器是否设置PSVPAG寄存器:
使用no_auto_psv属性会忽略将psvpag值重新初始化为auto psv变量(const或放置在空间auto_psv中的变量)的默认值的代码。如果代码没有显式修改psvpag寄存器,或者没有使用编译器管理的psv或prog限定符,那么使用no_auto_psv是安全的。此外,如果中断服务例程(或中断服务例程调用的函数)不使用任何常量或空格auto-psv变量,则可以安全地使用no-auto-psv。
(来自http://www.microchip.com/forums/m394382.aspx

09-13 06:34