我从 TI 的 MSP430FR57xx 的 UART 示例代码中找到了这部分。 我不明白
__even_in_range(UCA0IV,0x08)
是什么意思?
#pragma vector=USCI_A0_VECTOR
__interrupt void USCI_A0_ISR(void)
{
switch(__even_in_range(UCA0IV,0x08))
{
case 0:break; // Vector 0 - no interrupt
case 2: // Vector 2 - RXIFG
while (!(UCA0IFG&UCTXIFG)); // USCI_A0 TX buffer ready?
UCA0TXBUF = UCA0RXBUF; // TX -> RXed character
break;
case 4:break; // Vector 4 - TXIFG
default: break;
}
}
中断向量寄存器的值永远不会是奇数或大于 8。因此,如果您告诉编译器这一点,则可以通过省略对这些值的检查并通过使用简单的跳转表实现这些情况来生成稍微更高效的代码。
__even_in_range
是编译器内在函数:
__even_in_range 内在函数在以下情况下向编译器提供提示: 为中断向量例程生成 switch 语句。这 内在函数通常使用如下:
切换 (__even_in_range( x , NUM ))
{
...
}__even_in_range 内在函数将值 x 返回到 控制 switch 语句,同时也告诉编译器 x 必须 是 0 到 NUM(含)范围内的偶数。
编译器内在函数是特定于编译器的*工具,可让您在严格符合 C 或 C++ 代码的范围内完成不可能完成的事情。有时,内在函数允许您做一些原本需要汇编语言的事情。在这种情况下,
even_in_range
内在函数只是一个工具,用于通知编译器switch
语句的参数特征。通过向编译器保证用作 switch
语句参数的值是偶数且介于 0 和其他一些小整数值之间,编译器能够发出比它更高效的汇编代码来实现 switch
语句如果它不知道该论证的特征,就会这样做。
因此,以下两行在功能上是等效的:
switch(UCA0IV)
switch(__even_in_range(UCA0IV,0x08))
*特定于编译器:这意味着并非所有编译器都支持它。事实上,您的编译器可能是唯一这样做的。