|
avr_libmake: Konzept und Tool für das Handling
von Assembler-Bibliotheken
V0.20 (c) 2006 Joerg Wolfram
1 Allgemeines
Das Programm unterliegt der GPL (GNU General Public Licence)
Version 2 oder höher, jede Nutzung der Software/Informationen nonkonform
zur LGPL oder ausserhalb des Geltungsbereiches der GPL ist untersagt!
Die Veröffentlichung dieses Programms erfolgt in der Hoffnung, daß
es Ihnen von Nutzen sein wird, aber OHNE IRGENDEINE GARANTIE, auch
ohne die implizite Garantie der MARKTREIFE oder der VERWENDBARKEIT
FÜR EINEN BESTIMMTEN ZWECK.
In der Version 0.20 habe ich einige Änderungen vorgenommen. Das betrifft zuallererst die Ergänzung der
Bibliotheksdateien um die Dateiendung "'.asm"', damit Editoren mit Syntax-Highlighting den richtigen
Dateityp erkennen können. Die Dateien befinden sich jetzt Bibliotheksweise in Verzeichnissen,
was einerseits übersichtlicher ist und andererseits Bibliotheks-Updates einfacher macht.
Zuguterletzt ist noch das Register ctrl dazugekommen, um Funktionen
einfacher steuern zu können.
2 Anforderungen an ein Bibliothekskonzept
Um den Organisationsaufwand beim Einsatz der Bibliotheken zu minimieren, die Codegröße zu minimieren
und eine weitestgehend offene Schnittstelle zu schaffen, müssen folgende Mindestanforderungen erfüllt sein:
- einfacher Einsatz der Bibliotheken, Minimierung des Verwaltungsaufwandes (Definitionen etc.)
- unabhängige Bibliotheken, die sich nicht (direkt) gegenseitig aufrufen dürfen
- Möglichkeit der Bereitstellung globaler Funktionen, die auch von anderen Bibliotheken
genutzt werden können
- automatisches Weglassen nicht benötigter Bibliotheken und Funktionen
- automatische Ermittlung der Sprungdistanzen zur Optimierung der Funktionsaufrufe
- bei Durchführung der letzten beiden Punkte sollen Quelltext und Bibliotheken
nicht verändert werden
3 Grundlegendes Konzept
Nach vielen Versuchen hat sich das folgende Konzept als brauchbar, wenn
auch vielleicht nicht optimal erwiesen. Ein Nachteil kann eventuell (wenn auch für
mich nicht) in der engen Anbindung an Linux und avra als Assembler bestehen, sofern
man auf andere Betriebssysteme/Tools angewiesen ist.
Die Bibliotheken selbst sollten sich aber auch ohne diese Voraussetzungen nutzen lassen.
Das Prinzip ist letztendlich sehr simpel. Zu Beginn des Hauptquelltextes wird eine
Datei mit Makros eingebunden. Jedes Makro enthält den Funktionsaufruf als absoluten Sprung/Aufruf
und setzt (definiert) einen Freigabewert. Bibliotheksaufrufe werden generell als Makroaufrufe
getätigt.
Am Ende des Hautquelltextes wird dann die eigentliche Bibliothek eingebunden. In der
Bibliothek selbst werden dann abhängig von den bereits gesetzten Freigabewerten noch weitere
Freigabewerte gesetzt (interne Abhängigkeiten). Durch bedingte Assemblierung der einzelnen Funktionen
abhängig davon, ob der Freigabewert definiert ist, werden nur die wirklich benötigten
Bibliotheksfunktionen assembliert.
Nach einem ersten Assemblervorgang wird die erstellte Listdatei auf Sprung- und Aufrufdistanzen
bei den Bibliotheksfunktionen überprüft. Liegen diese im Bereich von relativen Sprüngen/Aufrufen,
werden in der Makrodefinitionsdatei die Funktionsaufrufe entsprechend abgeändert. Zum Abschluss
erfolgt noch ein zweiter Assemblervorgang.
4 Realisierung
4.1 Nomenklatur
Das realisierte Konzept bringt einige Restriktionen bei der Bezeichnung von Bibliotheken und
Bibliotheksfunktionen mit:
- Die Bibliotheksdateien heissen alle library.asm, die Makrodateien macros.asm,
und befinden sich in einem Ordner mit Namen der Bibliothek.
- Bibliotheksfunktionen beginnen mit dem Bibliotheksname (incl. "'lib"') gefolgt von Unterstrich
und dem Funktionsnamen.
- Die Makros zum Aufruf der Bibliotheksfunktionen heissen genau so wie die Funktionen
Für eine PWM-Bibliothek würde sich zum Beispiel folgendes ergeben:
- Die Bibliotheksdatei heisst libpwm1/library.asm, die Makrodatei libpwm1/macros.asm.
- Eine Ausgabefunktion heisst dann libpwm1_out
- In die Hauptquelltextdatei wird am Anfang .include "'macros.inc"' und am Ende
.include "'libs.inc"' geschrieben
- Um die Funktion zu nutzen, muss nur das Makro libpwm1_out aufgerufen werden.
4.2 Automatisierung
Will oder kann man das Skript avr_libmake.pl zur Automatisierung nicht nutzen, ist es auch
möglich, am Anfang der Haupt-Quelltextdatei die einzelnen Makrodateien und am Ende die entsprechenden
Bibliotheksdateien einzubinden. Einfacher gehts es jedoch mit dem Perl-Skript. Bevor es eingesetzt
werden kann, muss es aber eventuell noch angepasst werden. Dazu gehören der Library-Pfad und der
Assembleraufruf. Dann wird es am besten nach /usr/local/lib kopiert und das wars auch schon
mit der Installation. Gestartet wird es am besten im Projektverzeichnis mit:
avr_libmake mainsource.asm
Wenn alles geklappt hat kann die .hex-Datei in den AVR geflasht werden, wenn nicht, fehlt vielleicht
eine Bibliothek oder es ist ein Fehler im Quelltext. Der Quelltext der auf diesen Seiten herunterladbaren
Bibliotheken ist zumindest syntaktisch überprüft, sollte also keine Assemblierfehler produzieren.
Wenn doch, fehlen eventuell Registerdefinitionen.
4.3 Lokaler Speicher und Registernutzung
Manche Bibliotheken nutzen einen kleinen SRAM-Bereich für z.B. temporäre Daten oder einen
Arithmetikstack. Zusätzlich müssen eventuell auch noch Definitionen für Adressen etc. festgelegt werden.
Dazu dient die Datei definitions.asm im Bibliotheksverzeichnis. Entweder man kopiert den Inhalt in
die Quelldatei oder man bindet sie über "'.include libxxx/definitions.asm"' ein.
Die Bibliotheken nutzen meist die folgenden Register, näheres steht in den jeweiligen
Bibliotheksdokumentationen.
Register |
Funktion |
r0,r1 |
werden für Multiplikationen und temporär genutzt |
byte0 |
beliebiges Register, welches mit 0x00 vorbelegt ist (z.B. r2) |
byte1 |
beliebiges Register, welches mit 0x01 vorbelegt ist (z.B. r3) |
ereg |
beliebiges Register aus dem oberen Registerbereich, liefert Fehlercode (z.B. r25) |
ctrl |
beliebiges Register aus dem oberen Registerbereich, Format- und Steuerungsfunktionen (z.B. r24) |
tempreg1...tempreg4 |
beliebige Register aus dem oberen Registerbereich |
tempreg5...tempreg8 |
beliebige Register aus dem unteren Registerbereich |
XL,XH |
Ein-/Ausgabe von Daten, temporär genutzt |
YL,YH |
Pointer, Adressen im SRAM, temporäre Nutzung |
ZL,ZH |
Pointer, Adressen im SRAM, EEPROM oder Flash |
|
5 Vorhandene Bibliotheken und Ausblick
Das ganze schöne Konzept hilft natürlich nichts, wenn es keine passenden Bibliotheken dazu
gibt. Da ich gerade dabei bin, die vorhandenen Bibliotheken für das neue Konzept umzuschreiben,
soll die folgende Tabelle eine Übersicht geben und vielleicht unnötige Parallelentwicklungen
vermeiden.
Library |
Status |
Funktionen |
libsm16 |
V0.20 |
Verschiedene Stack- und Arithmetikfunktionen |
libam16 |
V0.20 |
Verschiedene Akkubasierte Integer-Arithmetikfunktionen |
libmio |
Dokumentation |
Multi-IO (Video, Sound, PS2-Keyboard, RS232, Druckerschnittstelle, Timer |
|
erzeugt mit latex2web.pl v0.4 © 2006 Joerg Wolfram
|