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


von loetkolben (Gast)


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:
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!

von Johannes M. (johnny-m)


Lesenswert?

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

von loetkolben (Gast)


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* ?

von Johann L. (gjlayde) Benutzerseite


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.
>
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"

von Johannes M. (johnny-m)


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?

von Johann L. (gjlayde) Benutzerseite


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.