大量案例陈述中断了I2C?

时间:2019-02-03 18:07:01

标签: switch-statement pic 8-bit

我正在使用8位PIC(PIC16F18326),主要目的之一是处理许多不同的I2C消息。 PIC被配置为I2C从设备,并需要以各种数据响应大约100个不同的命令。当通过I2C中断接收到完整的消息时,将设置一个标志。从主循环读取该标志,并调用一个函数以使用switch ... case语句处理数据并构建消息响应。当仅解码大约50条不同的消息时,一切工作正常,但是当我将case语句的数量增加到50以上时,PIC甚至无法确认主机。有人对8位PIC遇到过类似的问题吗?在PIC做奇怪的事情之前,是否允许最大数量的case语句?编译器和链接器不报告任何错误或警告。如果您有任何想法/建议,请告诉我。

谢谢, 杰克

3 个答案:

答案 0 :(得分:0)

当switch语句超出库边界时,听起来像破裂的声音吗?如果真是这样,那将是编译器中的错误。您可以通过查看我相信的生成的asm轻松地对此进行测试...

答案 1 :(得分:0)

感谢您的回复。在使用Microchip支持来回发送许多消息之后,看来XC8编译器2.00版存在问题。此版本的编译器是C99标准的第一个版本,显然这引入了一些主要问题。我更新到XC8 vs 2.05(于2019年1月发布),但没有看到任何类似的问题。

再次感谢。 杰克

答案 2 :(得分:0)

编写大型case语句的另一种方法是函数列表

/* Declarations */
void fun1() {}
void fun2() {}
void fun3() {}

typedef void (*funtype)();

funtype funs[] = { &fun1, &fun2, &fun3, &fun2 };
...

/* Instead of
switch (x)
{
case 0: fun1(); break;
case 1: case 3: fun2(); break;
case 2: fun3(); break;
}
*/

funs[x];