mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik unterschied fprintf_p und fprintf


Autor: Baur (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo

kann mir jemand sagen worin der unterschied fprintf und frintf_P liegt


mfg dbaur

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Letztere ist eine AVR-spezifische Variante, die aus dem Flash liest.

Autor: Baur (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok
dankeschön.

mfg dbaur

Autor: PeterP (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.