Код
#include <inavr.h>
typedef struct {
unsigned char sec:1;
} statusDef;
extern volatile statusDef STATUS;
unsigned char essTime (unsigned char keys) {
__save_interrupt; //warning
__disable_interrupt; //warning
STATUS.sec = 0;
__restore_interrupt; //warning
return 0;
}
__task void main (void) {
__enable_interrupt();
essTime (0);
while (1) {
}
}
typedef struct {
unsigned char sec:1;
} statusDef;
extern volatile statusDef STATUS;
unsigned char essTime (unsigned char keys) {
__save_interrupt; //warning
__disable_interrupt; //warning
STATUS.sec = 0;
__restore_interrupt; //warning
return 0;
}
__task void main (void) {
__enable_interrupt();
essTime (0);
while (1) {
}
}
Генерированный код функции essTime:
Код
LDI R30,0x60
LDI R31,0x00
LD R16,Z
ANDI R16,0xFE
ST Z,R16
LDI R16,0x00
RET
LDI R31,0x00
LD R16,Z
ANDI R16,0xFE
ST Z,R16
LDI R16,0x00
RET
Я считаю, что между LD и ST может возникнуть прерывание, изменяющее volatile переменную, и данный код её испортит. Почему компилятор со мной не согласен? Спасибо.