Привет Evgeny.
29 мар 06 14:43, Evgeny Kotsuba -> All:
EK> Вот такой код EK> volatile struct Msg { EK> long a; EK> long b; EK> long c; EK> long d; EK> unsigned char Buf[40]; EK> } MsgOut; EK> .... EK> *((short int *)&MsgOut.Buf[4+16]) = 0x7ff7; EK> *((int *) &MsgOut.Buf[4+18]) = 0x87654321; EK> упорно записывает 0x87654321 по смещению 20.
EK> И как это побороть ? #pragma pack(1) нарисовать ? А куда ? Я разве что EK> не "на бумажке печатал и насквозь смотрел"
Проверил твой пример в RVMDK v3.00a взяв за основу их пример Hello. Используемый компилятор CARM.
...
int main(void) { /* execution starts here */
#pragma pack(1) /* byte alignment */ volatile struct { long a; long b; long c; long d; unsigned char Buf[40]; } MsgOut; #pragma pack() /* reset to default alignment */
/* initialize the serial interface */ PINSEL0 = 0x00050000; /* Enable RxD1 and TxD1
*/ U1LCR = 0x83; /
* 8 bits, no Parity, 1 Stop bit
*/ U1DLL = 97; /
* 9600 Baud Rate @ 15MHz VPB Clock
*/ U1LCR = 0x03; /
* DLAB = 0
*/
printf("%p, %p, %p\n", MsgOut.Buf, &MsgOut.Buf[4+16], &MsgOut.Buf[4+18]);
*((short int*)&MsgOut.Buf[4+16]) = 0x7ff7;
*((int*)&MsgOut.Buf[4+18]) = 0x87654321;
for(;;); }
Результаты по симуляции: Окно Serial #2: 400003d4, 400003e8, 400003ea
Окно Memory #1, дамп памяти: 0x400003D4: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x400003E3: 00 00 00 00 00 F7 7F 21 43 65 87 00 00 00 00
Так что с выравниванием в CARM'е все в порядке. CA v2.51a, LA v2.51a .
2All: GCC в кейловском пакете давно уже нет, хотя настройки под него и остались, в текущей поставке идут родные и ARM тулзы.
Kosty K.