malloc für EEPROM

OP #677368
Lesenswert?

Hi,

ich bin gerade dabei mir eine Displayprogramm zu schreiben, das über I2C 
Daten bekommt. Die Daten können unterschiedlich lang sein, z.B. für 
menüpunkte oder Variablen, oder Text. Den großteil habe ich schon fertig 
(Anzeige, I2C, steuerung). Nun bin ich gerade dabei die über I2C 
empfangenen Daten als neue MenüElemente anzulegen.
Hierzu wollte ich die Funktion malloc verwenden. In den Dokus dazu steht 
immer etwas von Heap und Stack,  verstehe aber nicht so ganz verstehe.

könnt ihr mir das ein wenig erklären?
Gast #677445
Lesenswert?

Was genau willst du wissen? Heap und Stack liegen beide im SRAM. Der 
eine fängt unten an und wächst nach oben, der andere genau umgekehrt. 
Wenn du z.B. eine Variable anlegst (und diese nicht gerade in ein 
Register kommt), wird sie auf dem Stack abgelegt. Dann wird der 
Stackpointer um eins dekrementiert, so dass er wieder auf die nächste 
freie Speicherstelle zeigt. Wird die Funktion verlassen in der die 
Variable stand, wird der Stackpointer einfach wieder um 1 erhöht....

Das fällt mir so spontan dazu ein, keine Ahnung ob es dir weiterhilft 
;-)
Gast #677476
Lesenswert?

Eine malloc()-Funktion, die auf dem EEPROM basiert, gibt es meines 
Wissens nicht. Heap und Stack werden im internen oder externem RAM 
angelegt.
Du könntest Dir vielleicht die im RAM angelegten Strukturen ins EEPROM 
umkopieren.
Zu Heap und Stack gibts u.a.,hier Info:
1
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Speicherzugriffe

Viele andere threads hier im Forum befassen sich auch mit dem Thema. 
Lies mal ein bischen rum.
OP #681484
Lesenswert?

Hi

also speicher allocieren (calloc) funktioniert noch niocht so richtig. 
Ich habe eine Tabele, die sich zur laufzeit erweitern soll. Dafür stehen 
zwei Variablen zu verfügung:

tabelSize: ist die Anzahl der zu verfügungstehenden Tabelleneinträge und
numOfElements: ist die Anzahl der Eingetragenen werte.
ELEMENT: ist ein Define mit der Schritweite um die sich der Speicher 
erhöht.

Das 8., 9. und 10.Element der Tabelle ist nicht korrekt und zeigt auf 
einen anderen speicherbereich. Bereich.

hier der Codeausschnitt:
1
// leere Tabelle erstellen für 5 Einträge erstellen
2
tabelSize = ELEMENTE;
3
Tabelle = (tstZeile*) calloc( tabelSize, sizeof(tstZeile));
1
//evt.Speicher erweitern
2
if(tabelSize < (numOfElements + (ELEMENTE/2)))
3
{
4
tabelSize = tabelSize + ELEMENTE;
5
Tabelle = (tstZeile*) realloc( Tabelle, tabelSize * sizeof( tstZeile));
6
}
1
// Einträge in Tabelle machen
2
numOfElements++
3
Tabelle[numOfElements].id = Zeile.id;
4
Tabelle[numOfElements].element = pElement;
5
Tabelle[numOfElements].pos = Zeile.pos;
6
Tabelle[numOfElements].elementType = Zeile.elementType;
7
Tabelle[numOfElements].parent = Zeile.parent;

Könnt ihr mir sagen was ich da falsch mache? Ich habe schon ausprobiert 
die Schrittweite zu vergrößern, aber da verschiebt sich der Fehler nur.
Im anhan hab ich nochmal das ganze Projekt. Fals jemand die paar Zeilen 
nachlesen will.
Angehängte Dateien:

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