Forum: PC-Programmierung Volatile struktur an Funktion übergeben


von Johannes (Gast)


Lesenswert?

Hallo,
ich habe ein eine structur, welche volatile parameter beinhaltet
1
typedef struct
2
{
3
  volatile uint16_t seconds;
4
  volatile uint8_t minutes;
5
  volatile uint8_t hours;
6
  volatile uint8_t day;
7
  volatile uint8_t month;
8
  volatile uint8_t year;
9
  volatile uint8_t valid    :1;
10
  volatile uint8_t leapYear :1;
11
}time_ts
1
volatile time_ts time_s;

dieser wird in in der ISR verändert.
Jetzt möchte ich diese Struktur aber auch einer Funktion übergeben und 
auch dort bearbeiten
1
void checkTime(&time_s)

Hier bekomme ich die Warnung:
passing argument 1 of checkTime discards volatile qualifier from pointer 
target type

Da habe ich zwei Fragen zu.
1) Müssen die einzelnen Elemente im Struct überhaupt volatile sein? Oder 
reicht es, wenn der struct an für sich volatile ist?

2) Wie kann ich die struktur einer Funktion übergeben?

von dummschwaetzer (Gast)


Lesenswert?

>void checkTime(&time_s)
???
da sollte der compiler abre anderefehlermeldungen werfen
>void checkTime(time_ts *time_s) könnte klappen

von Jens (Gast)


Lesenswert?

dummschwaetzer schrieb:
>>void checkTime(&time_s)
> ???
> da sollte der compiler abre anderefehlermeldungen werfen
>>void checkTime(time_ts *time_s) könnte klappen

Ja, du hast recht. Das void war verkehrt.
habe es abgetippt und ich weiß nicht.
Die Deklaration ist
1
 void checkTime(time_ts* time_s);
ich rufe die Funktion aber mit
1
checkTime(&time_s)
auf

von P. S. (namnyef)


Lesenswert?

Dort wo der Zugriff auf den Speicher erfolgt, muss der Compiler wissen, 
dass der Speicherinhalt "volatile" ist.

Der Prototyp von checkTime() müsste also so aussehen:
1
checkTime(volatile time_ts * foo);

Aber muss die Struktur überhaupt per Pointer an die Funktion übergeben 
werden? Wenn die Struktur in einer ISR geändert wird, hat sie doch 
vermutlich sowieso "global scope".

: Bearbeitet durch User
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.