2010-06-13 6 views
0

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

Этот код используется для достижения таймера таймера 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 

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

ответ

0

Я не могу комментировать конкретно ваш код таймера, но я видел подобную проблему в целом. Когда использовались высокие уровни оптимизации, код разрывался бы в разных местах, казалось бы, несвязанными способами. Мы в конечном счете сделали это для ошибок компилятора, а затем полностью отключили оптимизацию.

1

Есть TIMER_A_TACTL и другие volatile? В противном случае компилятор может переупорядочить или объединить чтения и записи в предположении, что они не имеют побочных эффектов.

Вы должны быть в состоянии решить, либо вводя barriers в соответствующих положениях, или объявляя эти переменные как volatile

1

Посмотрите на выходе список файлов, чтобы увидеть, содержит ли выходной ассемблер выход для линии

while (timeOutCNT < = 1);

Если вы используете версию kickstart для компилятора, тогда файл списка не будет содержать список ассемблера, и вы должны загрузить код в C-Spy и посмотреть там, где находится дизассемблер.

Я подозреваю, что Hasturkun находится по правому краю, поскольку вы, вероятно, не объявили timeOutCNT, как volatile. Если вы забудете об этом, оптимизатор будет считать, что оператор while сократится до

while (1) ;

Смежные вопросы