EmbDev.net

Forum: µC & Digital Electronics Volatile pointer


von Johan (Guest)


Rate this post
useful
not useful
I am using mmio to access an external unit from my at90s8515. To access
this device easily I have an pointer that points to the start of the
mmio area. The interesting parts og the code looks like this:

volatile char *mmio =(char *)0x8300;

...
{
...
  mmio[a] = val1;
  mmio[b] = val1 >> 8;
  mmio[c] = val2;
...
}

this is compiled with:
avr-gcc -g -wall -O2 -mmcu=at90s8515 -Wl ...

the disassembled output becommes like this:

  mmio[a] = val1;
  e0:  e0 91 60 00   lds  r30, 0x0060
  e4:  f0 91 61 00   lds  r31, 0x0061
  e8:  42 87         std  Z+10, r20  ; 0x0a
  mmio[b] = val1 >> 8;
  ea:  e0 91 60 00   lds  r30, 0x0060
  ee:  f0 91 61 00   lds  r31, 0x0061
  f2:  85 2f         mov  r24, r21
  f4:  99 27         eor  r25, r25
  f6:  83 87         std  Z+11, r24  ; 0x0b
  mmio[c] = val2;
  f8:  e0 91 60 00   lds  r30, 0x0060
  fc:  f0 91 61 00   lds  r31, 0x0061
 100:  60 87         std  Z+8, r22  ; 0x08

My problem is all these lds r30/r31. That makes me believe that the
compiler treates the pointer as a volatile pointer not a pointer to a
volatile area. Does anyone have any ideas how to optimize this?

von samo (Guest)


Rate this post
useful
not useful
So funktionier es.

char *volatile mmio =(char *)0x8300;

Please log in before posting. Registration is free and takes only a minute.
Existing account
Do you have a Google/GoogleMail account? No registration required!
Log in with Google account
No account? Register here.