那麼您沒有指定是使用asm還是使用c編碼,因爲您使用分支但您調用「asm()」...如果使用C,您可以在開始時調用millis()循環,並在最後調用它。你必須計算循環的最大持續時間。因此,減去兩個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
希望你instrunction集類似於我的。下次指定您使用的代碼和您定位的處理器是什麼
您想通過這樣做來達到什麼目的? – fuz
循環輪詢mico控制器的pin。爲確保定期輪詢引腳,無論採取什麼分支,循環的運行時間應該相同。 – tuzojil
我不認爲編譯器可以做你想做的。使用中斷驅動方法或重寫代碼以使其無分支可能更好。如果您向我們展示您的代碼,我可以嘗試幫助您重寫它,以便它不會分支。 – fuz