Код на уровне 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;
}
#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
}
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
}