|
|
View previous topic :: View next topic |
Author |
Message |
drawbars
Joined: 07 Mar 2006 Posts: 8 Location: Ashby, MA
|
Using a RAM structure as a byte array |
Posted: Tue Mar 07, 2006 7:02 pm |
|
|
Hi All,
This is probably old hat to some of you, and while I've done it 1,000x in Assembler, I'm unsure of how to go about it in PICC ...
I have a project where I occasionally need to send system status out a serial interface. The data in the status is NOT all the same size, so an array doesn't eliminate my problems:
int16 variable1;
int8 variable2;
int8 variable3;
int8 variable4;
int32 variable5;
I want to be able to access them as individual variables of varying sizes, AND I want to be able to use a pointer to variable1 to send the whole mess out a serial port, in one gulp, high-endian, without having to worry about the byte sizes. This is not a bulk backup to storage; byte order matters at the other end.
The question that I have is, since PICC handles all of the RAM management behind the scenes, how can I guarantee that these five variables will occupy 9 continguous locations in the compiled program? Will a structure alone guarantee this? (The manual and help file aren't much ... er, help on this matter.)
And when I go to set a pointer to the collection, can I just typecast a byte pointer to variable1, and they'll all come out in order? Or am I asking for byte-swapping, invalid data, etc.? The only 100% safe way that I can think of is to define a structure, then create a union with an array of 9 bytes. That seems ludicrous, given that the result is in the form of a.b->c -- C is supposed to be EASIER than Assembler, not harder! Any thoughts?
TIA,
-BW |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Tue Mar 07, 2006 8:50 pm |
|
|
Quote: |
I want to be able to access them as individual variables of varying sizes,
AND I want to be able to use a pointer to variable1 to send the whole
mess out a serial port, in one gulp, high-endian, without having to worry
about the byte sizes. This is not a bulk backup to storage; byte order
matters at the other end. |
16 and 32 bit variables are stored in Lo-Hi format. So if you want
to send them out MSB first, you can't do it by creating a pointer to
the first byte.
Quote: |
how can I guarantee that these five variables will occupy 9 continguous
locations in the compiled program? Will a structure alone guarantee this? |
In CCS, it will. The default packing alignment is on byte boundaries. |
|
|
treitmey
Joined: 23 Jan 2004 Posts: 1094 Location: Appleton,WI USA
|
|
Posted: Wed Mar 08, 2006 8:44 am |
|
|
PCM is right. For me I take care of this at PC side
((since it has the horsepower))
To simply send them out in consecutive bytes, you can use a array,,... a struct in your case since they change in size.
Then you can have a ponter to the struct and get all the fun . -> stuff
and a pointer to the buffer you want to send.
take a look at modbus packt struct modbus
http://www.ccsinfo.com/forum/viewtopic.php?t=19306&highlight=modbus |
|
|
drawbars
Joined: 07 Mar 2006 Posts: 8 Location: Ashby, MA
|
|
Posted: Fri Mar 10, 2006 8:20 am |
|
|
Hi PCM,
Thanks. It looks like a struct is all I need to keep the bytes in line.
And while I said "high-endian," I meant low-endian (the other high-endian! ), so that should work out OK, too.
Regards,
-BW
Bruce Wahler
Design Consultant
Ashby Solutions™
http://consult.ashbysolutions.com |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|