Anhand der Frage vermute ich mal, du wirfst was durcheinander...?
Viele AVR SFRs haben zwei Adressen: Einerseits eine I/O-Adresse (zB für SBI) und andererseits eine RAM-Adresse (zB für STS), die durch Mappen der SFRs in den RAM-Adressbereich entsteht. Diese beiden Adressen unterscheiden sich durch eine feste Differenz. Nun will man nicht für beide Adressen Makros schreiben, sondern für SFRs wie SREG nur eine Adresse definieren. Gleichwohl will man diese Adresse in beiden Klassen von asm-Instruktionen verwenden können. Dazu dient __SFR_OFFSET.
Als "normaler" Programmierer braucht man sich nicht darum zu kümmern, wonach Makros wie SREG im Endeffekt auflösen. Je nach Kontext wird avr-gcc die richtige Adressieung zur gewählten asm-Instruktion erzeugen. Wenn du zB schreibst
dann wird die I/O-Adresse verwendet. Wenn du schreibstCode:PORTB |= 1;dann wird die RAM-Adresse genommen.Code:unsigned char volatile * p = & PORTB;
Etwas kompliziert wird die Lage dadurch, daß man diese Makros auch im GNU-Assembler (avr-as) verwenden können möchte.
Lesezeichen