Kevin B. schrieb:
> ich habe eine Frage bezüglich des Speichers einer Übergabevariable.
> Bei der folgenden Funktion wird diese ja im Stack des Controllers
> gespeichert:
Nein.
1 | > void uart_puts (char *s)
|
2 | > {
|
3 | ...
|
4 | > }
|
Parameter können, müssen aber nicht auf dem Stack übergeben werden. Die
Übergabe in Prozessorregistern ist deutlich effizienter, funktioniert
aber (offensichtlich) nur für wenige respektive kurze Parameter.
Deswegen wird meist ein Mix angewandt: die ersten N Parameter werden in
Registern übergeben, wenn es weitere Parameter gibt, wird zusätzlich der
Stack benutzt. Diese Festlegung ist ein Teil des ABI und kann je nach
Plattform (und manchmal auch je nach Compiler) verschieden sein. Auch
wer den Stack aufräumt und wie das im Detail geschieht, regelt das ABI.
Dein zweiter Fehler ist, daß du davon ausgehst, der String würde als
Kopie übergeben. Dabei sagt doch schon die Signatur der Funktion, daß da
ein Pointer auf char übergeben wird. Der String wird zum Zeitpunkt des
Aufrufs irgendwo im Speicher stehen (das kann sowohl RAM als auch ROM
sein, kommt auf den Aufruf an). Der Funktion wird lediglich ein Zeiger
auf das (vulgo: die Adresse des) ersten Zeichens übergeben.