Forum: Mikrocontroller und Digitale Elektronik avr port übergeben warum volatile


von michael (Gast)


Lesenswert?

Hallo,


Laut wikipedia wird volatile in c verwendet um anzuzeigen, dass sich ein 
Wert jederzeit ändern kann, vgl. 
http://de.wikipedia.org/wiki/Volatile_(Informatik)


Wenn man einen Port als Parameter übergeben möchte, muss man in der 
Parameterliste volatile benutzen, vgl.:
1
void set_bits_func_correct (volatile uint8_t *port, uint8_t mask)
2
{
3
    *port |= mask;
4
}
http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_port_pass


Hier wird die Adresse eines Portes übergeben, die sich jedoch nicht 
ändern sollte. Wozu wird das volatile dann benötigt? Was hat es zu 
bedeuten?

Vielen Dank und Viele Grüße
Michael

von Johann L. (gjlayde) Benutzerseite


Lesenswert?


von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Eine korrekte, glitchfreie Implementierung sieht übrigens so aus:
1
#include <util/atomic.h>
2
3
void set_bits (volatile uint8_t *port, uint8_t mask)
4
{
5
    ATOMIC_BLOCK (ATOMIC_RESTORESTATE)
6
        *port |= mask;
7
}

von Uwe .. (uwegw)


Lesenswert?

Einfache Merkregel: Deklarationen von Varaiblen werden in C immer vom 
Rechts nach Links gelesen.
Hier ergibt das dann:

port
ist ein Zeiger
auf einen uint8_t
der volatile ist.

von michael (Gast)


Lesenswert?

Danke für alle Antworten.

volatile bezieht sich also auf den Inhalt des Ports. Könnte man dann 
nicht auf volatile verzichten, falls keine Interrupts verwendet werden, 
die den Inhalt des Ports verändern könnten?

Viele Grüße
Michael

von Falk B. (falk)


Lesenswert?

@michael (Gast)

>nicht auf volatile verzichten, falls keine Interrupts verwendet werden,
>die den Inhalt des Ports verändern könnten?

Nein. Denn die HARDWARE verändert die Ports. Ausserdem willst du nicht, 
das Zugriffe, egal ob Lesen oder Schreiben, vielleicht wegoptimiert 
werden. EIn Portzugiff muss so augeführt werden wie er dasteht.

von Karl H. (kbuchegg)


Lesenswert?

michael schrieb:
> Danke für alle Antworten.
>
> volatile bezieht sich also auf den Inhalt des Ports. Könnte man dann
> nicht auf volatile verzichten, falls keine Interrupts verwendet werden,
> die den Inhalt des Ports verändern könnten?

Dann überleg mal, welche Möglichkeiten du dem Compiler ermöglichst, wenn 
du mittels

   PORTB |= (1 << PB0);
   PORTB |= (1 << PB1);

eigentlich eine geordnete Reihenfolge haben möchtest, in der die Pins 
auf 1 gehen und was ein Compiler daraus machen könnte, wenn er nicht an 
volatile gebunden wäre.

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.