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/in...C3.BCr_avr-gcc
Lesezeichen