Forum: Mikrocontroller und Digitale Elektronik Anfängerfrage: Pointer übergeben


von Andy (Gast)


Lesenswert?

Hallo,
Ich habe eine vielleicht blöde Frage:
Ihr kennt doch die Funktionen "eeprom_write_byte()" und 
eeprom_read_byte". Ich habe eine neue Funktion gebaut, die so aussieht:
1
void _eeprom_write_byte(uint8_t *ptr_EE,uint8_t value)
2
{
3
   
4
    for(uint8_t i=0;i<EEPROM_NUMBER_OF_COPIES;i++)
5
    {
6
        eeprom_write_byte(ptr_EE + (EEPROM_TOTAL_AMOUNT_OF_DATA*i),value);
7
        while((NVM.STATUS&0x02) != 0x02);
8
    }
9
    eepromDoCrc();
10
}

Mit dieser Funktion erstelle ich automatisch eine (oder mehrere) 
Sicherheitskopien im EEPROM (mit CRC-Code verifiziert) um im Fehlerfall 
noch richtige Daten zu haben. Die Anzahl der Daten im EEPROM und die 
Anzahl der zu erstellenden Kopien stelle ich mit 
EEPROM_TOTAL_AMOUNT_OF_DATA bzw. mit EEPROM_NUMBER_OF_COPIES ein.

Ein Aufruf sieht z.B. folgendermaßen aus:
1
_eeprom_write_byte(&test,0xFF);

Nun zu meinem Problem: Was ist, wenn ich auf einen Bereich über der 
EEPROM-Adresse 0xFF schreiben will. Ich übergebe hier doch einen Pointer 
(uint8_t *ptr_EE) und in der Funktion gebe ich die zu beschreibende 
EEPROM-Adresse explizit an. Wenn ich viele Daten habe, muss ich dort 
definitiv Werte über 255 angeben. Muss ich dann uint16_t *ptr_EE 
schreiben? Wie muss ich da vorgehen, bin da ein bisschen ein Anfänger! 
:)

Vielen Dank für eure Hilfe!

mfg
Andy

von Karl H. (kbuchegg)


Lesenswert?

Andy schrieb:

Du verwechselt den Datentyp eines Pointers mit dem Datentyp dessen, 
worauf der Pointer zeigt.

Ein Pointer ist immer so gross, dass er den verfügbaren Speicher 
adressieren kann. Und das hat nichts damit zu tun, was du dann an dieser 
Adresse tatsächlich ablegst, sei es ein Byte, ein Word, ein String oder 
was auch immer.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Andy schrieb:
> Ich übergebe hier doch einen Pointer
> (uint8_t *ptr_EE) und in der Funktion gebe ich die zu beschreibende
> EEPROM-Adresse explizit an.

Der Pointer selbst ist die Adressinformation, nicht das, worauf er 
zeigt.

von Andy (Gast)


Lesenswert?

Aha... Das heißt ich könnte für
1
void _eeprom_write_byte(uint8_t *ptr_EE,uint8_t value)
entweder
1
_eeprom_write_byte(&test,0xFF);
oder z.B.
1
_eeprom_write_byte(584,0xFF);
übergeben, obwohl in der Definition uint8_t *ptr_EE steht??

von Karl H. (kbuchegg)


Lesenswert?

Andy schrieb:
> Aha... Das heißt ich könnte für
>
1
> void _eeprom_write_byte(uint8_t *ptr_EE,uint8_t value)
2
>
> entweder
>
1
> _eeprom_write_byte(&test,0xFF);
2
>
> oder z.B.
>
1
> _eeprom_write_byte(584,0xFF);
2
>
> übergeben, obwohl in der Definition uint8_t *ptr_EE steht??

Ja.
Das uint8_t bezieht sich darauf, was man im Speicher findet, wenn man 
unter dieser Adresse nachsieht.

von TManiac (Gast)


Lesenswert?

Nun musste ich selber erst zweimal überlegen wie die Antworten gemeint 
sind. Und da ich denke dass der Fragensteller es auch nicht gleich 
versteht noch einmal.

mit
1
uint8_t *ptr_EE

deklarierst du einen Pointer der auf eine Stelle zeigt an der ein uint8 
Wert steht. Du weißt zum Zeitpunkt der Programmierung aber nicht 
explizit wie groß (wieviel Bits) der Pointer selber ist. Du kannst davon 
ausgehen, dass der Compiler den Pointer genauso groß macht, dass dein 
Controller damit arbeiten kann, inklusive der Paging-Geschichten mancher 
Controller.

Der Pointer wird immer gleich groß sein egal auf was er zeigt.
1
uint8 *ptr_ui8;
2
uint16 *ptr_ui16;
3
MyType *ptr_to_Struct_MyType;

von Andy (Gast)


Lesenswert?

OK, danke - habt mir sehr weitergeholfen. Werd das nochmal probieren...

lg
Andy

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.