2016-11-02 5 views
0

다음 5 개의 고급 명령어로 구성된 다음 무한 루프를 작성하여 Arduino Due에서 실행했습니다. 1 명령 당 1 클록 사이클을 가정하면 LED가 매 5/6 초마다 깜박일 것으로 예상했습니다. 대신 시간은 30 초 이상입니다. 이 코드의 실행 속도가 느려지는가요?Arduino의 while 루프 실행 시간이 예상과 일치하지 않습니다.

#define LED_PIN  13 
///////////////////////////////////////////////////////////////////////// 
void setup() 
{ 
    pinMode(LED_PIN, OUTPUT); 
    digitalWrite(LED_PIN, LOW);  
    ///////////////////////////////////////////////////////////////////////// 
    noInterrupts(); 
} 
///////////////////////////////////////////////////////////////////////// 
void loop() 
{ 
    int cnt = 0; 
    ///////////////////////////////////////////////////////////////////////// 
    noInterrupts(); 

    while(true) // infinite loop 
    {  
    if(cnt == 0) // if cnt == 0 turn off led 
    { 
     interrupts(); 
     digitalWrite(LED_PIN, LOW);  
     noInterrupts(); 
    } 
    // clock rate 84000000 cycles per second 
    if(cnt == VARIANT_MCK) // if cnt is equal to clock rate flash on led 
    { 
     interrupts(); 
     delay(10);  
     digitalWrite(LED_PIN, HIGH); 
     delay(10); // turn on led for a small amount of time 
     noInterrupts(); 
     cnt = - 1; // reset counter 
    } 

    cnt ++ ; // increment counter 
    } 
} 
///////////////////////////////////////////////////////////////////////// 
+0

조건을 계산하셨습니까? 어셈블러 코드를 확인 했습니까? –

답변

0

가 나는

while (true) { 
    cnt++; 
    if (cnt == 0) {/* signalTheStart(); */} 
    if (cnt == VARIANT_MCK) {/* signalTheEnd(); */} 
} 

한 32 비트 INT 증가,이 개 실패 INT 비교, 그리고 다시 점프를 할 필요 틱 얼마나 많은 시계 대략 초 쇼의 수를 기대하고 있었다.

변수가 메모리로 /에서 얼마나 자주 이동하는지 그리고 32 비트 상수 (?)와의 비교가 실제로 수행되는지, 그리고 ARM 내부를 모르는지 나는 잘 모릅니다. 그러나 나는 동의한다. 30 tick은 내가 예상했던 것보다 조금 더 좋다. 나는 5/6에 의해 당신이 "5 또는 6"을 의미하고 1보다 조금 작지는 않지만 모든 해석이 너무 낙관적이라고 생각합니다.

마이클 Zhilin의 힌트 당신이 필요합니까 왜 ... 길을 가야하는 것입니다 컴파일 된 바이너리에서

"를 어셈블러 코드를 확인"그리고? 당신은 이미 인터럽트를 금지해야한다는 것을 알았으므로이 측정은 실제 시나리오에는 전혀 적용되지 않습니다 ...

0

어셈블러에서 코드를 작성하면 문제가 해결됩니다. 주도권의 on-off 기간을 비교함으로써, 컴파일러는 어셈블러에서 직접 쓴 지침을 약 10 시간 생성합니다.

관련 문제