我正在尝试编辑arduino库。有人可以帮我解释一下这段代码吗

时间:2020-09-01 06:29:59

标签: shared-libraries arduino-c++

#if defined(__AVR__)

#define pew                                                                    \
  asm volatile("ld  __tmp_reg__, %a[ptr]+"                                     \
               "\n\t"                                                          \
               "out %[data]    , __tmp_reg__"                                  \
               "\n\t"                                                          \
               "out %[clk]     , %[tick]"                                      \
               "\n\t"                                                          \
               "out %[clk]     , %[tock]"                                      \
               "\n" ::[ptr] "e"(ptr),                                          \
               [ data ] "I"(_SFR_IO_ADDR(DATAPORT)),                           \
               [ clk ] "I"(_SFR_IO_ADDR(CLKPORT)), [ tick ] "r"(tick),         \
               [ tock ] "r"(tock));
#endif

    // Loop is unrolled for speed:
    pew pew pew pew pew pew pew pew pew pew pew pew pew pew pew pew pew pew pew
        pew pew pew pew pew pew pew pew pew pew pew pew pew

1 个答案:

答案 0 :(得分:1)

如果您指的是pew,则称为循环展开。

循环展开,也称为循环展开,是循环转换 尝试以以下方式优化程序的执行速度的技术 它的二进制大小的开销,这是一种称为时空的方法 交易。转换可以由 程序员或优化的编译器。在现代处理器上,循环 展开通常会适得其反,因为增加的代码大小可能 导致更多的缓存丢失; cf. Duff的设备。[1]

循环展开的目的是通过提高程序速度 减少或消除控制循环的指令,例如 每次迭代都进行指针算法和“循环结束”测试; [2] 减少分支机构的罚款;以及隐藏的延迟,包括 从内存读取数据的延迟。[3]为了消除这种计算 可以将循环重写为类似的重复序列 独立声明。[4]

来源:https://en.wikipedia.org/wiki/Loop_unrolling