mikrocontroller.net

Forum: Compiler & IDEs Hilfe bei Code-Interpretation


Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe mir kürzlich eine Lib zu ansteuerung eines Displays hier aus 
dem Forum geladen. Nun versuche ich, den Code nachzuvollziehen. Kann mir 
da vielleicht jemand kurz etwas Schützenhilfe geben. Folgende Passage 
ist mir nicht verständlich:

#define lcd_string_P(__s)       lcd_string(P(__s))

#ifndef P
#define P(s) ({static const char c[] _attribute_ ((progmem)) = s;c;})
#endif

#ifndef cbi
#define cbi(sfr, bit)     (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit)     (_SFR_BYTE(sfr) |= _BV(bit))
#endif


Danke und Gruß, Alex

: Verschoben durch Moderator
Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du kennst #define-Makros?
Nein: RTFM, in diesem Fall jedes beliebige C-Lehrbuch

Ja:
Du weisst, was progmem, sbi und cbi bedeuten könnten?
Nein: RTFM, in diesem Fall das AVR-gcc-tutorial oben links

Ja:
Was ist dann noch unklar?

Oliver

Autor: Martin Freund (martinf)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> #define P(s) ({static const char c[] __attribute__ ((progmem)) = s;c;})
Wrapper für ne (GCC) Extension, damit kann man einen String innerhalb 
einer Funktion als prog_char* definieren und verwenden.

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke,

bis auf die Zeile in Martin's Post habe ich den Ret nach Oliver's 
freundlichem Hinweis verstanden.

@Marin: kannst Du mir das kurz etwas genauer erläutern. Ich glaube 
Hintergrund der Codezeile ist, dass die Font-Datei der Lib im 
Programmspeicher des Controllers liegt. Das passt zumindest ach zu dem, 
was Du gerade geschrieben hast.

Danke, Alex

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das sorgt lediglich dafür, dass der angegebene String im Flash des 
Controllers gespeichert wird und nicht im SRAM.
Und zwar ohne dass man da lange großartige Verrenkungen mit 
Hilfsvariablen machen muss.
   lcd_string_P( "Hallo Welt" );

die Funktion lcd_string (also die Variante ohne P) bekommt einen Pointer 
der ins Flash zeigt und freundlicherweise wird auch gleich noch dafür 
gesorgt, dass an eben genau dieser Stelle im Flash der Text "Hallo Welt" 
zu liegen kommt.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Beispiel:
Du schreibst:
 char* mytext = P("Hallo"); 


Der Präprozessor wandelt das um in:
 char* mytext = {static const char c[] __attribute__ ((progmem)) = "Hallo";c;}

Das nutzt jetzt eine Spracherweiterung des Gnu-C-Compilers: Ein Block 
{...} hat den Wert seiner letzten Anweisung, in diesem Fall den Wert von 
c, und kann damit auf der rechten Seite einer Zuweisung stehen. c wird 
in der Anweisung davor als char-Array im Flash deklariert und 
initialisiert.

Also steht da im Prinzip, zusammengefasst in einer Zeile:
 
static const char c[] __attribute__ ((progmem)) = "Hallo";
char* mytext = c;

nur das die Variable c in der Einzeilenfassung nach aussen nicht 
sichtbar ist.

Oliver

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nachtrag:

Dafür gibt es eigentlich seit ewigen Zeiten das Makro PSTR in der 
avrlibc.

Oliver

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank,

das war einiger Input, den ich erst einmal einziehen lassen muss, aber 
ich hab schon verstanden, wo die Reise hingeht. Euch Vielen Dank,

Alex

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.