2016-06-29 19 views
4

我有一個循環,其中有幾個條件分支。 無論採取什麼分支,循環都應該始終運行相同數量的循環。關於使用週期的平衡分支

爲了達到這個目的,我用NOP s(使用asm("nop"))填充了較短的分支,直到它們與較長分支的長度相等爲止。這實現了我想要的。

現在我有更多的分支機構,並希望自動平衡分支機構。我正在編譯avr-gcc。

有沒有辦法做到這一點?

根據要求: 我正在使用ATmega 1284p和avr-gcc來執行我的操作。

+1

您想通過這樣做來達到什麼目的? – fuz

+0

循環輪詢mico控制器的pin。爲確保定期輪詢引腳,無論採取什麼分支,循環的運行時間應該相同。 – tuzojil

+0

我不認爲編譯器可以做你想做的。使用中斷驅動方法或重寫代碼以使其無分支可能更好。如果您向我們展示您的代碼,我可以嘗試幫助您重寫它,以便它不會分支。 – fuz

回答

3

那麼您沒有指定是使用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集類似於我的。下次指定您使用的代碼和您定位的處理器是什麼