unterschied fprintf_p und fprintf

Gast #1136948
Lesenswert?

Vielleicht sollte man da ein paar erklaerende Worte hinzufuegen:

Die Harvardt-Architektur von den AVR-Controllern trennt strikt zwischen 
Datenzugriffen und Codezugriffen, die beide implizit in vollkommen 
getrennte Speicherbereiche zeigen. Alle Codebefehle (Sprungbefehle etc.) 
beziehen sich auf eine Adresse im Codebereich, alle Datenbefehle auf 
eine Adresse im Datenbereich.
Für den Ausnahmefall eines Datenzugriffes auf den Codebereich (notwendig 
zum Umkopieren der Variableninitialisierungen) gibt es gesonderte 
Assemblerbefehle, die die angegebene Adresse entsprehcend anders 
interpretieren.
Das heisst, ein an eine Funktion uebergebener Pointer kann sowohl ins 
(Daten)RAM als auch ins (Code)ROM zeigen, es gibt jedoch KEINE 
Moeglichkeit fuer die aufgerufene Funktion, festzustellen, welche von 
beiden Moeglichkeiten zutrifft.

Daher gibt es zwei Routinen, eine ohne (die normale) und eine mit '_P'. 
Letztere geht im Code einfach davon aus, dass der Formatstring im ROM 
steht und der uebergebene Pointer ein ROM-Pointer ist.

Da aber die Compiler normale Strings zwar ins Rom schreiben (wohin auch 
sonst), bei der Initialisierung aber wie die Initialisierungswerte von 
Variablen ins RAM kopieren und die Pointer auch an die RAM-Position 
linken, muss man bei Verwendung der _P-Varianten auch sicherstellen, 
dass es sich wirklich um einen im ROM stehenden String handelt.
Dies erledigt beispielsweise das Macro PSTR().
Der String wird dann auch nicht ins RAM kopiert. Er ist jedoch mit 
normalen C-Befehlen (Arrayzugrif etc.) nicht ohne weiteres ansprechbar, 
da diese auf die entsprechende Stelle im RAM zugreifen wuerden anstatt 
mit den Spezialbefehlen aufs ROM.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren