Forum: Mikrocontroller und Digitale Elektronik Pointer auf IO-Register einer Funktion uebergeben


von Marcel (Gast)


Lesenswert?

Moin zusammen,
ich möchte ein IO-Register einer Funktion uebergeben, damit diese den 
Inhalt dort verändern kann, so wie ich es momentan mache, klappt es 
auch, doch leider mit einer Compiler Warnung :-(

Was mach ich denn falsch? Hab auch schon diverse Schlagworte in die 
Suche eingeben, doch leider ohne Erfolg
1
int main {
2
    function( &DDRA);
3
}
4
5
void function( char *ddr_cs){
6
   *ddr_cs = 0xFF;
7
}

Besten Dank im Vorraus und noch nen schönen Abend
Marcel

von Marcel (Gast)


Lesenswert?

Marcel schrieb:
> Compiler Warnung

warning: initialization discards qualifiers from pointer target type

von (prx) A. K. (prx)


Lesenswert?

void function(volatile uint8_t *ddr_cs){

von Marcel (Gast)


Lesenswert?

A. K. schrieb:
> void function(volatile uint8_t *ddr_cs){

Genial!
Ich danke dir :-) und im Nachhinein natürlich total logisch mit dem 
volatile :-/, manchmal sieht man den Wald vor lauter Bäumen nicht...

von Third E. (third-eye)


Lesenswert?

Hallo,

ich krame mal den Beitrag raus. Hatte soeben das gleiche Problem und die 
gleiche Lösung hat geholfen :-)
Hatte auch das volatile vergessen.

Was passiert eigentlich, wenn das volatile nicht dort steht?
Meint der Compiler dann, dass lediglich eine Variable übergeben, 
verändert und dann verworfen wird?

von Karl H. (kbuchegg)


Lesenswert?

Third Eye schrieb:

> Was passiert eigentlich, wenn das volatile nicht dort steht?

Das was bei 'nicht volatile' immer passieren kann.

> Meint der Compiler dann, dass lediglich eine Variable übergeben,
> verändert und dann verworfen wird?

Nö. Du übergibst ja nach wie vor einen Pointer.

Aber der Compiler kann durch die Datenflussanalyse zur Auffassung 
gelangen, dass in
1
void function( char *port){
2
  while( *port )
3
    i = 0;
4
}
der Wert *port sowieso immer das gleiche Ergebnis liefern muss und er 
den Wert daher nicht bei jedem Schleifendurchlauf erneut bestimmen muss. 
Einmal am Anfang genügt - denn der Wert ändert sich ja sowieso nicht. 
Sind ja keine Anweisungen da, die dies bewirken könnten.
Genau so wie in
1
void foo( int x )
2
{
3
  while( x )
4
    i = 0;
5
}

x ja auch immer denselben Wert hat. Denn: wer sollte denn den verändern?

Im zweiten Beispiel ist alles klar. Das ist ein Fehler des 
Programmierers und x kann in diesem Beispiel tatsächlich seinen Wert 
nicht ändern. Der Programmierer hat hier also (je nach Ausgangswert von 
x) eine Endlosschleife gebaut.

Aber im ersten Beispiel ist das nicht so. *port ist ja als Verbindung 
nach aussen gedacht. Schliesslich reden wir ja von Portpins. UNd die 
können sich sehr wohl verändern. Wenn der Compiler allerdings zur 
Auffassung  gelangt, dass er *port nicht jedesmal neu auswerten lassen 
muss, weil sich der Wert sowieso nicht verändern kann, dann kriegt das 
eben das Programm nicht mit, wenn jemand an den Portpins rumspielt.

FAQ: Was hat es mit volatile auf sich

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