Die bisherigen Einstellungen und Konfigurationen der DAVE-Apps sind nicht auf bestimmte Hardware-Ressourcen bezogen. Bisher wurde es dem Solver überlassen, die Peripherie-Ressourcen auswählen. Bei der Pin-Auswahl ist es oftmals notwendig, Vorgaben zu machen, um beispielsweise die Software auf ein vorhandenes Board zu portieren.
Dazu gibt es eine ManualPin-Assignment-Ansicht (zunächst in Tabellenform, später auch als Grafik), in der beispielsweise das PWM-Ausgangssignal und der Puls-Eingang einem bestimmten Pin zugeordnet werden sollen (Bild 5).
Um sicherzustellen, dass die gewünschten Funktionen auch auf den Chip “passen“, wird der Ressourcen-Auflöser automatisch nach bestimmten ressourcenrelevanten Transaktionen gestartet. Man kann ihn auch explizit manuell starten. Ergebnis: Die DAVE-Apps wurden automatisch den verfügbaren Chip-Ressourcen konfliktfrei und unter Berücksichtigung aller Randbedingungen zugeordnet.
Entsprechend den zugeordneten Ressourcen erfolgt danach die Codeerzeugung. Je DAVE-App werden spezifische Header-Dateien und C-Quelldateien erzeugt, welche die Initialisierungsfunktionen und die APIs für die verschiedenen Funktionsaufrufe beinhalten.
Obgleich es bei dem erzeugten Code um C-Code handelt, folgt die Codeerzeugung Vorgaben der objektorientierten Programmierung. Der erzeugte Code ist unabhängig von der Anzahl der DAVE-App-Instanzen; je Instanz wird eine Datenstruktur erzeugt, in der die jeweilige Konfiguration sowie Ressourcen-Informationen gespeichert sind. Im Grunde sind die DAVE-Apps Klassen, die beim Zufügen zu einem Projekt als deren jeweiliges Objekt instanziiert werden.
Benutzung der API im User-Code
Nach diesen ersten fünf Schritten sind alle Hardware-relevanten Aufgaben der Software-Entwicklung erledigt und man kann sich voll und ganz auf das abstrakte Programmieren konzentrieren. In unserem Fall ist es lediglich notwendig, zwei Interrupt-Handler-Funktionen zu definieren:
Bild 6 zeigt die beiden Code-Sequenzen. Die Funktionsnamen beginnen jeweils mit dem App-Namen als Präfix, gefolgt von einem funktionalen Suffix; das erste Argument der Funktionen ist fast immer ein Zeiger auf die Daten-Struktur der jeweiligen App-Instanz.
Mit dem in DAVE 3 verfügbaren kostenlosen GNU-Compiler und Tasking-Debugger kann der Code kompiliert und auf dem Zielsystem getestet werden. Das fertige Projekt kann auch aus der online verfügbaren DAVE-Projektbibliothek geladen werden; das Schlüsselwort lautet „Elektronik-17“.
Obgleich es sich hier um ein sehr einfaches Beispiel handelt, zeigt sich doch das Einsparpotenzial, welches in DAVE 3 steckt. Auch ein erfahrener Software-Entwickler würde für diese Aufgabe ohne DAVE 3 ein Mehrfaches der Zeit benötigen. Wenn die Anforderungen nun erweitert oder geändert werden, kann man auf das existierende Projekt einfach aufsetzen und weitere benötigte DAVE-Apps instanziieren.
Die heute vorhandene DAVE-Apps-Bibliothek beinhaltet bereits eine Vielzahl von DAVE-Apps, welche einen breiten Anwendungsbereich abdecken und die ständig kontinuierlich erweitert werden. Die Tabelle zeigt eine Übersicht über die aktuell bzw. kurzfristig verfügbaren DAVE-Apps. Das Einzigartige an DAVE 3 und am Konzept der DAVE-Apps ist die Flexibilität, mit der die gewünschte Funktionalität durch die Komposition verschiedener DAVE-Apps und entsprechender HW-Signal-Verbindung zusammengebaut werden kann.
Basis-Apps | Middleware | Spezifische Applikationen | Service-Apps |
---|---|---|---|
Timer | CMSIS RTOS | Feldorientierte Motorsteuerung | DMA |
CAN | USB-Stack, Class-Driver | Stromrichter | Interrupt |
I2S, I2C, UART, SPI | TCP/IP-Stack plus HTTP, FTP, SNMP | Touch/HMI | I/O |
Einfacher A/D-Wandler | Dateisystem | Modbus | CRC |
Komplexer A/D-Wandler | GUI-Bibliothek | Licht-Steuerung | AES-Verschlüsselung |
Delta-Sigma-Demodulator | DebugLog | ||
D/A-Wandler | |||
Resolver | |||
PWM | |||
Capture | |||
Zähler | |||
Position-Schnittstelle | |||
Ethernet/PHY | |||
USB | |||
Touch | |||
Flash-Speicher |
Überblick über die verfügbaren DAVE-Apps. Ein großer Block sind die Low-Level-Peripherie-Funktionen. Es steht aber auch ein komplettes Set von Middleware-Applikationen wie CMSIS-RTOS, Dateisystem, Grafik-Bibliothek, USB und TCP/IP zur Verfügung.
Es ermöglicht die volle und umfangreiche komponentenbasierte Nutzung der Hardware, ohne dass man sich im Detail in das Hardware-Referenzhandbuch vertiefen muss. Das Konzept unterstützt auch die Einbindung existierender Software-Module oder kommerzielle Software-Lösungen von Drittanbietern. Dabei geht es im Wesentlichen darum, dass die benötigten Hardware-Ressourcen diese Software-Module vom Ressourcen-Auflöser nicht für andere Zwecke verwendet werden.
Dies geschieht durch die künftige Möglichkeit, dass Hardware-Ressourcen reserviert werden oder aber, dass solche Komponenten durch eine dedizierte DAVE-App unterstützt werden wie zum Beispiel die Konfiguration (über erzeugte Header-Files) und die flexible Ressourcenzuordnung.
Dieser Ansatz wird auch dadurch gefördert, dass in Zukunft ein umfangreiches DAVE-App-Devlopment-Kit kostenlos zur Verfügung gestellt wird. Vielen Software-Entwicklern, die bereits lange mit einer existierenden Tool-Chain arbeiten, ist nun nicht wohl beim Gedanken, auf etwas Neues umsteigen zu müssen, wenn sie die Vorteile von DAVE 3 nutzen wollen.
Auch hier zeigt sich DAVE 3 flexibel: DAVE 3 ist zwar eine komplette Entwicklungsplattform, man kann sich aber auf die Funktion der komponentenbasierten Codeerzeugung beschränken und den Code in anderen Tool-Chains importieren. Manche Tool-Anbieter arbeiten sogar daran, nur das DAVE-3-Plug-in zur Codeerzeugung in deren eigene Eclipse-basierte Tool-Chain zu integrieren.
Aktuell werden von DAVE 3 die Bausteine der XMC4500-Serie unterstützt. Alle relevanten DAVE-Apps werden zur Zeit zügig auf die XMC4400-, XMC4200- und XMC4100-Serie portiert. Die Anzahl der verfügbaren DAVE-Apps wird kontinuierlich weiter zunehmen. Mehr Komponenten bedeuten mehr Optionen, Ihre Anforderungen zu lösen.