Forum: Mikrocontroller und Digitale Elektronik unterschied fprintf_p und fprintf


von Baur (Gast)


Lesenswert?

hallo

kann mir jemand sagen worin der unterschied fprintf und frintf_P liegt


mfg dbaur

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Letztere ist eine AVR-spezifische Variante, die aus dem Flash liest.

von Baur (Gast)


Lesenswert?

ok
dankeschön.

mfg dbaur

von PeterP (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.