Forum: Compiler & IDEs Bitadressierung von SFR bei AVR


von Benedikt K. (benedikt)


Lesenswert?

Das Thema wurde schon ein paarmal behandelt, allerdings gab es nie eine 
funktionierende Lösung.
Da ich öfters mal Software zwischen AVR, M16C und anderen uC portieren 
muss, und andere Compiler den Befehl PORT|=1<<BIT nicht so gut 
optimieren wie der AVR-GCC, da diese meist PORT.BIT=wert kennen, 
versuche ich das dem AVR-GCC beizubringen.

Hier gab es schonmal einen Versuch, allerdings ist das schon 4 Jahre 
her, und es gab keine wirkliche Lösung:
Beitrag "Port, Pin auf 1 oder null setzen"

Vor kurzem hat Jörg Wunsch gemeint, dass dies schon jemand gemacht 
hätte:
Beitrag "Re: struct auf Adresse legen"
Ich konnte aber nichts finden.

Meine Lösung sieht bisher so aus:

typedef struct {
  volatile unsigned P0  :1;
  volatile unsigned P1  :1;
  volatile unsigned P2  :1;
  volatile unsigned P3  :1;
  volatile unsigned P4  :1;
  volatile unsigned P5  :1;
  volatile unsigned P6  :1;
  volatile unsigned P7  :1;
}  PORTBITS_;

PORTBITS_ * const PORTBbits=(PORTBITS_ *)0x18;

PORTBbits->P0=1;
usw.

Das funktioniert zwar, wird aber nicht optimiert zu sbi.
Wie bringe ich dem Compiuler bei, dass er dieses Struct als _SFR_IO8 
behandeln, und zu sbi/cbi optimieren soll?


von bluebrother (Gast)


Lesenswert?

Nur mal so als Idee: wie wäre es mit einem Makro dass in die jeweilige 
Form expandiert. Vielleicht etwas unhandlicher, aber müsste doch 
eigentlich problemlos machbar sein.

von Peter D. (peda)


Lesenswert?

Also bei mir funktionierts:

Beitrag "Re: Schieberegister-LCD vereinfachen"


Wird zu sbi/cbi bei Optimierung -Os


Peter

von Benedikt K. (benedikt)


Lesenswert?

Danke, das ist ja echt ein bischen gemein: Mein Problem war, dass ich 
eben nicht das _SFR_IO8 drin hatte.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.