Gast
#514215
hallo kann mir jemand sagen worin der unterschied fprintf und frintf_P liegt mfg dbaur
|
Anzeige
|
unterschied fprintf_p und fprintf
Gast
#514215
hallo kann mir jemand sagen worin der unterschied fprintf und frintf_P liegt mfg dbaur Letztere ist eine AVR-spezifische Variante, die aus dem Flash liest.
Gast
#514238
ok dankeschön. mfg dbaur
Gast
#1136948
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 schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|