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
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 }; |
(z.B. indem man in der Headerdatei schaut, wie sie dort deklariert sind :-)
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.
Paul Hamacher schrieb: > woher weiß der GCC denn was _SFR_IO8(...) überhaupt sein soll? Ist das > auch irgendwo als Makro definiert Ja.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.