【问题标题】: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];
        

        【讨论】:

          猜你喜欢
          • 2019-03-05
          • 2018-03-05
          • 1970-01-01
          • 1970-01-01
          • 2021-04-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-15
          相关资源
          最近更新 更多