|
|
AVR-GCC-Tutorial/Alte QuellenEinige Funktionen aus früheren Versionen der avr-libc werden inzwischen als veraltet angesehen. Sie sind nicht mehr vorhanden oder als deprecated (missbilligt) ausgewiesen und Definitionen in <compat/deprecated.h> verschoben. Es empfiehlt sich, vorhandenen Code zu portieren und die alten Funktionen nicht mehr zu nutzen, auch wenn diese noch zur Verfügung stehen.
[Bearbeiten] Veraltete Funktionen zur Deklaration von Interrupt-RoutinenDie Makros SIGNAL und INTERRUPT zur Definition von Interruptroutinen sollten nicht mehr genutzt werden. In aktuellen Versionen der avr-libc werden Interruptroutinen, die nicht durch andere Interrupts unterbrechbar sind, mit ISR deklariert, siehe Programmieren_mit_Interrupts im Hauptteil. Auch die Benennung wurden vereinheitlicht und an die üblichen Bezeichnungen in den AVR-Datenblättern angepasst. In der Dokumentation der avr-libc sind alte und neue Bezeichnungen in der Tabelle gegenübergestellt. Die erforderlichen Schritte zur Portierung:
Als Beispiel für die Anpassung zuerst ein "alter" Code:
Im Datenblatt wird der Vektor mit TIMER2 COMP bezeichnet. Die Bezeichnung in der avr-libc entspricht dem Namen im Datenblatt, Leerzeichen werden durch Unterstriche (_) ersetzt und ein _vect angehängt:
Bei Unklarheiten bezüglich der neuen Vektorlabels hilft (noch) ein Blick in die Headerdatei des entsprechenden Controllers. Für das vorherige Beispiel also der Blick in die Datei iom8.h für den ATmega8, dort findet man die veraltete Bezeichnung unterhalb der aktuellen.
Für unterbrechbare Interruptroutinen, die mittels INTERRUPT deklariert sind, gibt es keinen direkten Ersatz in Form eines Makros. Solche Routinen sind laut Dokumentation der avr-libc in folgender Form zu deklarieren:
Beispiel alt:
Beispiel neu:
Will oder kann man den Code nicht portieren, ist zur weiteren Verwendung von INTERRUPT die Header-Datei compat/deprecated.h einzubinden. Man sollte bei dieser Gelegenheit jedoch nochmals überprüfen, ob die Funktionalität von INTERRUPT tatsächlich gewollt ist. In vielen Fällen wurde INTERRUPT genutzt, wo eigentlich SIGNAL, also nunmehr ISR hätte genutzt werden sollen. [Bearbeiten] Veraltete Funktionen zum Portzugriffinp und outp zum Einlesen bzw. Schreiben von Registern sind nicht mehr erforderlich, der Compiler unterstützt dies ohne diesen Umweg.
[Bearbeiten] Veraltete Funktionen zum Zugriff auf Bits in Registerncbi und sbi zum Löschen und Setzen von Bits sind nicht mehr erforderlich, der Compiler unterstützt dies ohne diesen Umweg. Die Bezeichnung ist ohnehin irreführend da die Funktionen nur für Register mit Adressen im unteren Speicherbereich tatsächlich in die Assembleranweisungen cbi und sbi übersetzt werden.
[Bearbeiten] Selbstdefinierte, nicht-standardisierte, ganzzahlige DatentypenAuf selbstdefinierte Typdefininitionen und Makros für Integer-Types wie BYTE oder WORD sollte dringend verzichtet werden:
Erklärungen finden sich in der Dokumentation zu dem Header und auch im Abschnitt Ganzzahlige (Integer) Datentypen im Hauptteil. |