mikrocontroller.net

Forum: Compiler & IDEs Was bedeutet Funktionsparameter(const prog_char *s) ?


Autor: loetkolben (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich bin Anfänger bei AVR, und hab mal ne kleine Frage:

Was bedeutet bei einer Funktion f_P(const prog_char *s) das Attribut
prog_char genau (das PROGMEM-Attribut der Variablen) ?

Im Tutorial steht ja, daß man Konstanten mit PROGMEM anlegen kann,
jedoch würde mich interessieren ob die Funktion f_P die auf *s mit
pgm_read_byte(s) zugreift, auch als f_P(const char* s)
deklariert werden darf.

Auch wüßt ich gern ob es eine Compiler-Option gibt, die warnt wenn ich
z.B. folgendes tu:
f_P(const prog_char *s)
{
  const char* p= s; // zuweisung auf Variable ohne progmem
  char c= *s; // lesen ohne pgm_read_byte() zu verwenden
}

Danke!

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
prog_char ist kein Attribut, sondern ein mittels typedef definierter 
Datentyp, der das Attribut PROGMEM enthält.
typedef char PROGMEM   prog_char;

Autor: loetkolben (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, hab mich da wohl etwas unklar ausgedrückt, das prog_char heißt
das der Datentyp char das Attribut PROGMEM hat.

Der Pointer darauf ist dann wohl von dem Attribut befreit,
d.h. GCC kennt intern keinen unterschied zwischen char* und prog_char* ?

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So ist es. Der Unterschied ist nur auf C-Typ Ebene und führt evtl zu 
Warnings, mehr nicht. Ausser eben bei der Definition eines Typs, der 
dann im FLASH angelegt wird bzw. Section .progmem.data. anstatt .data 
oder .bss.

Johannes M. wrote:
> prog_char ist kein Attribut, sondern ein mittels typedef definierter
> Datentyp, der das Attribut PROGMEM enthält.
>
> typedef char PROGMEM   prog_char;
> 

Wenn schon Makros auflösen, dann alle ;-)
typedef char prog_char __attribute__((__progmem__));

Was gcc in Ende sieht ist also ein Typ, an dem ein Attribut klebt.
Auf den Zugriff über einen so attribuierten Zeiger hat das aber keinen 
Einfluss, d.h. avr-gcc erzeugt den selben Code. Man muss also immer 
händisch über pgm_foo o.ä. zugreifen.

Siehe auch

Beitrag "Re: function c asm bedeutung"

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Johann L. wrote:
> Wenn schon Makros auflösen, dann alle ;-)
Ich habe gar kein Makro aufgelöst! Oder seit wann ist typedef ein 
Makro?

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Johannes M. wrote:
> Johann L. wrote:
>> Wenn schon Makros auflösen, dann alle ;-)
> Ich habe gar kein Makro aufgelöst! Oder seit wann ist typedef ein
> Makro?

typedef ist kein Makro. Aber um beurteilen zu können, was ein typedef 
macht, muss man schon wissen, was auf der rechten Seite steht. Bzw. was 
der Compiler (hier cc1 bzw. cc1plus, die vom Treiber ebenso wie as 
(Assembler) und ld (Linker) aufgerufen werden) sieht. Er sieht das, was 
der Präprozessor ausgibt, also den Inhalt von .i bzw. .ii

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.