Hallo Forum, ich habe mal eine Frage zur Codebasis eurer Projekte, damit meine ich die Dateien mit Basisfunktionalitäten, die ihr immer wieder braucht. Wie organisiert man sich da geschickt? Wie sieht das bei euch aus? Es gibt ja schöne Libs für UART, Displays, Entprellung etc. Diese bedienen aber ja meist nur die Grundfunktionalität. Um zB Variablen zu Testzwecken auf der UART oder einem Display auszugeben braucht es ja noch ein paar Umrechnungen und Formatierungen. Warum ist sowas zB nicht mit in den Libs. Das braucht doch jeder. Also Hexwert, Dezimalwert mit Kommastellen etc ausgeben, einen String scrollen. Ich meine, das ist kein Hexenwerk, aber ich möchte das Rad nicht neu erfinden und vertraue gerne auf getesteten Code. Außerdem habe ich dann immer extra Dateien, da ich die Libs nicht ändern möchte, falls mal ein Update kommt. Eine andere Sache ist, wie behandelt ihr die Peripherie des Controllers? Also habt ihr für alles eigene Dateien, also Timer, ADC, SPI etc? Sind diese universell gehalten? Also kann man die Init über Parameter einstellen, oder passt ihr den Code für jedes Projekt immer wieder an? Oder haut ihr etwa alles in eine Datei? Ich finde, dass es schnell sehr komplex wird, wenn man Konfigurationen allgemein halten will. Es entstehen viele Abhängigkeiten und Wertebereiche, die man prüfen muss. Was benutzt ihr sonst noch so für Definitionen, die ihr immer einbindet? Verwendet ihr zB einen Grundtimer, mit dem ihr euch eine Art timeover-Funktion realisiert? Mich interessiert, wie man sich einen soliden Grundstock an Funktionen aufbaut und diesen geschickt organisiert? Gibt es hier irgendwo eine Sammlung solcher nützlichen Funktionen? Lohnt sich das Anlegen einer eigenen Lib? Ich hoffe, ihr könnt mir ein paar wertvolle Tipps geben! Danke.
Ja. eine eigene Libray wird man sich langsam erarbeiten. Ja. Ich hab auch meine Standardfunktionen. Die muss ich aber bis auf das letzte Bit kennen, sonst sind sie nicht effektiv.
> Warum ist sowas zB nicht mit in den Libs Weil es viel Arbeit ist? Eine Lib schreibt sich schnell, ein zusammenhängendes System von Linker-Libs ist ein Grossprojekt. Ausserdem haben viele so etwas schon und wollen lieber Code, der sich auf die konkrete Funktion beschränkt (z.B. LCD-Protokoll) und einfach in eigene Projekten einzufügen ist. > Wie sieht das bei euch aus? Ich habe pro Subsystem (Hardware wie ADC, I2C usw., aber auch Software-Subsysteme wie Menücode, App-Framework usw.) zwei Quelltexte (c, h) in einem globalen Modulverzeichnis. Dieses Verzeichnis füge ich im Projekt-Setup von Eclipse zum Pfad jedes Projektes hinzu - so wird alles gefunden. Funktionen, Konstanten und globale Variablen eines Subsystems haben den gleichen Prefix, z.B. "owi_". Die Modulcodes hängen natürlich teilweise voneinander ab, so dass man immer das grosse ganze im Auge behalten muss. > Also kann man die Init über Parameter einstellen, oder passt ihr den Code für jedes Projekt immer wieder an? Bestimmte Dinge werden bei mir mit define's geregelt, andere mit Funktionsparametern, andere gar nicht (z.B. ist ein AVR-Timer fest als 1ms-Timer belegt) - je nachdem, was praktikabel ist. Alles mit Parametern zu lösen würde den Code sehr umfangreich machen. Das Umbiegen von Modulcode mit defines erfolgt, indem im Modulcode eine <defs.h>-Datei eingebunden wird - diese Datei muss jedes Projekt bereitstellen. Das ist eine (die einzige) rückwirkende Abhängigkeit Modulcode-Projektcode. Umwandeln in Linker-Libs geht also nicht. Um ISRs im Modulcode inline erweitern zu können, gibt es an geeigteten Stellen Makros, die das jeweilige Projekt in <defs.h> umdefinieren kann. Die Verwendung der inline-Anweisung wäre schöner, funktioniert aber IMHO nicht über Dateigrenzen hinweg.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.