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)