roelof 't Hooft
2012-07-23 14:36:08 UTC
Hi all,
It is me again with a pointer issue :-(
(that is an ongoing battle with me)
I would like to know if there is a better way to do
what I have done in the next source code :
extern.h :
#define _cast_message (volatile __xdata struct _message *)
typedef struct _message
{
uint8_t address;
uint8_t trx_bytes;
uint8_t rcv_bytes;
uint8_t control;
uint8_t buffer[16];
};
extern volatile __xdata struct _message *message;
uint16_t externe_init(uint8_t);
extern.c :
volatile __xdata struct _message *message;
volatile __xdata uint8_t memoryspace[16 + 4];
uint16_t externe_init(uint8_t databyte)
{
message = _cast_message &memoryspace[0];
...;
message->address = databyte;
message->buffer[10] = 0x96;
...;
return (uint16_t)&message->address;
}
main.c :
void main(void)
{
message = _cast_message externe_init(0x30);
...;
}
I have a structure which I would like to access in other c files.
To have an actual piece of RAM I needed to create some with the
memoryspace buffer and get that address in the pointer message
(a poor man's malloc function).
After some hacking I also got the address exported to the main
function. So far so good.
I know this is not good coding but I am unable to find a better
way of doing this.
If I do not get the address of memoryspace into message it will
be zero. I can understand that but I defined the memory as 0x1000
bytes large starting at 0x7000. What is going on there ?
I expected the compiler/linker to complain about that.
sdcc version :
SDCC : mcs51 3.2.1 #8035 (11 Jul 2012) (Linux)
command line to compile :
sdcc -D_87c591 -c --model-small --code-size 0x7000 --xram-size 0x1000
--xram-loc 0x7000 --iram-size 0xff extern.c
sdcc -D_87c591 -c --model-small --code-size 0x7000 --xram-size 0x1000
--xram-loc 0x7000 --iram-size 0xff main.c
sdcc --code-size 0x7000 --xram-size 0x1000 --xram-loc 0x7000 --iram-size
0xff main.rel extern.rel
packihx main.ihx > main.hex
Thanks,
roelof
It is me again with a pointer issue :-(
(that is an ongoing battle with me)
I would like to know if there is a better way to do
what I have done in the next source code :
extern.h :
#define _cast_message (volatile __xdata struct _message *)
typedef struct _message
{
uint8_t address;
uint8_t trx_bytes;
uint8_t rcv_bytes;
uint8_t control;
uint8_t buffer[16];
};
extern volatile __xdata struct _message *message;
uint16_t externe_init(uint8_t);
extern.c :
volatile __xdata struct _message *message;
volatile __xdata uint8_t memoryspace[16 + 4];
uint16_t externe_init(uint8_t databyte)
{
message = _cast_message &memoryspace[0];
...;
message->address = databyte;
message->buffer[10] = 0x96;
...;
return (uint16_t)&message->address;
}
main.c :
void main(void)
{
message = _cast_message externe_init(0x30);
...;
}
I have a structure which I would like to access in other c files.
To have an actual piece of RAM I needed to create some with the
memoryspace buffer and get that address in the pointer message
(a poor man's malloc function).
After some hacking I also got the address exported to the main
function. So far so good.
I know this is not good coding but I am unable to find a better
way of doing this.
If I do not get the address of memoryspace into message it will
be zero. I can understand that but I defined the memory as 0x1000
bytes large starting at 0x7000. What is going on there ?
I expected the compiler/linker to complain about that.
sdcc version :
SDCC : mcs51 3.2.1 #8035 (11 Jul 2012) (Linux)
command line to compile :
sdcc -D_87c591 -c --model-small --code-size 0x7000 --xram-size 0x1000
--xram-loc 0x7000 --iram-size 0xff extern.c
sdcc -D_87c591 -c --model-small --code-size 0x7000 --xram-size 0x1000
--xram-loc 0x7000 --iram-size 0xff main.c
sdcc --code-size 0x7000 --xram-size 0x1000 --xram-loc 0x7000 --iram-size
0xff main.rel extern.rel
packihx main.ihx > main.hex
Thanks,
roelof