2010-06-13 2 views
0

J'ai utilisé le temporisateur A dans MSP430 avec une optimisation élevée du compilateur, mais j'ai trouvé que mon code temporisateur échoue lorsque l'optimisation du compilateur est utilisée. Si aucune optimisation n'est utilisée, le code fonctionne correctement.Minuteur une utilisation dans msp430 en mode d'optimisation du compilateur haut

Ce code est utilisé pour obtenir une coche de temporisation de 1 ms. timeOutCNT est incrémenté en interruption.

Voici le code,

 //Disable interrupt and clear CCR0 
     TIMER_A_TACTL = TIMER_A_TASSEL |      // set the clock source as SMCLK 
      TIMER_A_ID |       // set the divider to 8 
      TACLR |         // clear the timer 
      MC_1;     // continuous mode 
     TIMER_A_TACTL &= ~TIMER_A_TAIE;       // timer interrupt disabled 
     TIMER_A_TACTL &= 0;        // timer interrupt flag disabled 

     CCTL0 = CCIE;         // CCR0 interrupt enabled 
     CCR0 = 500; 
     TIMER_A_TACTL &= TIMER_A_TAIE;    //enable timer interrupt 
     TIMER_A_TACTL &= TIMER_A_TAIFG;    //enable timer interrupt 
     TACTL = TIMER_A_TASSEL + MC_1 + ID_3;     // SMCLK, upmode 

     timeOutCNT = 0; 

     //timeOutCNT is increased in timer interrupt 
     while(timeOutCNT <= 1); //delay of 1 milisecond 

     TIMER_A_TACTL = TIMER_A_TASSEL |      // set the clock source as SMCLK 
     TIMER_A_ID |         // set the divider to 8 
     TACLR |           // clear the timer 
     MC_1;       // continuous mode 
     TIMER_A_TACTL &= ~TIMER_A_TAIE;       // timer interrupt disabled 
     TIMER_A_TACTL &= 0x00;        // timer interrupt flag disabled 

Quelqu'un peut-il me aider à résoudre ce problème? Existe-t-il un autre moyen d'utiliser la minuterie A pour qu'elle fonctionne correctement dans les modes d'optimisation? Ou ai-je utilisé à tort pour atteindre 1 ms d'interruption?

Répondre

5

L'une de vos variables (par exemple, timeOutCNT) est-elle modifiée dans un gestionnaire d'interruptions?

Si tel est le cas, assurez-vous de les déclarer comme volatile, par ex.

volatile int timeOutCNT; 

Cela empêche le compilateur de faire des optimisations qui supposent que timeOutCNT ne soit pas modifiée par les manipulateurs ou d'autres fils d'interruption.

+0

Et je crois que les différents compilateurs géreront de ne pas avoir 'volatile 'là-bas différemment même avec des optimisations élevées. – nategoose

+0

Salut Artelius, Merci pour la solution, cela a fonctionné pour moi. Vishal N – Vishal

Questions connexes