Forum: Compiler & IDEs Richtiger Umgang mit EEPROM Variablen wenn ein signed Wert abgelegt und gelesen werden soll


von technikus (Gast)


Lesenswert?

Hallo,

ich habe folgendes Verständnisproblem.

Ich möchte negative Werte in das EEPROM meines Atmega32 schreiben.
Jetzt ist so ein int8_t ja genau so wie ein uint8_t ein Byte groß.

Ich deklariere also die EEPROM Variable:
1
int8_t eOffset      EEMEM = 0;

Jetzt möchte ich den Wert in eine int8_t variable schreiben
1
int8_t InputOffset [6] ;
2
InputOffset[1] = eeprom_read_byte(&eOffset) ;


Jetzt bekomme ich folgende Compilerwarnungen:

Warning  2  expected 'const uint8_t *' but argument is of type 'int8_t

O.K.  Die Read Byte Funktion möchte ein const uint8_t * und bekommt von 
mir ein const int8_t *.


Und da habe ich einen Knoten im Kopf. Wie gehe ich jetzt mit 
vorzeichenbehafteten EEPROM Variablen um?


Gruß
Technikus

von Hmm (Gast)


Lesenswert?

Schau. Die Interpretation von Daten hängt von den Operationen ab. 
Während etwa bei der Subtraktion uint und int durchaus unterschiedliche 
Ergebnisse zeitigen sollten, so spielt das beim speichern überhaupt 
keine Rolle.

Alles klar?

von technikus (Gast)


Lesenswert?

Ne, nicht klar, deswegen frage ich ja ;)

Wenn ich per eepromadbyte in ein int8_t schreibe und der Wert negativ 
ist, landet auch der negative Wert in der Variablen? Oder was meinst du?

Bei Rechnungen muss ich dann zu in8_t casten???


technikus

von Hmm (Gast)


Lesenswert?

>Ne, nicht klar, deswegen frage ich ja ;)
Die Frage bezieht sich natürlich auf die Situation nach meiner Antwort.

Lies' sie Dir ganz genau durch. Denk drüber nach. Lies nochmal. Wieder 
nachdenken. Und dann rückfragen, falls es dann noch notwendig ist.

Und dann noch was zum nachdenken.

Was unterscheidet eine 0 die ein positives Vorzeichen angeben soll von 
einer 0 die mit 2^15 multipliziert wird? Richtig! Nichts.

von Hmm (Gast)


Lesenswert?

Kann es sein, das Du überhaupt kein C kannst? Ich meine Du wirst doch 
nicht nach casten fragen, oder?

von technikus (Gast)


Lesenswert?

Wenn du das so sagst, dann kann ich wohl kein C.
Stört mich aber auch nicht persönlich.

Da du möchtest, dass ich mein Köpfchen einschalte mal laut gedacht:

Das Byte bleibt ein Byte, also ohne oder mit Vorzeichen, es wird ja 
lediglich ein Bit für das Vorzeichen genutzt. Daraus ergeben sich 
-127-127 dezimal in einem Byte.
Also ob ich das Byte mit oder ohne Vorzeichen speicher, bleibt es das 
gleiche.

Soweit war mir das vor der Frage klar.

Der Rückgabewert von so einem eepromreadbyte ist aber uint8_t und will 
ein *uint8_t.

Da beginnt der Knoten...und löst sich nicht, egal wie oft ich deinen 
netten Hinweis lesen...


technikus

von Hmm (Gast)


Lesenswert?

Ja ja, schon recht.
Schönes Leben noch.

von technikus (Gast)


Lesenswert?

???

von Karl H. (kbuchegg)


Lesenswert?

technikus schrieb:

> Das Byte bleibt ein Byte, also ohne oder mit Vorzeichen,

Eben.
Und da du weißt, das das so ist, und das das in diesem Fall in Ordnung 
ist, spricht nichts dagegen, den eeprom Routinen zu sagen:
Es ist mir egal, ob du beim Auslesen da ein Byte ohne oder mit 
Vorzeichen siehst, gib mir einfach das Byte, dessen Adresse ich dir 
gebe. Und wenn du die Adresse in Form eines Pointers auf einen uint8_t 
haben willst, dann gebe ich dir halt einen. Und wenn das heißt, dass ich 
meinen int8_t-Pointer auf einen uint8_t-Pointer umcaste, dann sei es 
eben so.



> Der Rückgabewert von so einem eepromreadbyte ist aber uint8_t

Auch.
Aber davon ist in der Fehlermeldung nicht die Rede
1
  InputOffset[1] = (int8_t) eeprom_read_byte( (uint8_t*) &eOffset) ;

von Ingo (Gast)


Lesenswert?

Ein zusätzlicher Cast ist doch garnicht nötig wenn die Variable links 
vom Gleichheitszeichen int8 ist, oder?!


Ingo

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

technikus schrieb:

> Ich deklariere also die EEPROM Variable:
>
> int8_t eOffset EEMEM = 0;
>
> Jetzt bekomme ich folgende Compilerwarnungen:
>
> Warning  2  expected 'const uint8_t *' but argument is of type 'int8_t

Das liegt nicht am vorzeichen sondern am fehlenden const in der 
Definition:
1
const int8_t eOffset EEMEM = 0;

Die korrekte Definition ist übrigens:
1
const volatile int8_t eOffset EEMEM = 0;

von Karl H. (kbuchegg)


Lesenswert?

Johann L. schrieb:
> technikus schrieb:
>
>> Ich deklariere also die EEPROM Variable:
>>
>> int8_t eOffset EEMEM = 0;
>>
>> Jetzt bekomme ich folgende Compilerwarnungen:
>>
>> Warning  2  expected 'const uint8_t *' but argument is of type 'int8_t
>
> Das liegt nicht am vorzeichen sondern am fehlenden const in der
> Definition:
>
>
1
const int8_t eOffset EEMEM = 0;

Spielt in dem Fall keine Rolle. Das const in

uint8_t eeprom_read_byte( const uint8_t * addr );

besagt lediglich, dass die Funktion den Pointer nicht benutzen wird, um 
damit den uint8_t des Aufrufers zu manipulieren. Ob das Argument des 
Aufrufers, dessen Adresse er übergibt, selber ein const uint8_t oder ein 
normaler uint8_t ist, spielt dann keine Rolle mehr.

Dieses const in der Argumentliste ist also eine Zusicherung an den 
Aufrufer und keine Forderung.

von technikus (Gast)


Lesenswert?

Danke Karl Heinz für deine super Erklärung!

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.