[fpc-devel] Freepascal in microcontrollers

Vinzent Hoefler JeLlyFish.software at gmx.net
Thu Feb 28 13:54:19 CET 2008


On Thursday 28 February 2008 13:09, Michael Schnell wrote:
> > Yes. That's what {$BIT_ORDER} would stand for (still, it would not
> > change *byte* order).
>
> I don't understand this. I don't think the bit order within a byte is
> to be considered changing.

Well, the question is, if the first bit in a record is the leftmost or 
the rightmost bit.

It's a matter of interpretation. But as Jonas pointed out, the order of 
the bits may change depending on the endianess (assuming I didn't 
misunderstand him).

> I would call the issue "byte-order" and (thus I'd prefer something
> like {$BIT_PACKED_BYTE_ORDER} or {$BIT_PACKED_ENDIAN}.

It's not byte order.

If I declare:

|bitpacked record
|   X : Byte;
|   Y : Byte;
|end record;

X will still be at the lowest address and Y will be at @X + 1. The issue 
arises when I say:

|bitpacked record
|   X : Boolean;
|   Y : Boolean;
|   Z : Two_Bit_Enum;
|end;

Assuming, bit 0 is the LSB, does the compiler access bit 0 and 1 (low 
order first) for X and Y or does it choose bit 7 and 6 (high order 
first) then? And how would it interprete a specific value for Z? At 
least two interpretations are possible:

X:7, Y:6, Z[5:4]   or   X:0, Y:1, Z[3:2]

ASCII graphic:

  |X|Y|Z|Z|-|-|-|-|
  |-|-|-|-|Z|Z|Y|X|

Ok, I guess, the issue with the enum is none, because the LSB is still 
at the right place on the data bus, no matter how you look at it. So 
forget that. ;)


Of course, there are more nasty things like

|bitpacked record
|   X : Boolean;
|   Y : Byte;
|end;

where a single value would cross the byte boundary... *headscratch* I 
guess, there's a reason, why endianess issues are not automatically 
handled by the compiler. :D


Vinzent.



More information about the fpc-devel mailing list