Keil Logo

C51: Static Pointers vs Explicitly Placed Variables


Information in this article applies to:

  • C51 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: Thursday, February 25, 2021


Did this article provide the answer you needed?
 
Yes
No
Not Sure
 
  Arm logo
Important information

This site uses cookies to store information on your computer. By continuing to use our site, you consent to our cookies.

Change Settings

Privacy Policy Update

Arm’s Privacy Policy has been updated. By continuing to use our site, you consent to Arm’s Privacy Policy. Please review our Privacy Policy to learn more about our collection, use and transfers
of your data.