Hallo, ich habe folgende Programmcode und weiss leider nicht, was ich machen soll. In der Zeile " *((_attribute_ ((packed)) DWORD *)pData) = USBRxData;" sollen der Werte "0x01006080", der in USBRxData steht, geschrieben werden. Der pDATA steht aber auf einer ungeraden Adresse. Wenn nun die Zeile "*((_attribute_ ((packed)) DWORD *)pData) = USBRxData;" kommt, wird aber der Wert nicht auf ungerade Adresse geschrieben, sondern auf die nächste gerade Adresse. In diesem Fall eine Adresse tiefer. Wie kann ich dieses dem Compiler mitteilen, dass er auch auf eine ungerade Adresse schreiben soll? Gruss Harry Folgender Programmcode: typedef union { WORD W; struct { BYTE L; BYTE H; } _attribute_ ((packed)) WB; } _attribute_ ((packed)) WORD_BYTE; /* bmRequestType Definition */ typedef union _REQUEST_TYPE { struct _BM { BYTE Recipient : 5; BYTE Type : 2; BYTE Dir : 1; } _attribute_ ((packed)) BM; BYTE B; } _attribute_ ((packed)) REQUEST_TYPE; /* USB Default Control Pipe Setup Packet */ typedef struct _USB_SETUP_PACKET { REQUEST_TYPE bmRequestType; BYTE bRequest; WORD_BYTE wValue; WORD_BYTE wIndex; WORD wLength; } _attribute_ ((packed)) USB_SETUP_PACKET; USB_SETUP_PACKET SetupPacket; USB_ReadEP(0x00, (BYTE *)&SetupPacket); DWORD USB_ReadEP (DWORD EPNum, BYTE *pData) { DWORD cnt, n; USBCtrl = ((EPNum & 0x0F) << 2) | CTRL_RD_EN; do { cnt = USBRxPLen; } while ((cnt & PKT_RDY) == 0); cnt &= PKT_LNGTH_MASK; for (n = 0; n < (cnt + 3) / 4; n++) { *((_attribute_ ((packed)) DWORD *)pData) = USBRxData; pData += 4; } ...... Struktur: typedef union { WORD W; struct { BYTE L; BYTE H; } _attribute_ ((packed)) WB; } _attribute_ ((packed)) WORD_BYTE; /* bmRequestType Definition */ typedef union _REQUEST_TYPE { struct _BM { BYTE Recipient : 5; BYTE Type : 2; BYTE Dir : 1; } _attribute_ ((packed)) BM; BYTE B; } _attribute_ ((packed)) REQUEST_TYPE; /* USB Default Control Pipe Setup Packet */ typedef struct _USB_SETUP_PACKET { REQUEST_TYPE bmRequestType; BYTE bRequest; WORD_BYTE wValue; WORD_BYTE wIndex; WORD wLength; } _attribute_ ((packed)) USB_SETUP_PACKET;
Einzelne Bytes zuweisen? memcpy verwenden? Den Angaben nach scheint dies ja weniger ein Compiler-Problem als vielmehr eine versteckte Optimierung des Prozessors zu sein, die keine DWORD - Zuweisungen auf ungerade Adressen erwartet. Welcher Prozessor ist das?
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.