Bitadressierung von SFR bei AVR

OP #545359
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren