我有一个循环,里面有几个条件分支。 无论采用什么分支,循环都应该始终运行相同数量的循环。
为实现这一点,我用NOP
s(使用asm("nop")
)填充较短的分支,直到它们与较长的分支长度相等。这实现了我想要的目标。
现在我有更多的分支机构,并希望自动平衡分支机构。我正在使用avr-gcc进行编译。
有办法做到这一点吗?
根据要求: 我正在使用ATmega 1284p和avr-gcc来实现。
答案 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
希望你的功能集类似于我的。下次指定您使用的代码以及您要定位的处理器