切换案例有两个变量

时间:2013-08-08 10:21:16

标签: 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;
  }
}

我的猜测是首先检查案例值“10”是否优先,但我不确定。

3 个答案:

答案 0 :(得分:8)

我认为缺少一种内在的呼唤:

switch (__even_in_range(TAIV, 10))
{

__even_in_range是用于MSP-430 mcu的内在函数。它由用于MSP-430的TI编译器cl430和用于MSP-430的IAR编译器提供。它需要两个参数,即中断向量寄存器和允许范围内的最后一个值,在本例中为10.内在函数用于帮助编译器生成有效的代码。

请参阅ISP了解MSP-430 compiler documentation,该示例在第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;
    }
}

并说:

  

内在函数的作用是生成的代码只能处理给定范围内的偶数值,这正是本例所需要的,因为定时器A的中断向量寄存器只能是0,2,4, 6,8或10。

第237页的__even_in_range说明:

  

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

答案 1 :(得分:2)

C中没有多参数切换。错误的重构器使用了逗号运算符,由于其从左到右的关联性,它产生一个等于10的表达式。

尽管TAIV 已经评估并且可能正在做一些有用的事情(可能是宏),但您的代码会缩减为switch (10)

答案 2 :(得分:1)

逗号操作员重新开始行动。

归结为case 10