c++ - 功能相同的代码,不同的结果

标签 c++ arduino arduino-uno

我有 2 段代码,它们执行完全相同的操作,但其中一段实际上不起作用。谁能解释一下为什么?

代码通过 spi 将数据发送到运行显示器的 FPGA。我的芯片上的代码存储空间几乎用完了,所以我试图尽可能地减少。下面的更改由于某种原因最终中断,程序的其余部分与它完全相同。

//Looping to execute code twice doesnt work
for (byte i = 0; i < 3; i++)
      {
        temp2 = temp % 10;
        temp /= 10;
        temp2 |= 0x40;
        for (byte k = 0; k < 2; k++)
        {
          SPI.transfer(reg[j]);
          delayMicroseconds(10);
          SPI.transfer(temp2);
          delayMicroseconds(10);
        }
        reg[j] -= 1;
      }

.

//But copy-paste does
for (int i = 0; i < 3; i++)
          {
            temp2 = temp % 10;
            temp /= 10;
            temp2 |= 0x40;
            SPI.transfer(reg[j]);
            delayMicroseconds(10);
            SPI.transfer(temp2);
            delayMicroseconds(10);
            SPI.transfer(reg[j]);
            delayMicroseconds(10);
            SPI.transfer(temp2);
            delayMicroseconds(10);
            reg[j] -= 1;
          }

最佳答案

最可能的解释是其他一些代码依赖于这个循环满足特定的时序约束,如果不满足则失败。

您引入的可能影响时序的更改包括;

  • i 更改为 byte 类型,而不是 int。这会影响计时 - int 通常是“本地”类型,通过各种措施可以使操作更有效。使用 byte 可能会改变外循环的时间。例如,如果 byte 是比 int 更小的类型,则对字节的操作可能涉及与 int 之间的转换。
  • 本质上,您已经用内部循环替换了重复的语句序列。根据优化设置,编译器可能会展开循环(实际上产生与第一个代码示例相同的行为),也可能不会。如果编译器不展开循环,循环构造本身的开销(初始化变量 k,在每次迭代时检查并递增它,等等)会影响代码的计时。

如果在某种程度上依赖此代码满足特定的时间限制,则需要在某处记录下来。如果未记录该要求,我建议您记录它(例如,将其作为特定要求输入),然后记录派生的要求(例如,使用 int 控制外循环的要求[如果是需要] 和另一个要求,即在代码中展开内部循环而不是依赖编译器优化)。

关于c++ - 功能相同的代码,不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41513721/

相关文章:

C++ 值初始化自定义容器的项目

ios - 我可以使用 eBay 上便宜的 nRF51822 模块与 iOS 设备通信以获取通知 (ANCS) 吗?

java - 如何与arduino和java进行串口通信?

c++ - 如何确保数据类型与 C++ 中需要的一样大

arduino - 在arduino中将十六进制字符串转换为十进制

c++ - 在头文件中声明变量和函数的重要性

c# - 什么是 __int32?

c++ - IAMVideoProcAmp GetRange 仅在延迟后有效(C++)?

c++ - 如何使用套接字将 Arduino 连接到 C++?

python - '类型错误 : Not implemented for this type' when trying to make a Scatter plot in matplotlib