Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Оптимизация кода не принимает во внимание ISR
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
Student2
У меня проблема такая возникла с компилятором IAR 5.3 для AVR, камень Tiny88 - оптимизатор не 'видит' что переменная можно менять в прерывание. В результате код не правильно оптимизирован - MoreCode() удален так как while (flagWasI2C != 1) всегда true.

Код на уровне main() в MainCode.c модуле:
Код
  
extern uint8_t flagWasI2C;
void main(void)
{
.......
Protect();                                  
  flagWasI2C = 0;
  UnProtect();
  
   do   // wait for I2C communication
   {
    __watchdog_reset();                  
   }  while (flagWasI2C != 1);

  MoreCode();  // this section is not compiled
}

Protect() - CLI, UnProtect - SEI

и в перерывание для TWI (находиться в I2C.c модуле):
Код
uint8_t flagWasI2C;
#pragma vector=TWI_vect
__interrupt void TWI_ISR( void )  
{
  DoSomething();
  flagWasI2C = 1;      
}


При компиляции с максимальной оптимизации можно увидеть что MoreCode() просто удален - переменная flagWasI2C установлена в нуль и в main() не видно что она можно меняться в TWI ISR.

Как можно обмануть компилятор чтобы он не удалял MoreCode()?



Нашел что если поставит операция с регистрами и как то оптимизатор начинает правилно 'смотреть' и код работает:

Код
extern uint8_t flagWasI2C;
void main(void)
{
.......
Protect();                                  
  flagWasI2C = 0;
  UnProtect();
  
   DDRA = 12; // и MoreCode() уже присуствует!!!

   do   // wait for I2C communication
   {
    __watchdog_reset();                  
   }  while (flagWasI2C != 1);

  MoreCode();  // this section is not compiled
}
IgorKossak
Если flagWasI2C изменяется асинхронно по отношению к основному процессу, т. е. в прерывании, то надо было объявить её как volatile.
Код
extern volatile uint8_t flagWasI2C;
// в файле с прерыванием:
uint8_t volatile flagWasI2C;
Student2
Спасибо - сейчас работает!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.