Malloc und Rekursionen sind Teufelszeug und haben auf einem µC nichts zu
suchen, wenn man auf Stabilität und Zuverlässigkeit Wert legt !
Malloc braucht man nicht, da ja auf einem µC fest steht, welche
Funktionen laufen müssen und wieviel Speicher sie benötigen.
Und nur dann, wenn man die Variablen schon zur Compilezeit in der
richtigen Größe angibt, ist der Linker auch in der Lage, den benötigten
Speicher zu berechnen und zu meckern, falls es nicht reicht.
Natürlich sollte man zur effektiven Speicherverwaltung auch
Variablenfelder lokal zu einer Funktion anlegen, wenn sie nur benötigt
werden, solange diese Funktion auch ausgeführt wird.
Rekursionen sind nur ein Programmierstil um Funktionen möglichst
unlesbar zu gestalten.
Oftmals braucht es lange, um die Abbruchbedingung zu erkennen. Auch beim
Debuggen sind Rekursionen nur schwer zu handhaben, da man dann von
sämtlichen Variablen mehrere verschiedene Instanzen hat und der Debugger
aber immer nur die letzte Instanz anzeigt.
Die Hauptgefahr, besteht jedoch darin, daß Rekursionen dazu verleiten,
eine Notabbruchbedingung zu vergessen !
D.h. wenn durch ungünstige Eingangswerte die geplante Abbruchbedingung
nie erreicht wird, spielt es keine Rolle, ob ich 128 Byte oder 128MByte
RAM habe. Es dauert nur unterschiedlich lange, bis die Endlosrekursion
den Speicher aufgebraucht hat und die CPU sich ins Nirwana
verabschiedet.
Beliebte Absturzbeispiele sind float Vergleich auf 0 oder
Reihenentwicklung mit ständig schwankendem Endergebnis.
Bei einer besser lesbaren Schleifenprogramierung bietet sich der
Schleifenzähler quasi von selbst an, bei Überschreitung eine
Fehlerbehandlung durchzuführen, ohne daß die CPU komplett abschmiert.
Der Debugger kann durch den Schleifenindex auch bequem die
Zwischenergebnisse jedes Durchlaufs darstellen, da ja alle Variablen
während des gesamten Durchlaufs sichtbar sind.
Auch sind Schleifen wesentlich effektiver im Speicherverbrauch und auch
schneller, da unnötige CALLs und RETURNs entfallen.
Rekursionen müssen für jede Variable bei jedem Durchlauf umständlich
Duplikate auf dem Stack anlegen.
Schleifen können dagegen Variablen die nur einmal benötigt werden auch
nur einmal anlegen bzw. alle Variablenfelder auf einen Ruck anlegen.
Es gibt ja immer mal Konteste, wer den unleserlichsten C-Code schreiben
kann, Rekursionen sind da immer mit dabei.
Peter