功能相同的代码,结果不同

Cal*_*nes 5 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;
      }
Run Code Online (Sandbox Code Playgroud)

//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;
          }
Run Code Online (Sandbox Code Playgroud)

Pet*_*ter 0

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

您引入的可能影响时间安排的更改包括:

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

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