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?
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 ;-)
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.