【问题标题】:Large number of case statements breaks I2C?大量的case语句破坏了I2C?
【发布时间】:2019-02-03 18:07:01
【问题描述】:
我使用的是 8 位 PIC (PIC16F18326),主要目的之一是处理许多不同的 I2C 消息。 PIC 配置为 I2C 从机,需要用各种数据响应大约 100 条不同的命令。当通过 I2C 中断接收到完整消息时,会设置一个标志。从主循环中读取标志,并调用一个函数来使用 switch...case 语句处理数据并构建消息响应。仅解码大约 50 条不同的消息时一切正常,但当我将案例语句的数量增加到 50 条以上时,PIC 甚至无法确认主人。有人遇到过 8 位 PIC 的类似问题吗?在 PIC 做奇怪的事情之前,是否允许最大数量的 case 语句?编译器和链接器不报告任何错误或警告。如果您有任何想法/建议,请告诉我。
谢谢,
杰克
【问题讨论】:
标签:
switch-statement
pic
8-bit
【解决方案1】:
当您的 switch 语句超出银行边界时,这听起来像是中断了?如果是这种情况,那将是编译器中的错误。您可以通过查看生成的 asm 轻松测试这一点,我相信...
【解决方案2】:
感谢您的回复。在与 Microchip 支持部门来回传递许多消息后,XC8 编译器 2.00 版似乎存在问题。这个版本的编译器是 C99 标准的第一个版本,显然这引入了一些主要问题。我更新到 XC8 vs 2.05(2019 年 1 月发布),没有看到任何类似的问题。
再次感谢。
杰克
【解决方案3】:
编写一个巨大的 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];