Stephen:
I have been using memcpy() to copy stucts (sometimes several of them) into a
buffer. I then call write() on the buffer and then the opposite
at the other end. I think this is the same thing as calling write() on a
structure. I have been doing something like:
unsigned char *pu8to = &buffer;
unsigned char *pu8from = &struct;
for(int i=0; i<sizeof(struct); i++){
*pu8to++ = *pu8from++
}
write(fd, buffer, sizeof(struct));
If I understand you, this means that my code might fail when both ends of a fifo
were not compiled by the same gcc version or when both ends of a network are not
compiled by the same gcc version or are differing platforms.
I am trying to imagine some reasonable way to unpack / pack structures across a
network that does not depend upon some structure being organized in the same
manner at both ends. This is the only thing that I could come up with:
struct USED_BOTH_IN_RTL_AND_LINUX_1
{
type1 member1;
type2 member2;
type3 member2;
};
struct USED_BOTH_IN_RTL_AND_LINUX_2
{
type4 member1;
type5 member2;
type6 member3;
USED_BOTH_IN_RTL_AND_LINUX_1 member4
...
};
unsigned char buffer[sizeof(USED_BOTH_IN_RTL_AND_LINUX_2)];
USED_BOTH_IN_RTL_AND_LINUX_2 object1;
unsigned char *pu8s = (unsigned char *) &object1.member1;
unsigned char *pu8d = (unsigned char *) &buffer;
unsigned n;
n = sizeof(object1.member1);
memcpy(pu8d, pu8s, n);
pu8d += n;
pu8s = (unsigned char *) &object1.member2;
n = sizeof(object1.member2);
memcpy(pu8d, pu8s, n);
pu8d += n;
pu8s = (unsigned char *) &object1.member3;
n = sizeof(object1.member3);
memcpy(pu8d, pu8s, n);
pu8d += n;
pu8s = (unsigned char *) &object1.member4.member1;
n = sizeof(object1.member4.member1);
memcpy(pu8d, pu8s, n);
pu8d += n;
pu8s = (unsigned char *) &object1.member4.member2;
n = sizeof(object1.member4.member2);
memcpy(pu8d, pu8s, n);
pu8d += n;
....
This does depend upon the size of the types involved being the same size at both
ends and I think that it requires the bytes in the types, (int for example) to
be stored in the same order at both ends.
How do you do it?
Wayne
> Mr. Calianu Wrote:
> > More specifically, I plan on writing structs into the fifo and reading
> > them in userland.
>
"Stephen D. Cohen" wrote:
> Then you are already dooming yourself to a great deal of pain.
> Avoid simply using rtf_put on a struct and expecting the same thing in user
> space. That is, of course, unless you are willing to sort through every
> compiler option and optimization setting to make absolutely certain that the
> structs will be aligned exactly the same way in RT space and user space. It
> would be much better to simply define your own format for the data in the
> FIFO and copy out of the struct to a buffer, send the buffer, then copy out
> of the buffer into your struct. This also assures that your code is
> maximally portable across platforms, etc.
>
> You will be amazed to find that it is *much* easier to textualize /
> bufferize it yourself and disassemble the buffers at the other end, rather
> than simply writing structs. You will find this the first time the darned
> compiler bites you in the rear end and you spend two days tracking down why
> something that obviously works doesn't. You may not find this until your
> version of gcc changes or some such. By then you won't remember that you
> might have a problem. In that case, expect to spend the whole week tracking
> this down. Creating the buffers properly, on the other hand, will only take
> an hour of your life and you will have the pleasure of the knowledge of a
> job done properly. Your choice. :-)
>
> Regards,
>
> Steve Cohen
>
> --------------------------
> Stephen D. Cohen
> Xybion Sensor Positioning Systems
> 11528 53rd Street North
> Clearwater, FL 33760
> Voice: (727) 299-0150
> Fax: (727) 299-0804
> [EMAIL PROTECTED]
> www.xybion.com
>
> -- [rtl] ---
> To unsubscribe:
> echo "unsubscribe rtl" | mail [EMAIL PROTECTED] OR
> echo "unsubscribe rtl <Your_email>" | mail [EMAIL PROTECTED]
> --
> For more information on Real-Time Linux see:
> http://www.rtlinux.org/
-- [rtl] ---
To unsubscribe:
echo "unsubscribe rtl" | mail [EMAIL PROTECTED] OR
echo "unsubscribe rtl <Your_email>" | mail [EMAIL PROTECTED]
--
For more information on Real-Time Linux see:
http://www.rtlinux.org/