切换案例有两个变量

ber*_*rgo 3 c embedded

我在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"是否优先,但我不确定.

oua*_*uah 8

我认为有一个固有的呼叫缺失:

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页的描述说:

指示编译器依赖指定的值是偶数且在指定范围内.代码将相应生成,仅在满足要求时才有效