PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Include für AVR Typen



The Man
06.01.2009, 16:54
Hallo zusammen,

ich war bisher nur im Assemblerbereich unterwegs. Nachdem ich jetzt mal eine DCF77 Decodierung darin gemacht habe, bin ich der Meinung langsam mal auf C umzusteigen...

Habe natürlich erstmal den Blick in RN_Wissen schweifen lassen und habe zu den Include eine Frage. Habe ich das richtig verstanden, dass ich mit
"#include <avr/io.h>"
alle unterstützten Derivate includiere? Sehe ich das richtig, das dort die Pin, Register, etc. Adressen definiert werden? Dann würde das doch keinen Sinn machen, auf die Art alle AVR´s zu includiere, weil die Adressen doch variieren.
Kann mir jemand dieses Gedankenproblem lösen?

Danke,
The Man

uwegw
06.01.2009, 17:01
Werf mal nen Blick in die io.h.
Dort wird geprüft, welcher Controllertyp im makefile eingestellt ist. Dementsprechend wird dann die Datei mit den passenden Definitionen eingebunden.
Der Sinn dabei: So gibt es nur eine einzige Stelle, an der man den Typ einstellen muss, nämlich im makefile. Verhindert so manchen extrem schwer zu findenden Fehler. Außerdem werden von der io.h noch etliche Sachen eingebunden, die für alle AVRs gleich sind.

SprinterSB
06.01.2009, 17:21
Prinzipiell korrekt, aber die Entscheidung, welche Definitionen die avr/io.h nach sich zieht wird über die Kommandozeile des Compilers bestimmt. Auch ohne Make(file) funktioniert das.

Über den avr-gcc Schalter -mmcu=atmega8 wird zB für den µC ATmega8 übersetzt, der ja einen andern Befehlssatz hat als zB ein ATtinyXX.

Ausserdem setzt avr-gcc bestimmte builtin-Makros wie in diesem Falle __AVR_ATmega8__, anhand denen im avr/io.h Unterscheidungen getroffen werden können. Es werden auch Defines gesett die Aussagen über den Befehlssatz machen, ob ein MUL-Befehl vorhanden ist etc.

Ausserdem müssen die binutils wissen für welchen µC sie assemblieren und linken sollen, um zB den richtigen Startup-Code einbinden zu können. Dazu reicht der Compiler die µC-Kennung per Kommandozeile an die nachgeschalteten Tools weiter.

Diese Makros kannst du in deinem Programm auch lesend verwenden, aber das ist idR nicht erforderlich.

Es kann aber ganz hilfreich sein, wenn man zB eine allgemeine UART-Routine schreibt und Maschinenabhängigkeiten rausparametrisieren will, weil die Registernamen nicht überall gleich sind.

https://www.roboternetz.de/wissen/index.php/Avr-gcc#Maschinenspezifische_Optionen_f.C3.BCr_avr-gcc

Andun
06.01.2009, 18:37
http://www.nongnu.org/avr-libc/user-manual/group__avr__io.html

Hier steht der Kram auch nochmal "offiziell" beschrieben.