|
Был вот такой простой код:
volatile unsigned int cnt_user_timeout = 0;
void delay_ms10 (unsigned int ms10)
{
cnt_ms10_delay = ms10;
while(cnt_ms10_delay) continue;
}
void user_isr_handler (void)
{
if (cnt_ms10_delay) cnt_ms10_delay--;
...
}
В IAR 2.21 при оптимизации Speed-Medium было:
void delay_ms10 (unsigned int ms10)
MOV.W R12, &cnt_ms10_delay
??delay_ms10_0:
CMP.W #0x0, &cnt_ms10_delay
JNE ??delay_ms10_0
RET
т.е. все правильно, а вот IAR 3.10 с той же оптимизацией выдал вот такой перл:
void delay_ms10 (unsigned int ms10)
MOV.W R12, &cnt_ms10_delay
??delay_ms10_0:
CMP.W #0x0, R12
JNE ??delay_ms10_0
RET
Т.е. volatile был проигнорирован.
Так что похоже, Improved compiler optimizations несет в себе новые сюрпризы
E-mail: info@telesys.ru