Цитата(sensor_ua @ Mar 31 2007, 09:00)

Вспоминается, что если S0SPSR объявлен как volatile, то не должон. Если правда игнорит, то действительно невесело.
В том то и дело:
Код
#define __IO_REG32_BIT(NAME, ADDRESS, ATTRIBUTE, BIT_STRUCT)\
volatile __no_init ATTRIBUTE union \
{ \
unsigned long NAME; \
BIT_STRUCT NAME ## _bit; \
} @ ADDRESS
__IO_REG32_BIT(S0SPSR, 0xE0020004,__READ,__spsr_bits);
//-----------------------------------
S0SPSR = 0;
S0SPSR; // Warning[Pe174]: expression has no effect
S0SPSR = 0;
//-----------------------------------
379 S0SPSR = 0;
\ 000001BC 041082E5 STR R1,[R2, #+0x4]
380 S0SPSR;
381 S0SPSR = 0;
\ 000001C0 041082E5 STR R1,[R2, #+0x4]
Я помню,
ReAl когда-то писал, что подобные выражения оформляет как (void)S0SPSR; чтобы самому себе напомнить, что это не описка а чтение. Но, увы, IAR тут делает большой промах. Хотя по доке вроде все нормально:
Цитата
Descriptions of implementation-defined behavior
Access to volatile objects (6.5.3)
Any reference to an object with volatile qualified type is an access.
Смущает только упоминание implementation-defined behavior. Надо будет на работе в стандарт глянуть - что там об этом случае сказано.
P.S. Ветка как-то плавно уползла от AVR к ARM, но описанная проблема относится ко всем IAR, с которыми работал.