2016-04-07 10 views
2

In dem Code unten, kann ich sehen, dass der Timer normal funktioniert, wie die LED immer blinkt. Aber der Wert der count Variable ändert sich nie innerhalb der zweiten while.Variable Wert nicht durch Interrupt auf STM32F4 Entdeckung aktualisiert

Ich weiß nicht, was könnte schief gehen?

// count variable used only in main and TIM2_IRQHandler. 
uint8_t count=0; 

int main(void) 
{ 
    count=0; 
    SystemInit(); 
    GPIOInit(); 
    NVIC_Configuration(); 
    TIM_Configuration(); 
    init_USART3(115200); 
    // All initialization is ok. 
    USART_puts(USART3, "\r\nConnection ok.\r\n");// Working normally 
    while (1) 
    { 
     if(asterixok==1)// No problem. This code if ok ->>process continue next step. 
     { 
      GPIO_SetBits(GPIOD , GPIO_Pin_12); // Led on (ok) 
      count=0;// count going to zero, timer working, must be change in there 
      while(1) 
      { 
       //Led blinking continue 
       //Timer query working normal led (13) blink. 
       //There is a problem 
       if(count>5) // Timer working, count never change in timer interrupt query (WHY) 
       { 
        GPIO_SetBits(GPIOD , GPIO_Pin_14); // LED OFFFFFFFFFFFFFFFF 
        USART_puts(USART3, "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\r\n"); 
        goto nextstate; 
       } 
      } 
      nextstate: 
      GPIO_SetBits(GPIOD , GPIO_Pin_15); // Led never going on because code step in while loop. 
     } 
    } 
} 

void USART3_IRQHandler(void) 
{ 
    if(USART_GetITStatus(USART3, USART_IT_RXNE)) 
    { 
     unsigned char t = USART3->DR; 
     if(t=='*') 
     { 
      asterixok=1; 
     } 
    } 
} 

void TIM2_IRQHandler(void) 
{ 
    if (TIM_GetITStatus(TIM2 , TIM_IT_Update) != RESET) 
    { 
     TIM_ClearITPendingBit(TIM2 , TIM_FLAG_Update); 
     count++; 
     if(count>100) 
      count=0; 
     if(display) 
     { 
      GPIO_ResetBits(GPIOD , GPIO_Pin_13); 
     } 
     else 
     { 
      GPIO_SetBits(GPIOD , GPIO_Pin_13); 
     } 
     display = ~display; 
    } 
} 

Ich habe mit einem anderen Discovery-Board versucht, aber das Problem geht weiter. Bitte helfen. Ich werde verrückt!

volatile uint8_t count; 

Während main die Compiler konnten kompilieren beweisen, dass count nicht in der Schleife modifiziert wurde, und so zwischengespeichert es wahrscheinlich seinen Wert in einem Register:

Antwort

1

Sie sollen count als volatile, als solche deklarieren und vielleicht sogar die if Erklärung optimiert. Sie können dies überprüfen, indem Sie eine Demontage betrachten. Der Compiler kennt keine Interrupts gemäß dem Standard und darf solche Optimierungen durchführen. Qualifizierend count als volatile verbietet dem Compiler diese Optimierungen zu machen, zwingt es die Variable aus dem Speicher jedes Mal neu zu laden, wenn es verwendet wird.

In diesem einfachen Fall wird volatile ausreichen, aber bitte beachten Sie, dass es keine Atomizität von Operationen garantiert, und es nicht verhindert, dass der Compiler und die CPU Befehle um Zugriffe auf die Variable neu anordnen. Es zwingt den Compiler nur, Speicherzugriffsanweisungen jedes Mal zu generieren, wenn die Variable verwendet wird. Für die Atomarität benötigen Sie Sperren, und um eine Neuordnung zu vermeiden, benötigen Sie Speicherbarrieren.

+0

Tahnk Sie für Ihre Lösungen. Ich habe das Schlüsselwort volatile variable ausprobiert. Manchmal wurde das Problem erneut wiederholt. Wie ich es verstehe, ist dies vermutlich der Fall, wenn sowohl der Interrupt-Abfrage-Handler als auch der abhängige Code auf dieselbe GLOBAL-Variable namens "benannte Anzahl" zugreifen. Vielleicht deaktivieren/aktivieren Sie die Interrupt-Aktion, um dies zu beheben. Ich werde es zur richtigen Zeit versuchen. – Fico

Verwandte Themen