I'm using the Keil uVision3. How do I pack structs?
Do I use __packed or is there a pragma?
is this correct? it doesn't compile...
typedef struct { UINT8 key_diff; UINT8 key_state; } __packed SCmd_KeyPress;
How do I pack structs?
This merits two answers. A generic one, and one specific to C51.
Generic: You quite probably shouldn't. It's far less often a good idea than many people seem to think. The compiler usually has good reasons why it pads structs --- are you really sure you know better than your tool vendor?
C51: You don't. There's no padding to be removed. Which begs the question: why are you even asking about it?
I'll give you a real example. back in the late 80's I was working with the Franklin compiler. Remember that? it was actually the first Keil compiler rebranded by franklin. That code created a buffer of data bytes in a structure and sent them out to a PC. The PC code was written in microslut C 1.5. The interrupt routine would buffer the characters into a buffer, which I then overlayed with the C structure from the 8051. Nothing matched up right. Turned out that structures in the microslut compiler had padding inserted, and that made the structure not line up right.
If you have a mixed structure, say one with a generic pointer and a memory typed pointer in the Keil compiler, and attempt to access it with an overlay of another structure, you will find that you have alignment problems, because of the extra padding byte (memory address type) that the compiler put in behind the scenes for a generic pointer. So there can be structure misalignments even on the 8051. Cheers
"If you have a mixed structure, say one with a generic pointer and a memory typed pointer in the Keil compiler, and attempt to access it with an overlay of another structure, you will find that you have alignment problems"
That has nothing whatsoever to do with alignment or packing - they are just two differently-sized data types!
"extra padding byte (memory address type)"
It is not a padding byte - it is a "functional" byte that carries additional information.
"compiler put in behind the scenes for a generic pointer."
It's not "behind the scenes" - it is a fully documented, essential part of a Keil C51 Generic Pointer!
View all questions in Keil forum