Forum: Compiler & IDEs AVR: Pointer(-Array) auf PORTs


von Paul H. (powl)


Lesenswert?

Hi,

ich würde mir gerne ein Array aus Pointern auf Ports, also SFR-Register 
erstellen, so dass ich hinterher einen Liste mit Portpins und eine 
dazugehörige Liste mit den entsprechenden Ports habe und diese dann 
dynamisch ansteuern kann.

Leider weiß ich nich was für ein Pointertype z.B. PORTA sein soll. Geht 
das überhaupt?

lg PoWl

von Werner B. (werner-b)


Lesenswert?

volatile uint8_t *
bzw. volatile uint16_t * für 16 Bit Register


Beispiel
1
volatile uint8_t * porta = &PORTA;
2
3
volatile uint8_t * ports[] = { &PORTA, &PORTB, &PORTC };

von Paul H. (powl)


Lesenswert?

darauf hätte ich auch selbst kommen können :D danke!

von Klaus W. (mfgkw)


Lesenswert?

(z.B. indem man in der Headerdatei schaut, wie sie dort deklariert sind 
:-)

von Paul H. (powl)


Lesenswert?

Klaus Wachtler schrieb:
> (z.B. indem man in der Headerdatei schaut, wie sie dort deklariert sind
> :-)

hab ich getan aber bei
> #define PORTD   _SFR_IO8(0x12)
bin ich dann nicht mehr weitergekommen ;)

woher weiß der GCC denn was _SFR_IO8(...) überhaupt sein soll? Ist das 
auch irgendwo als Makro definiert oder ist das quasi eine erweiterung 
des GCCs?

wie wurde der GCC eigentlich auf AVRs angepasst? Gibt es da irgendwie 
den GCC als Grund-Compiler, der sich durch verschiedene 
Konfigurationsdateien auf beliebige Prozessorsysteme anpassen lässt? 
Oder wurde hier der GCC nur als Vorlage benutzt und es handelt sich 
eigentlich um eine komplette Umentwicklung des GCCs so dass dieser Code 
für AVRs produzieren kann. Irgendwie muss ja auch dieser Spagat mit dem 
Getrennten Speicherbereich für Flash und Daten und den daraus 
resultierenden unterschiedlichen lesebefehlen gelöst worden sein.

von Ralf G. (ralg)


Lesenswert?

Paul Hamacher schrieb:
> woher weiß der GCC denn was _SFR_IO8(...) überhaupt sein soll? Ist das
> auch irgendwo als Makro definiert
Ja.

von Klaus W. (mfgkw)


Lesenswert?

DER Ralf G.?
Gott zum Gruße!

von Karl H. (kbuchegg)


Lesenswert?

Paul Hamacher schrieb:

> wie wurde der GCC eigentlich auf AVRs angepasst? Gibt es da irgendwie
> den GCC als Grund-Compiler, der sich durch verschiedene
> Konfigurationsdateien auf beliebige Prozessorsysteme anpassen lässt?
> Oder wurde hier der GCC nur als Vorlage benutzt und es handelt sich
> eigentlich um eine komplette Umentwicklung des GCCs so dass dieser Code
> für AVRs produzieren kann. Irgendwie muss ja auch dieser Spagat mit dem
> Getrennten Speicherbereich für Flash und Daten und den daraus
> resultierenden unterschiedlichen lesebefehlen gelöst worden sein.

Da kannst du mal sehen, wie flexibel sich der GCC (und ja, der Hauptteil 
des GCC ist überall gleich) an verschiedene Architekturen anpassen 
lässt.

von Rolf Magnus (Gast)


Lesenswert?

Paul Hamacher schrieb:
> hab ich getan aber bei
>> #define PORTD   _SFR_IO8(0x12)
> bin ich dann nicht mehr weitergekommen ;)
>
> woher weiß der GCC denn was _SFR_IO8(...) überhaupt sein soll? Ist das
> auch irgendwo als Makro definiert oder ist das quasi eine erweiterung
> des GCCs?

Das ist ein Makro und gehört zur avr-libc.
Siehe 
http://www.nongnu.org/avr-libc/user-manual/group__avr__sfr__notes.html

> wie wurde der GCC eigentlich auf AVRs angepasst? Gibt es da irgendwie
> den GCC als Grund-Compiler, der sich durch verschiedene
> Konfigurationsdateien auf beliebige Prozessorsysteme anpassen lässt?

Quasi. Ein Teil des GCC ist generisch und plattformunabhängig. Aus 
diesem fällt eine Zwischenrepräsentation des Code raus, die dann vom 
plattformabhängigen Teil weiterverarbeitet wird. Und für diesen Teil 
gibt es dann Dateien, die die Zielplattform beschreiben.

> Oder wurde hier der GCC nur als Vorlage benutzt und es handelt sich
> eigentlich um eine komplette Umentwicklung des GCCs so dass dieser Code
> für AVRs produzieren kann.

Nein. Wenn man sich direkt von gnu.org den gcc runterlädt, ist da avr 
als Zielplattform mit drin.

> Irgendwie muss ja auch dieser Spagat mit dem Getrennten Speicherbereich für
> Flash und Daten und den daraus  resultierenden unterschiedlichen lesebefehlen
> gelöst worden sein.

Das wurde mit ein paar Tricks quasi am gcc vorbei gelöst.

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.