在使用的周期方面平衡分支

时间:2016-06-29 09:22:03

标签: c assembly avr avr-gcc

我有一个循环,里面有几个条件分支。 无论采用什么分支,循环都应该始终运行相同数量的循环。

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

现在我有更多的分支机构,并希望自动平衡分支机构。我正在使用avr-gcc进行编译。

有办法做到这一点吗?

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

1 个答案:

答案 0 :(得分:3)

嗯,你没有指定你是在asm还是在c中编码,因为你使用分支但是你打电话给#34; asm()" ...如果使用C,你可以调用millis ()在循环开始时,也在最后调用它。您必须计算循环的最大持续时间。因此,减去两个毫秒值,并将差值与循环的最大持续时间进行比较。是的lilbit令人困惑,这里的代码:

#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

希望你的功能集类似于我的。下次指定您使用的代码以及您要定位的处理器