Forum: Mikrocontroller und Digitale Elektronik Structs in eeprom minimalcode durchschauen


von Timo P. (latissimo)


Lesenswert?

Hallo!

Folgenden Minimalcode habe ich geschrieben. Gerade habe ich keinen 
Controller zum Testen. Kompiliert habe ich mit dem winavr für einen 
Atmega328P.

Evtl. könnt ihr mal den kleinen code angucken und bescheid geben, falls 
es so nicht funktioniert. DANKE!
1
#include <avr/io.h>
2
#include <avr/eeprom.h>
3
#define MAX_IDS    10
4
5
struct id_s{
6
  unsigned char ids_in_list;
7
  unsigned long id_list[MAX_IDS];
8
}whitelist;
9
10
void eeprom_write_struct(short addr,void *obj,char size);
11
void eeprom_read_struct(short addr,void *obj,char size);
12
13
void add_id(unsigned long data){
14
  whitelist.id_list[whitelist.ids_in_list] = data;
15
  whitelist.ids_in_list++;
16
  eeprom_write_struct(0,&whitelist,sizeof(whitelist));     //Write the structure to EEPROM
17
}
18
19
int main(){
20
  eeprom_read_struct(0,&whitelist,sizeof(whitelist));
21
  add_id(1234567UL);
22
  return 0;
23
}
24
25
void eeprom_write_struct(short addr,void *obj,char size){
26
      char i,*ptr=(char *)obj;
27
      for (i=0;i<size;i++)
28
            eeprom_write_byte(addr++,*(ptr++));
29
}
30
31
void eeprom_read_struct(short addr,void *obj,char size){
32
      char i,*ptr= (char *)obj;
33
      for (i=0;i<size;i++)
34
            *(ptr++)=eeprom_read_byte(addr++);
35
}

von Karl H. (kbuchegg)


Lesenswert?

> void eeprom_write_struct(short addr,void *obj,char size){
>      char i,*ptr=(char *)obj;
>      for (i=0;i<size;i++)
>            eeprom_write_byte(addr++,*(ptr++));
> }
>
> void eeprom_read_struct(short addr,void *obj,char size){
>       char i,*ptr= (char *)obj;
>       for (i=0;i<size;i++)
>             *(ptr++)=eeprom_read_byte(addr++);
> }

Gratuliere:
Du hast gerade die Funtionen eeprom_write_block bzw. eeprom_read_block 
neu erfunden. Nur dass du für size den falschen Datentyp genommen hast 
:-)

von Timo P. (latissimo)


Lesenswert?

gerade habe ich gelesen:

size_t corresponds to the integral data type returned by the language 
operator sizeof

damit weiß ich nun,dass sizeof keine funktion ist, sondern ein Operator, 
der daten im format size_t zurückgibt.

also ich füttere die Funktionen ja mit dem argument sizeof(...) dann 
werde ich mal die funktionsköpfe entsprechend von char auf size_t 
ändern. Das sollte dann reichen oder?

von Karl H. (kbuchegg)


Lesenswert?

Timo P. schrieb:
> gerade habe ich gelesen:
>
> size_t corresponds to the integral data type returned by the language
> operator sizeof
>
> damit weiß ich nun,dass sizeof keine funktion ist, sondern ein Operator,
> der daten im format size_t zurückgibt.
>
> also ich füttere die Funktionen ja mit dem argument sizeof(...) dann
> werde ich mal die funktionsköpfe entsprechend von char auf size_t
> ändern. Das sollte dann reichen oder?

Ähm.
Warum nimmst du nicht die Funktionen eeprom_read_block bzw. 
eeprom_write_block anstelle deiner Funktionen? Die machen genau das 
gleiche.

von Timo P. (latissimo)


Lesenswert?

weil ich die funktionen noch nicht kannte. Meine Recherche hatte mich 
hierher verschlagen: (ist PIC von Microchip)


http://helmpcb.com/software/reading-writing-structs-floats-and-other-objects-to-eeprom

nun weiß ich aber, dass diese block- funktionen in der eeprom.h von der 
avrlibC drin sind.....

von Karl H. (kbuchegg)


Lesenswert?

Dann wirds Zeit das
AVR-GCC-Tutorial
zumindest überaschlagsmässig mal zu durchforsten.

von Timo P. (latissimo)


Lesenswert?

Gibt es eine geschickte Möglichkeit, eine ID in der whitelist ausfindig 
zu machen?

Reicht eine for schleife, die direkte Vergleiche durchführt, oder gibt 
es geschicktere Wege als z.B.
1
char validate_id(unsigned long *compare)
2
{
3
  for(char i = 0; i<whitelist.ids_in_list;i++)
4
  {
5
     if(whitelist.id_list[i] == compare
6
     return ACCEPT;
7
  } 
8
  return DENY;
9
}

von Karl H. (kbuchegg)


Lesenswert?

Bei 10 Einträgen lohnt es nicht, sich da einen Kopf wegen Optimierungen 
zu machen.

Im Allgemeinen: ja, die gibt es. (*)

Wie suchst du denn in einem Telefonbuch nach "Meyer"?
Du schlägst es in der Mitte auf und liest Huber. Meyer kommt alphabetich 
nach Huber, also kannst du die erste Hälfte des Telefonbuchs schon mal 
vergessen, dort kann Meyer nicht sein. Aus der hinteren Hälfte nimmst du 
wieder die Mitte und findest "Peter". Meyer ist alphabeteich vor 
"Peter", also kannst du von deinem jetzigen Suchebereich schon mal die 
hintere Hälfte vergessen. Und das machst du so lange, bis du beim Meyer 
bist, oder dein Suchbereich dir sagt, dass Meyer nicht vorkommt.
Voraussetzung: Die Daten müssen sortiert sein.

(*) Es gibt noch viele andere Möglichkeiten. Donald Knuth hat einen 
ganzen >300 Seiten starken Wälzer zu diesen Themenbereichen geschrieben. 
Aus der Reihe "The art of computer programming" (wenn mich nicht alles 
täuscht) den Volume 2: "Sorting and Searching"

von Timo P. (latissimo)


Lesenswert?

Ich denke, dann werde ich mir die Mühe nicht machen. Es geht bei der 
whitelist um eine Berechtigungsliste von Funkkomponenten-IDs. Es sind ja 
auch nur ca 10Stk.

Danke für die Hilfe und auch für den gezeigten Link!

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.