mikrocontroller.net

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


Autor: Andy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
void _eeprom_write_byte(uint8_t *ptr_EE,uint8_t value)
{
   
    for(uint8_t i=0;i<EEPROM_NUMBER_OF_COPIES;i++)
    {
        eeprom_write_byte(ptr_EE + (EEPROM_TOTAL_AMOUNT_OF_DATA*i),value);
        while((NVM.STATUS&0x02) != 0x02);
    }
    eepromDoCrc();
}

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andy (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andy schrieb:
> Aha... Das heißt ich könnte für
>
> void _eeprom_write_byte(uint8_t *ptr_EE,uint8_t value)
> 
> entweder
>
> _eeprom_write_byte(&test,0xFF);
> 
> oder z.B.
>
> _eeprom_write_byte(584,0xFF);
> 
> ü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.

Autor: TManiac (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
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.
uint8 *ptr_ui8;
uint16 *ptr_ui16;
MyType *ptr_to_Struct_MyType;

Autor: Andy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK, danke - habt mir sehr weitergeholfen. Werd das nochmal probieren...

lg
Andy

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.