Hallo Max,
Das ist ein Stück Code, wie es eigentlich beim startup vor dem
eigenlichen Programm aufgeführt wird.
Nach dem reset sind auf einem uC noch nicht die Bedingungen gegeben, von
denen man in einer Hochsprache ausgeht. In C sind es nicht so viele und
oft wird alles Nötige in einem Stück assemblercode erledigt, aus dem
dann main aufgerufen wird. Wird der uC nur mit internem RAM u. ROM
betrieben, ist bei den Standard-Libs meist schon der nötige Code oder
ein Object file vorhanden, welches automatisch mit gelinkt wird.
Im bss Segment landen globale und statische Variablen, welche nicht
direkt explizit initialisiert werden. In C sind diese automatisch Null.
Die Schleife nullt das gesammte bss segment aber wohl auch den "oberen"
bis zu diesem Punkt zur Laufzeit nicht genutzten Teil des Stack, der
meist auf das bss segment folgt (maximal jedoch bis addr 0x38f). Wobei
das nur mit nen paar Annahmen aufgeht.
Hier wird in i das lowbyte des Stackpointers gespeichert und dann
invertiert:
1 | i = input(SPL);
|
2 | i ^= 0xFF;
|
und hier von der letzten stackaddresse abgezogen.
Für mich ergibt das Sinn, wenn das stack segment bei 0x300 beginnt, die
Stackgröße 256 Byte beträgt und __stack auf 0x3FF liegt.
Für die Berechnung der aktuellen stackgröße ist dann nur das lowbyte des
stackpointers notwendig. Die Invertierung ist äquivalent zu 255 - SPL.
&__stack - (255 - SPL) ergibt dann 0x300 + SPL, also die kleinste
genutzte adresse vom stack.
Der Code ist wirklich nicht so dolle.
Es gibt keinen Kommentar, der beschreibt, warum dies so gemacht wurde.
Was der Code macht, ist nicht wirklich offensichtlich. Es geht nur mit
gewissen Rahmenbedingungen auf, die auch nicht in nem Kommentar
auftauchen.
Die feste Maximalgrenze von 0x38f macht mich etwas stutzig. Da wäre dann
doch einiges vom stack zum zeitpunkt des aufrufs belegt. Es laufen wohl
schon einige funktionen die lokale variablen angelegt haben, aus diesen
dann diese init funktion aufgerufen wird. Oder in main werden viele
variablen angelegt die die gesammte laufzeit von bedeutung sind.
Schöne Grüße
Stephan