Forum: Compiler & IDEs malloc für EEPROM


von Olaf :. (opetersen)


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?

von Lars (Gast)


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 
;-)

von Andreas Paulin (Gast)


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.

von Olaf :. (opetersen)


Lesenswert?

cool, danke das ist das was ich wissen wollte.

von Olaf :. (opetersen)


Angehängte Dateien:

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.

von Olaf :. (opetersen)


Angehängte Dateien:

Lesenswert?

Damit man sich vorstellen kann was das Display menü macht, hier ein 
Bild.

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.