根据使用的周期平衡分支
Balancing branches in regard to cycles used
我有一个包含多个条件分支的循环。
无论采取什么分支,循环都应该总是 运行 相同数量的循环。
为了实现这一点,我用 NOP
s(使用 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
希望您的指令集与我的相似。下次指定您使用的代码以及您的目标处理器
我有一个包含多个条件分支的循环。 无论采取什么分支,循环都应该总是 运行 相同数量的循环。
为了实现这一点,我用 NOP
s(使用 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
希望您的指令集与我的相似。下次指定您使用的代码以及您的目标处理器