Technical Support

C51: STATIC POINTERS VS EXPLICITLY PLACED VARIABLES


Information in this article applies to:

  • All Projects

SYMPTOM

My project includes several peripherals mapped into XDATA space. I want to access the registers of these peripherals, and I've declared a series of static pointers to address them. For example:

xdata volatile unsigned char *pReg1 = 0x1234;

I also assigned these values to other pointers, like this:

xdata volatile unsigned char *regPtr = pReg1;

The optimizer can alter these pointers so that I cannot access these registers.

CAUSE

The optimizer recognizes the locations you specified as arbitrary and not necessary to be reserved. It re-assigns your "registers" to other locations to streamline program flow.

RESOLUTION

Instead of using static pointers you should declare a variable for each XDATA register location and force it to the proper address using the _at_ keyword. You can then use this address to create pointers. The following is an example of how this can be done.

xdata volatile unsigned char Reg1 _at_ 0x1234;
xdata volatile unsigned char *regPtr = &Reg1;

MORE INFORMATION

SEE ALSO

Last Reviewed: Friday, July 15, 2005


Did this article provide the answer you needed?
 
Yes
No
Not Sure