Was bedeutet Funktionsparameter(const prog_char *s) ?

Gast #941120
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:
1
f_P(const prog_char *s)
2
{
3
  const char* p= s; // zuweisung auf Variable ohne progmem
4
  char c= *s; // lesen ohne pgm_read_byte() zu verwenden
5
}

Danke!
Gast
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* ?
Persönliche Seite
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.
>
1
> typedef char PROGMEM   prog_char;
2
>

Wenn schon Makros auflösen, dann alle ;-)
1
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"
Persönliche Seite
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

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.