Frank schrieb:
> Dadurch da ich noch nicht allzu lange programmiere, wollte ich einfach
> mal fragen, wie man sowas am besten macht.
Ich denke, dass derjaeger vernünftig geantwortet hat. In der
Softwareentwicklung gibt es Leute, die wollen ihre Programmteile modular
(austauschbar) machen und möglichst hardware-unabhängig machen.
Das ist aber bei Dingen, die gerade der Ansteuerung von Hardware dienen
kaum möglich und sinnvoll, da diese Herangehensweise oft mit einem
gewaltigen Overhead verbunden ist, der den Speicherbedarf erhöht und die
Leistung verringert.
Die ersten Schwierigkeiten, auf die du stoßen wirst sind wahrscheinlich
folgende:
1) Interrupthandler sind fest C Funktionen zugeordnet weil die
Interrupt-Vektor Tabelle im Flash (nicht im Ram) liegt. Es sei denn, du
baust für jeden Interrupt einen Wrapper in C, der an die eigentlichen
austauschbaren Module/Objekte vermittelt.
2) Die mehrfach vorhandenen Peripherien (z.B. Timer, serielle Ports, PWM
Kanäle) sind nicht identisch und nicht völlig unabhängig voneinander
konfigurierbar.
3) Die Register der mehrfach vorhandenen Peripherie liegen nicht immer
in der gleichen Reihenfolge und mit gleichen Abständen zueinander im
Adressraum, weswegen man sie nicht als Struct darstellen kann. Das ist
mir besonders bei AVR aufgefallen.
Bei den Xmega hat Atmel die Punkte 2) und 3) besser gemacht, es soll
jetzt wohl auch neue ATtinies geben, die in dieser Hinsicht besser sind.
Nur sind die aufgrund ihrer Bauform, Verfügbarkeit und fehlender
Bastelanleitungen für Hobbyelektroniker (noch) kaum relevant.
Mache Dir darüber nicht so viele Gedanken. Mikrocontroller Projekte sind
(verglichen mit Enterprise Anwendungen) in der Regel überschaubar. Da
braucht man keine Module für die hardwarenahen Sachen. Ich persönliche
komme mit kommentierten Code-Schnipseln gut klar. Die kopiere ich immer
wieder von Projekt zu Projekt und passe sie den jeweiligen Bedürfnissen
an.
Wenn du mal konkrete Beispiele sehen willst, wie man das Ganze Modular
angehen kann, dann schau Dir die Quelltexte von Arduino an. Dort haben
Sie einige Sachen elegant gelöst, manches ist aber auch fragwürdig. Die
entsprechenden Stellen werden auch Dir als Anfänger schnell auffallen.
Danach kannst Du Dir deine eigene Meinung bilden.
Bei Arduino gibt es z.B. die allgegenwärtige digitalWrite() Funktion,
die mehr als 50 Takte benötigt, um einen einzelnen I/O Pin auf High oder
Low zu schalten. Da kommt man selbst als Anfänger schon ins grübeln -
spätestens dann, wenn man ein LC-Diplay mit 7 Pins ansteuern will und
sich fragt, ob da jetzt wirklich jeder Zugriff 7x50 Taktzyklen benötigen
muss.
Einige Sachen haben die aber auch sehr gut gelöst, finde ich.
Schau Dir auch mal ein Cube-HAL Projekt für STM32 an. Da benötigt ein
simples Hello-World Programm bereits etwa 5 Kilobytes. Das ist der
Preis, denn man für (meiner Meinung nach) zu viel Modularität bezahlt.
Die haben da eine API geschaffen, mit der sie alle STM32 Modelle
abdecken wollen und schleppen daher einen gewaltigen Overhead mit sich.
Dennoch vereinfacht die HAL das Programmieren nicht. Du musst trotzdem
die Bits der ganzen Register einzeln kennen lernen und die Hinweise
bezüglich deren Nutzung lesen.
Jetzt stelle Dir mal vor, du will so ein Hello-World Programm noch
universeller machen, dass es nicht nur auf STM32 läuft. Dann wird das so
groß, dass es auf die kleinen AVR's gar nicht mehr drauf passt.
Ich kann jetzt schon den Einen oder Anderen beeindrucken, dass meine
Programme mit 1MHz genau so gut laufen, wie seine mit 32Mhz. Der
Unterschied ist: Er benutzt Frameworks, ich tu das nur, wenn ich muss.
Die gleiche Nummer wiederholt sich auch bei der Programmierung von PC's
in jeder beliebigen Programmiersprache.
Ich nehme an, dass sich der c-hater bald meldet. Der kennt diese
Thematik auch und hat dazu eine starke Meinung. Lies Dir ruhig durch,
was er schreibt und denke darüber nach. Nur lass Dir nicht die
Programmiersprache madig machen, an diesem Punkt übertreibt er gerne
maßlos.