我在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”是否优先,但我不确定。
答案 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
。