我在TI的示例代码中看到以下切换情况,我想知道switch参数接收的第二个变量的含义是什么,
__interrupt void Timer_A(void)
{
switch (TAIV, 10) // Efficient switch-implementation
{
case 2: break; // TACCR1 not used
case 4: break; // TACCR2 not used
case 10: P1OUT ^= 0x01; // overflow
break;
}
}
Run Code Online (Sandbox Code Playgroud)
我的猜测是首先检查案例值"10"是否优先,但我不确定.
我认为有一个固有的呼叫缺失:
switch (__even_in_range(TAIV, 10))
{
Run Code Online (Sandbox Code Playgroud)
__even_in_range是用于MSP-430 mcu的内在物.它由cl430用于MSP-430的TI编译器和用于MSP-430的IAR编译器提供.它需要两个参数,即中断向量寄存器和允许范围内的最后一个值,在本例中为10.内在函数用于帮助编译器生成有效的代码.
有关MSP-430 编译器文档的信息,请参阅IAR,该文档在第25页给出了此示例:
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A1_ISR(void)
{
switch (__even_in_range(TAIV, 10))
{
case 2: P1POUT ˆ= 0x04;
break;
case 4: P1POUT ˆ= 0x02;
break;
case 10: P1POUT ˆ= 0x01;
break;
}
}
Run Code Online (Sandbox Code Playgroud)
并说:
内在函数的作用是生成的代码只能处理给定范围内的偶数值,这正是本例所需要的,因为定时器A的中断向量寄存器只能是0,2,4,6,8 ,或10.
__even_in_range第237页的描述说:
指示编译器依赖指定的值是偶数且在指定范围内.代码将相应生成,仅在满足要求时才有效