根据使用的周期平衡分支

Balancing branches in regard to cycles used

我有一个包含多个条件分支的循环。 无论采取什么分支,循环都应该总是 运行 相同数量的循环。

为了实现这一点,我用 NOPs(使用 asm("nop"))填充较短的分支,直到它们与较长的分支长度相等。这实现了我想要的。

现在我的分支多了很多,想自动平衡分支。我正在用 avr-gcc 编译。

有办法吗?

根据要求: 我正在使用 ATmega 1284p 和 avr-gcc 来实现。

嗯,你没有指定你是在 asm 中还是在 c 中编码,因为你使用分支但是你调用 "asm()"...如果使用 C,你可以在开头调用 millis()你的循环,并在最后调用它。您必须计算循环的最大持续时间。所以减去这两个毫秒值并将差值与循环的最大持续时间进行比较。是的,有点混乱,这里是代码:

#define MAX_DURATION 1000 //let's say 1 second, but you should calculate it
while(yourcondition) {
  temp1 = millis();
  //do your branches

  temp2 = millis();
  delay(MAX_DURATION-(temp2-temp1));
}

而如果您使用 asm 编写代码,则必须首先禁用中断以避免出现更长的循环。然后你可以设置一个 16 位定时器,如果你的处理器有的话,使用最大的预分频器,然后检查定时器值而不是毫秒并制作延迟功能,很容易完成:

delay: ;put the millisecond to wait in r17:r16
  ldi r18, 200
  ldi r19, 26 ;200*26* (3 cicles each little loop) = 1 millisecond of delay with a 16MHz oscillator
  mov r20, r17
  delay_loop:
       dec r19
       brne delay_loop
      ldi r19, 26
      dec r18
      brne delay_loop
     ldi r18, 200
     dec r17
     brne delay_loop
    mov r17, r20
    dec r16
    brne delay_loop
  ret

希望您的指令集与我的相似。下次指定您使用的代码以及您的目标处理器