mikrocontroller.net

Forum: Compiler & IDEs Volatile Struct, Member nicht volatile


Autor: Daniel G. (motello)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe folgende Deklaration eines Structs:
struct RxPd_typ {

    /* -1: not fragmented; >=0: fragment offset */
    short fragment_offset;

    /* 0: not processed; 1 = processed */
    short processed;

    short ip_checksum;
    short udp_checksum;
    unsigned char * dataptr;
    short header_length;
    short udp_length;
    short ip_length;
    unsigned char command;
};
und zusätzlich:
extern volatile struct RxPd_typ RxPd[1024];

Definition ist in einer .c Datei:
volatile struct RxPd_typ RxPd[1024];

Schreibe ich nun folgende Variable:
volatile unsigned char *ptr;

auf
RxPd[x].dataptr = ptr;

Meckert der Compiler, dass das volatile verworfen wird. Wenn ich dataptr 
im struct nochmal extra mit volatile kennzeichne, gehts. Wieso wird 
volatile nicht auf alle members angewandt? Wenn ich mich nicht völlig 
blind war, hab ich es genauso gemacht, wie es u.a. hier in einem anderen 
forenbeitrag beschrieben wurde.

grüße
daniel

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein pointer to volatile (volatile int *p) ist nicht das gleiche wie ein 
volatile pointer (int *volatile p).

Autor: Daniel G. (motello)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
A. K. schrieb:
> Ein pointer to volatile (volatile int *p) ist nicht das gleiche wie ein
> volatile pointer (int *volatile p).

das weiß ich, aber ich habe nirgends einen volatile pointer. mit "Wenn 
ich dataptr im struct nochmal extra mit volatile kennzeichne" meine ich 
folgendes:
struct RxPd_typ {

    /* -1: not fragmented; >=0: fragment offset */
    short fragment_offset;

    /* 0: not processed; 1 = processed */
    short processed;

    short ip_checksum;
    short udp_checksum;
    volatile unsigned char * dataptr;
    short header_length;
    short udp_length;
    short ip_length;
    unsigned char command;
};

in diesem Fall meckert der compiler nicht.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Daniel G. schrieb:
> A. K. schrieb:
>> Ein pointer to volatile (volatile int *p) ist nicht das gleiche wie ein
>> volatile pointer (int *volatile p).
>
> das weiß ich, aber ich habe nirgends einen volatile pointer.

DOCH! Und zwar genau dann, wenn du das Struct volatile machst ist auch 
der Pointer volatile. Aber nicht das, worauf er zeigt.

Autor: Daniel G. (motello)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
aaaaaachso... na das muss man erstmal wissen! vielen dank!

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.