Gibt es eigentlich probate 'best practice' Wege zu unterbinden, dass der
main() Aufruf das Ram mit nutzlosem Stackmüll verschwendet?
Bei meinem letzten Projektchen auf einem ATtiny13 behalf ich mir durch:
1 | int
|
2 | __attribute__ ((naked)) // verhindert dass Register auf dem Stack "gesichert" werden
|
3 | __attribute__ ((section (".init8"))) // umgeht Aufruf per rcall, spart 2 Bytes Stack Ram
|
4 | main(void) {
|
5 | while (1) {
|
6 | //...
|
7 | }
|
8 | return 0;
|
9 | }
|
Natürlich darf man so keine Rekursion auf main mehr aufrufen, weil wegen
'naked' keine Register gerettet werden. Aber wer will das schon.
Auch darf main() niemals zu Ende laufen, denn diese Funktion geht ja
davon aus per rcall aufgerufen worden zu sein. Durch ".init8" wird der
Code von main() aber direkt vor dem üblichen rcall auf main() eingefügt.
Also rennt das Programm schon in main() rein, bevor es zu diesem rcall
gelangt. Somit wird auch keine Rücksprungaddresse auf den Stack gelegt.
Eigentlich ist das ja dreckig, aber wegen der Endlosschleife in main()
auch nicht relevant.
Ist der Weg gut? Gibt es bessere? Wie vermeidest Du Verschwendung von
Ram?