Accessing fixed addresses
Rolf Fiedler
Rolf.Fiedler@ferrari.de
Wed Mar 3 23:29:00 GMT 1999
>
> I've seen structures defined for devices with large register sets. Then
> an instance of that structure is defined as extern for each device.
> These go in a header file.
>
> eg.
> typedef struct device
> {
> unsigned short reg1;
> unsigned long reg2;
> }
>
> extern device device1;
> extern device device3;
> extern device device2;
>
> The address of each device is then defined/set in a linker command file.
> (eg. linkcmds). The symbols can also be set by linker flags/switches on
> the CC or LD command.
>
> I think this will do what you want.
I do not think this is a good idea at all. The compiler may put that
structure
packed or unpacked into memory, so this is highly compiler dependent.
And then you start messing around with #pragma pack and all that
nonsense.
I have even seen this kind of code for network applications, for
structures
of data that is going to be sent via the interface... yak.
Furthermore there should at least be a volatile, otherwise you may end
up not reading the chips register but the copy in a CPU register.
why not have something like:
volatile const unsigned long *chip_base=(const unsigned char
*)0x12345678;
It is smart not to use int for long when accessing hardware - if you
want your code
to be portable :-).
enum offsets {
FIRST_REG,
SECOND_REG,
etc.
};
and access by referencing chip_base[SECOND_REG]
Problem here is that is you want to use the same definition in more than
one C-File you have to create a header-file and a seperately linked C
file
for it, or make the pointer static.
--
+-----------------+--------------------------------------------------+
| _____ | Rolf Fiedler |
| / ___/ | Electronic Design Engineer |
| / _/ | Ferrari electronic AG |
| /_/e/r/r/a/r/i/ | phone: +49 3328 4559 0 fax: +49 3328 4559 60 |
| electronic | E-Mail: Rolf.Fiedler@Ferrari.DE |
+-----------------+--------------------------------------------------+
"Where do you want to go tomorrow?"
_______________________________________________
New CrossGCC FAQ: http://www.objsw.com/CrossGCC
_______________________________________________
To remove yourself from the crossgcc list, send
mail to crossgcc-request@cygnus.com with the
text 'unsubscribe' (without the quotes) in the
body of the message.
More information about the crossgcc
mailing list