mikrocontroller.net

Forum: Compiler & IDEs malloc für EEPROM


Autor: Olaf :-) (opetersen)
Datum:

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

Autor: Lars (Gast)
Datum:

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

Autor: Andreas Paulin (Gast)
Datum:

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

Autor: Olaf :-) (opetersen)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
cool, danke das ist das was ich wissen wollte.

Autor: Olaf :-) (opetersen)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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:
// leere Tabelle erstellen für 5 Einträge erstellen
tabelSize = ELEMENTE;
Tabelle = (tstZeile*) calloc( tabelSize, sizeof(tstZeile));
//evt.Speicher erweitern
if(tabelSize < (numOfElements + (ELEMENTE/2)))
{
tabelSize = tabelSize + ELEMENTE;
Tabelle = (tstZeile*) realloc( Tabelle, tabelSize * sizeof( tstZeile));
}
// Einträge in Tabelle machen
numOfElements++
Tabelle[numOfElements].id = Zeile.id;
Tabelle[numOfElements].element = pElement;
Tabelle[numOfElements].pos = Zeile.pos;
Tabelle[numOfElements].elementType = Zeile.elementType;
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.

Autor: Olaf :-) (opetersen)
Datum:
Angehängte Dateien:

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

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.