Перейти к содержанию
    

Оптимизация кода не принимает во внимание ISR

У меня проблема такая возникла с компилятором 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
}

Изменено пользователем Student2

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если flagWasI2C изменяется асинхронно по отношению к основному процессу, т. е. в прерывании, то надо было объявить её как volatile.

extern volatile uint8_t flagWasI2C;
// в файле с прерыванием:
uint8_t volatile flagWasI2C;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...