Таймер использования в msp430 в режиме оптимизации высокого компилятора - PullRequest
0 голосов
/ 13 июня 2010

Я использовал таймер A в MSP430 с высокой оптимизацией компилятора, но обнаружил, что мой код таймера дает сбой при использовании высокой оптимизации компилятора.Когда оптимизация не используется, код работает нормально.

Этот код используется для достижения таймера 1 мс.timeOutCNT увеличивается при прерывании.

Ниже приведен код,

        //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

Может кто-нибудь помочь мне решить эту проблему?Есть ли другой способ, которым мы можем использовать таймер А, чтобы он нормально работал в режимах оптимизации?Или я использовал неправильно для достижения прерывания 1 мс?

1 Ответ

5 голосов
/ 13 июня 2010

Изменены ли какие-либо из ваших переменных (например, timeOutCNT) в обработчике прерываний?

Если это так, убедитесь, что вы объявили их как volatile, например,

volatile int timeOutCNT;

Это предотвращает оптимизацию компилятором, предполагающую, что timeOutCNT не изменяется обработчиками прерываний или другими потоками.

...