Мой код таймера не работает, когда IAR настроен на максимальную оптимизацию - 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 мс?

Ответы [ 3 ]

1 голос
/ 14 июня 2010

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

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

1 голос
/ 14 июня 2010

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

while (timeOutCNT <= 1); </p>

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

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

while (1) ;

0 голосов
/ 14 июня 2010

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

...