eeprom_read_word()

Gast #100000
Lesenswert?

Ich dachte, ich hätte die EEProm Funktionen langsam verstanden aber bei
dem Quellcode:
u16 globalupdays _attribute_ ((section (".eeprom"))) = {0};
u16 uptimedays;
Und in einer Funktion dann:
uptimedays = eeprom_read_word(&globalupdays);

Gibt der Compiler eine Warnung aus: passing arg 1 of
`eeprom_read_word' form incompatible pointer type
Ersetze ich read_word durch read_byte und u16 globalupdays durch u08
globalupdays gibt es keine Warnungen.
Was habe ich falsch gemacht?
Gast #100001
Lesenswert?

Kann ich nicht nachvollziehen:

% cat foo.c
#include <avr/eeprom.h>
#include <inttypes.h>

uint16_t eefoo;
uint16_t foo;

void
readfoo(void)
{
        foo = eeprom_read_word(&eefoo);
}
% avr-gcc -W -Wall -c -mmcu=at90s8515 -O foo.c
%
Gast #100004
Lesenswert?

Also wenn ich wie in dem Beispiel von Jörg, anstelle von u16
globalupdays mit uint16_t deklariere funktionierts ohne Warnungen.
u16 steht bei mir für unsigned short.
Wenn ich mir die inttypes.h ansehe ist uint16_t als unsigned int
definiert.
Laut
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccelng/htm/basic_42.asp
würde
#typedef unsigned int uint16_t;
also 4 anstelle von 2 Byte belegen, und somit aus meiner sicht genau so
viel wie
#typedef unsigned long uint32_t;
Wo wäre dann denn der Unterschied zwischen uint16_t und uint32_t? Auch
reichen mir 16 Bit.
Gast #100005
Lesenswert?

Warum benutzt die eine Dokumentation, die nicht zum Produkt passt?
Schon mal versucht, mit ner Bedienungsanleitung vom Motorrad Auto zu
fahren? :-)

Wenn u16 bei Dir für unsigned short steht, und der Funktionsprototyp
für eeprom_read_word uint16_t verlangt, welcher mit unsigned int
deklariert wurde, dann hast Du zwei verschiedene Typen vermischt. Und
das klagt der Compiler - völlig zu recht - an.

Gruß,
Patrick...
Gast #100006
Lesenswert?

Die [u]intNN_t Definitionen in <inttypes.h> (*) sind ja genau für den
Zweck bestimmt, daß man damit Datentypen bekommt, die unabhängig von
der zugrundeliegenden Architektur eine bestimmte Bitbreite besitzen.

Das ist C-Standard (ISO-C99 allerdings, nicht ISO-C90 alias
ANSI-C89)!

(*) Eigentlich sollten sie in <stdint.h> stehen, aber das müssen wir
erst noch machen.  <inttypes.h> zieht aber per Standard die
Definitionen aus <stdint.h> ohnehin mit rein, insofern ist das auch
zukunftssicher.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren