Цитата(zltigo @ Aug 27 2007, 23:06)

Ой! "А мужики-то и не знают"

.
Заменяет, когда может, а гогда Warning? тогда, простите, не смогли заменить, ибо чего предупреждать, если все в порядке.
Warning - потому что производительность упадет.
Но с выполнением все действительно в порядке.
У меня была диллема c RFC2198 (хидер нечетной длины!) копировать содержимое блоков на выровненный адрес, обрабатывать и пихать обратно в пакет, либо применить указатель на __packet структуру.
Дык, второе (смотрел по асм листингу - обращения через LDRB/STRB) получилось работает быстрее.
Цитата
Ну а почему в вышеупомянутом случае работает - это IAR.
...
Багофича у него такая .
Работает и с RVCT и с STD251..
Нет багофичи там..
Пример, "С" код:
Код
typedef __packed struct tagTest
{
U32 x;
} TTST_STRUCT, *PTST_STRUCT;
U8 a[ sizeof( TTST_STRUCT ) + 1 ];
void main(void)
{
PTST_STRUCT pTstStruct = (PTST_STRUCT)&a[1];
pTstStruct->x = 11223344;
asm listing:
Код
164: void main(void)
165: {
0x00001420 E92D4000 STMDB R13!,{R14}
0x00001424 E24DD004 SUB R13,R13,#0x00000004
166:
167: PTST_STRUCT pTstStruct = (PTST_STRUCT)&a[1];
168:
0x00001430 E59F4238 LDR R4,[PC,#0x0238]
169: pTstStruct->x = 11223344;
170:
0x00001434 E59F3238 LDR R3,[PC,#0x0238]
0x00001438 E1A00004 MOV R0,R4
0x0000143C E5C03000 STRB R3,[R0]
0x00001440 E1A03423 MOV R3,R3,LSR #8
0x00001444 E5C03001 STRB R3,[R0,#0x0001]
0x00001448 E1A03423 MOV R3,R3,LSR #8
0x0000144C E5C03002 STRB R3,[R0,#0x0002]
0x00001450 E1A03423 MOV R3,R3,LSR #8
0x00001454 E5C03003 STRB R3,[R0,#0x0003]