Struct emballage et alignement avec mingw

J’émule du code à partir d’un système intégré (stm32, Keil µVision 5, MDK-ARM) sur un PC (mingw32, arc 32 bits). L’alignement du compilateur ARM ne correspond pas à ma version de bureau:

// ARM Code (ARM comstackr uses __packed) typedef __packed struct _file { uint8_t var1; uint16_t var2; } FILE; // PC mingw gcc code trying to emulate layout above. typedef struct __atsortingbute__((packed, aligned(1))) _file { uint8_t var1; uint16_t var2; } FILE; 

Dans la source, je fais ce qui suit: file.var1 = 0x22; file.var2 = 0xAA55; file.var1 = 0x22; file.var2 = 0xAA55; qui est ensuite écrit en mémoire. Lorsque je lis la mémoire sur le système intégré, elle affiche 0x22, 0x55, 0xAA . Sur la machine Windows, il lit 0x22, 0xFF, 0x55, 0xAA , avec un bourrage au deuxième octet. Comment puis-je corriger ce comportement?

Je l’ai réglé moi-même -> Comstackr avec -mno-ms-bitfields aide! Le code ci-dessus est en effet correct. Il est nécessaire de dire à mingw d’utiliser l’organisation de bitfield de gcc au lieu du style microsoft. Bien que le code puisse être incompatible avec les compilateurs Microsoft, cela ne me dérange pas pour le moment.

atsortingbut emballé est cassé sur les compilateurs mingw32 . Une autre option consiste à utiliser le pragma pack :

 #pragma pack(1) typedef struct _file { uint8_t var1; uint16_t var2; } FILE; 

Pourquoi ne pas placer des éléments de structure par ordre de taille décroissant? Vous n’avez pas besoin de vous soucier de l’octet de remplissage.

 // ARM Code typedef struct _file { uint16_t var2; uint8_t var1; } FILE; typedef struct _file { uint16_t var2; uint8_t var1; } FILE; 

Selon les exemples du manuel GCC , l’ atsortingbute devrait aller après les champs de la structure, à savoir:

 // PC Code typedef struct { uint8_t var1; uint16_t var2; } __atsortingbute__((packed, aligned(1))) FILE; 

J’ai également laissé tomber la balise de struct inutile ( _file ).

Ce qui précède a une valeur de sizeof de 3 lorsque je l’ai testé rapidement.