hallo kann mir jemand sagen worin der unterschied fprintf und frintf_P liegt mfg dbaur
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.