3

我在 TI 的示例代码中看到了以下 switch 案例,我想知道 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”的大小写值,但我不太确定。

4

3 回答 3

8

我认为缺少一个内在的调用:

switch (__even_in_range(TAIV, 10))
{

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

请参阅 IAR 获取 MSP-430编译器文档,该文档在第 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。

__even_in_range第237页的描述说:

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

于 2013-08-08T10:24:53.003 回答
2

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

switch (10)尽管 TAIV已被评估并且可能正在做一些有用的事情(也许是一个宏) ,但您的代码会减少到。

于 2013-08-08T10:25:23.553 回答
1

逗号运算符重新起作用。

归结为case 10.

于 2013-08-08T10:25:06.600 回答