имеем обработчик
Код
#pragma vector=PORT1_VECTOR
__interrupt void PORT1ISR(void)
{
KbDrvTask.SendEv(P1IFG,P1IES);
P1IES ^= P1IFG;
P1IFG = 0;
}
__interrupt void PORT1ISR(void)
{
KbDrvTask.SendEv(P1IFG,P1IES);
P1IES ^= P1IFG;
P1IFG = 0;
}
После компиляции получаем ворнинг
Warning[Pa082]: undefined behavior: the order of volatile accesses is undefined in this statement
на строки
KbDrvTask.SendEv(P1IFG,P1IES);
P1IES ^= P1IFG;
В листинге все выглядит красиво
Код
151 __interrupt void PORT1ISR(void)
\ ??PORT1ISR:
152 {
\ 000000 0D12 PUSH.W R13
\ 000002 0C12 PUSH.W R12
\ 000004 0F12 PUSH.W R15
\ 000006 0E12 PUSH.W R14
153 KbDrvTask.SendEv(P1IFG,P1IES);
\ 000008 52122400 PUSH.B &0x24
\ 00000C 5E422300 MOV.B &0x23, R14
\ 000010 3C40.... MOV.W #KbDrvTask, R12
\ 000014 B012.... CALL #??SendEv
154 P1IES ^= P1IFG;
\ 000018 D2E223002400 XOR.B &0x23, &0x24
155 P1IFG = 0;
\ 00001E C2432300 MOV.B #0x0, &0x23
156 }
\ 000022 2153 ADD.W #0x2, SP
\ 000024 3E41 POP.W R14
\ 000026 3F41 POP.W R15
\ 000028 3C41 POP.W R12
\ 00002A 3D41 POP.W R13
\ 00002C 0013 RETI
\ ??PORT1ISR:
152 {
\ 000000 0D12 PUSH.W R13
\ 000002 0C12 PUSH.W R12
\ 000004 0F12 PUSH.W R15
\ 000006 0E12 PUSH.W R14
153 KbDrvTask.SendEv(P1IFG,P1IES);
\ 000008 52122400 PUSH.B &0x24
\ 00000C 5E422300 MOV.B &0x23, R14
\ 000010 3C40.... MOV.W #KbDrvTask, R12
\ 000014 B012.... CALL #??SendEv
154 P1IES ^= P1IFG;
\ 000018 D2E223002400 XOR.B &0x23, &0x24
155 P1IFG = 0;
\ 00001E C2432300 MOV.B #0x0, &0x23
156 }
\ 000022 2153 ADD.W #0x2, SP
\ 000024 3E41 POP.W R14
\ 000026 3F41 POP.W R15
\ 000028 3C41 POP.W R12
\ 00002A 3D41 POP.W R13
\ 00002C 0013 RETI
и в железе работает правильно, но неприятный осадок остался

Кто нибудь может объяснить смысл ворнинга "порядок доступов к волатайлам неопределен"