This is the mail archive of the crossgcc@cygnus.com mailing list for the crossgcc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Re: Accessing fixed addresses


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.
Brendan Simon.



John Breen wrote:

> What is the best way to define fixed memory locations in C, such as
> hardware device registers?  In particular, I'd like to set it up so
> that I can easily define multiple groups of identical hardware
> registers at different locations, and have the compiler optimize the
> accesses as much as possible.
>
> Here's an example: suppose I have a chip in my system that has three
> registers (A, B, C) mapped to sequential addresses BASE, BASE+4,
> BASE+8, respectively, where BASE is defined elsewhere.  An easy way to
> do this might be:
>
>     #define REG_A (unsigned int)(BASE)
>     #define REG_B (unsigned int)(BASE+4)
>     #define REG_C (unsigned int)(BASE+8)
>
> Using #define seemed a bit ugly, so I did the following:
>
>     volatile unsigned int *const reg_A = (void *)(BASE);
>     volatile unsigned int *const reg_B = (void *)(BASE+4);
>     volatile unsigned int *const reg_C = (void *)(BASE+8);
>
> and put these in a .h file.  This worked pretty well; the pointers
> gave me a symbolic way to access the locations in the debugger, and
> gcc optimized the code so that the memory locations were accessed
> directly, rather than through the pointer, so there was no access
> overhead.
>
> The problem was when I tried to use the .h file in more than one
> object file, and then link them.  As one would expect, I got multiple
> definition errors.
>
> If I make the .h file only have extern declarations, and put the
> actual pointers in a .c file, the compiler won't be able to optimize
> to direct memory accesses (I assume).  Also, my .h file was actually a
> bit more complicated than above: I had a macro to append a prefix to
> the register name so I could define different prefixes and bases for
> multiple chips.  With an extern-only .h file, I'd have to have a
> different object file of pointers for each chip.
>
> I'm sure others have gone down this path before.  Can anyone share
> any neat little tricks?
>
> Thanks.
> --
> John A. Breen
> jab3@hotmail.com
>
> ______________________________________________________
> Get Your Private, Free Email at http://www.hotmail.com
> _______________________________________________
> 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.
begin:vcard 
n:Simon;Brendan
tel;fax:+61 3 9886 0269
tel;home:+61 3 9561 0817
tel;work:+61 3 9886 0128
x-mozilla-html:TRUE
org:CTAM Pty Ltd
adr:;;469 Springvale Rd;Glen Waverly;Victoria;3150;Australia
version:2.1
email;internet:brendan@dgs.monash.edu.au
title:Embedded Systems Design Engineer
x-mozilla-cpt:;-7584
fn:Brendan Simon
end:vcard