Der in das AVR-Studio integrierte AVR-GCC-Compiler bringt eine Reihe von vorübersetzen Bibliotheken mit, die einfach gelinkt werden können. Dies geht aber nur mit solchen Funktionen, die (relativ) unabhängig vom Prozessor-Typ entwickelt werden können. Das sind z.B. alle Standard-C-Funktionen. Andere einfache Funktionen, wie z.B. "_delay_ms()", werden in den Header-Dateien deklariert und meist inline eingebunden. Für große Funktionsblöcke, insbesondere I/O-Funktionen, ist jedoch beides nicht praktisch. Hier wird üblicherweise die Quelldatei mit den Funktionen mit eingebunden. Die Konfiguration erfolgt in der Header-Datei. Die Anpassung an die Prozessor-Typen erfolgt über größere "#if...#else...#endif"-Verschachtelungen. Die Quell- und Header-Dateien werden häufig in das Projekt kopiert.

Hier möchte ich eine Alternative vorstellen: die Anlage einer Bibliothek.

Die Mechanismen beruhen auf dem AVR-Studio, Version 5.1. Diese Version nutzt das Visual Studio von Microsoft. Bei der Installation der AVR-Studio wird ein Ordner im Bereich "Eigene Dokumente" angelegt, üblicherweise mit der Bezeichnung "AVRStudio 5.1". Unterhalb dieses Ordners befinden sich weitere Ordner, u.a. der Ordner "Projects", in dem die eigenen Projekte angelegt werden. Unter "AVRStudio 5.1" füge ich einen weiteren Ordner mit dem Namen "MyLib" ein, der alle zusätzlichen Dateien aufnimmt.

Elemente in dieser Datei sind grundsätzlich dreiteilig. Zunächst gibt es die eigentliche Quelldatei (".c"). Diese enthält den eigentlichen Code. Dann eine Header-Datei mit den den Funktions-, Variablen- und den Konstanten-Deklarationen bzw. -Definitionen. Zuletzt gibt es eine Konfigurationsdatei, die alle Applikationsspezifischen Elemente enthält. Die Source- und die Header-Datei befinden sich im Bibliotheksverzeichnis, die Konfigurationsdatei im Projektverzeichnis (Eine Vorlage für die Konfigurationsdatei ist ebenfalls im Bibliotheksverzeichnis hinterlegt). Nur die Konfigurationsdatei wird modifiziert. So ist es möglich, eine einzige Programmquelle für alle Projekte zu haben. Ich verwende folgende Namenskonvention:

.c Source-File "uart.c"
.h Header-File "uart.h"
.cfg.h Configuration-File "uart.cfg.h"
.tmp.h Configuration-Template "uart.tmp.h"

Hierdurch wird erreicht, dass zum einem die Dateien im Bibliotheksverzeichnis hintereinander stehen und zum anderen die Schlüsselworte vom AVR-Studio wie üblich eingefärbt werden. Ebenfalls wird vermieden, dass versehentlich die Vorlagen-Datei eingebunden wird.

Damit die Dateien während des Build-Vorgangs gefunden werden können, ist es notwendig, die entsprechenden Verzeichnisse bei den Projekteigenschaften bekannt zu machen. Dies geschieht über das Kontext-Menü des Projekts: "Eigenschaften / Toolchain / AVR GNU C Compiler / Directories". Dort ist ein Eintrag auf das Projektverzeichnis zu machen, damit die projektspezifische Konfigurationsdatei gefunden werden kann und ein Eintrag auf das Bibliotheksverzeichnis. Es empfiehlt sich, relative Pfade zu nutzen. Das ganze sieht dann so aus:Projekteigenschaften

Zuletzt ist es notwendig, die Dateien dem Projekt bekannt zu machen. Dies geschieht über "Hinzufügen / Vorhandene Elemente" im Kontext-Menü des Projekts. Die (kopierte!) Konfigurationsdatei wird direkt eingebunden, die Source- und die Header-Datei als Link. Die Schaltfläche "Hinzufügen" im Auswahl-Dialog bietet entsprechende Möglichkeiten. Eingebundene und eingelinkte Dateien lassen sich anhand der Dateisymbole unterscheiden: Dateisymbole

Neben den Funktionblöcken enthält das Bibliotheksverzeichnis Dateien mit generellen Inhalten, z.B. eine Definition für "true" und "false".

Aktuelle Inhalte:

Name Beschreibung
AppVersion.tmp.h Template für die Projektversionsdatei (s.auch Build-Nummer )
GeneralDefinitions.h Allgemeine Definitionen:
bool, true, false
DDR(PORTx), PIN(PORTx)
nop(), min(), max()
ClearBit(), SetBit(), ToggleBit(), GetBit()
USART Funktionen zur Konfiguration und Bedienung der USART,
interruptgetrieben und ohne Interrupt-Unterstüzung.
SUSAT Serielles Senden per Software für Chips ohne integrierte USART
USI-I²C-Slave Interruptgetriebenes USI-I²C-Slave-Modul
ADC-Timing.h Makro zur Ermittlung des Prescalers für den ADC
ADC.h Funktionen zur Spannungsmessung mit ADC