Такой код:
volatile unsigned int msCounter = 0;
...
if (msCounter >= 1000) {
msCounter = 0;
//...
}
Иногда сравнение выполняется неправильно и входит в блок при значении msCounter = 768. Установлено, что при двухбайтном сравнении происходит прерывание, в котором инкрементируется msCounter, что и приводит в последствии к ошибке.
if (msCounter >= 1000) { 00014A E9EB LDI R30,0x9B 00014C E0F1 LDI R31,0x01 00014E 8100 LD R16,Z ...тут прерывание и инкрементирование сравниваемой величины... 000150 8111 LDD R17,Z+1 000152 3E08 CPI R16,0xE8 000154 4013 SBCI R17,0x03 000156 F390 BRCS 0x13C ...
Вопрос: Можно ли заставить компилятор автоматически разруливать такие вещи?? Или это нужно постоянно держать в голове и делать вот так:
__disable_interrupt();
if (msCounter >= 1000) {
msCounter = 0;
//...
}
__enable_interrupt();
Заранее благодарен!
|