Forum: Mikrocontroller und Digitale Elektronik Arbeitsspeicher sparen


von Manuel S. (doc-snyder)


Lesenswert?

Hallo Leute,

ich habe trotz Optimiereung schon 1,7 kByte meines SRAM (Mega 32) voll 
wenn ich meinem AVRStudio glauben kann.

Meine Frage ist nun woher kommt dieser Verbrauch? Ich schätze meine 
Variablen auf ca 50-100 an der Menge plus ein Bündel von ca 1kB im Menü 
drin:
1
struct menuEntry{
2
    uint8_t menu_textNr;       // angezeigter Menütext
3
    uint8_t menu_type;         // 0=status  1=Supermenu  2=wahl 3= entscheidung
4
    uint8_t menu_nextOnDown;   // nächster Menüpunkt bei nach links     BUTTON2
5
    uint8_t menu_nextOnUp;     // nächster Menüpunkt bei nach rechts    BUTTON3
6
    uint8_t menu_nextOnReturn; // nächster Menüpunkt bei return         BUTTON1
7
    uint8_t menu_nextOnBack;   // nächster Menüpunkt bei home           BUTTON4
8
    uint8_t menu_varMin;       // minimaler Wert
9
    uint8_t menu_varMax;       // maximaler Wert
10
    uint8_t *menu_varPtr;      // zugehörige Variable
11
    void (*execute) (void);    // Funktion die ausgeführt werden soll
12
}menu_rom_data[33] = {
13
  { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 },
14
  { 1, 1, 11, 1, 2, 0, 0, 0, 0, 0 },
15
  { 2, 1, 4, 2, 3, 1, 0, 0, 0, 0 },
16
  { 3, 2, 0, 0, 2, 2, 0, 0, &sysSetup.DCF77_enabled, 0 },
17
  { 4, 1, 4, 2, 5, 1, 0, 0, 0, 0 },
18
  { 5, 2, 0, 0, 6, 4, 0, 99, &sysTime.date.year, 0 },
19
  { 6, 2, 0, 0, 7, 5, 1, 12, &sysTime.date.month, 0 },
20
  { 7, 2, 0, 0, 8, 6, 1, 31, &sysTime.date.day, 0 },
21
  { 8, 2, 0, 0, 9, 7, 1, 7, &sysTime.date.weekDay, 0 },
22
  { 9, 2, 0, 0, 10, 8, 0, 23, &sysTime.time.hour, 0 },
23
  { 10, 2, 0, 0, 4, 9, 0, 59, &sysTime.time.minute, 0 },
24
  { 11, 1, 23, 1, 12, 0, 0, 0, 0, 0 },
25
  { 12, 1, 16, 12, 13, 11, 0, 0, 0, 0 },
26
  { 13, 2, 0, 0, 14, 12, 15, 35, &sysSetup.tempSetWinter, 0 },
27
  { 14, 2, 0, 0, 15, 13, 15, 25, &sysSetup.tempSetSummer, 0 },
28
  { 15, 2, 0, 0, 12, 14, 1, 15, &sysSetup.tempHyst, 0 },
29
  { 16, 1, 20, 12, 17, 11, 0, 0, 0, 0 },
30
  { 17, 2, 0, 0, 18, 16, 30, 90, &sysSetup.humiSetWinter, 0 },
31
  { 18, 2, 0, 0, 19, 17, 30, 90, &sysSetup.humiSetSummer, 0 },
32
  { 19, 2, 0, 0, 16, 18, 5, 30, &sysSetup.humiHyst, 0 },
33
  { 20, 1, 20, 16, 21, 11, 0, 0, 0, 0 },
34
  { 21, 2, 0, 0, 22, 20, 6, 18, &sysSetup.minSunshineDuration, 0 },
35
  { 22, 2, 0, 0, 20, 21, 6, 18, &sysSetup.maxSunshineDuration, 0 },
36
  { 23, 1, 27, 11, 24, 0, 0, 0, 0, 0 },
37
  { 24, 2, 0, 0, 25, 23, 0, 255, &sysSetup.nightRed, 0 },
38
  { 25, 2, 0, 0, 26, 24, 0, 255, &sysSetup.nightBlue, 0 },
39
  { 26, 2, 0, 0, 23, 25, 0, 255, &sysSetup.nightGreen, 0 },
40
  { 27, 1, 29, 23, 28, 0, 0, 0, 0, 0 },
41
  { 28, 3, 0, 0, 27, 27, 0, 0, 0, save_sysSetup },
42
  { 29, 1, 31, 27, 30, 0, 0, 0, 0, 0 },
43
  { 30, 3, 0, 0, 29, 29, 0, 0, 0, load_sysSetup },
44
  { 31, 1, 31, 29, 32, 0, 0, 0, 0, 0 },
45
  { 32, 3, 0, 0, 31, 31, 0, 0, 0, loadBasicsysSetup }
46
};
47
char menu_strings[33][21] = {
48
"Stats",
49
"Zeiteinstellungen",
50
"DCF",
51
"DCF ein/aus",
52
"Zeit einstellen",
53
"Jahr",
54
"Monat",
55
"Tag",
56
"Wochentag",
57
"Stunde",
58
"Minute",
59
"Klimaeinstellungen",
60
"Temperatur",
61
"Wintertemperatur",
62
"Sommertemperatur",
63
"Temp-Hysterese",
64
"Feuchtigkeit",
65
"Winterfeuchtigkeit",
66
"Sommerfeuchtigkeit",
67
"Humi-Hysterese",
68
"Lichtdauer",
69
"Wintertag",
70
"Sommertag",
71
"Nachtbeleuchtung",
72
"Rot",
73
"Gruen",
74
"Blau",
75
"Einst. speichern",
76
"speichern",
77
"Einst. laden",
78
"laden",
79
"Einst. zuruecks.",
80
"zuruecksetzen"
81
};


Wie kann ich das so arrangieren, dass das nicht im Ram liegt?
Ich habe schon einmal was vom Variablen im Flash speichern, bin mir aber 
nicht sicher ob das so funktionieren kann.

Ich bitte um Schlägwörter, Tipps und Links. Ich verlange natürlich keine 
Lösung oder gar Code.

Danke schon mal.
Grüße
Manuel

von AVerr (Gast)


Lesenswert?

Du kannst solche Konstrukte super im Flash unterbringen. Mehr Infos gibt 
es hier: 
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Programmspeicher_.28Flash.29

Dafür müsstest du bei deinem angegebenen Code lediglich ein PROGMEM 
reinschreiben:
1
}menu_rom_data[33] PROGMEM = {
und das auslesen aus dem Array anpassen ( mittels der pgm_read_xxx 
Funktionen ).

von Michael M. (technikus)


Lesenswert?

Guckst Du im AVR-GCC-Tutorial 
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Array_aus_Strings_im_Flash-Speicher

PROGMEM und PSTR sind die Zauberwörter.

Servus
Michael

von Peter II (Gast)


Lesenswert?

Manuel Schneider schrieb:
> char menu_strings[33][21]

das sind ja schon mal 393 byte.

Ja du solltest diese String in den Flash legen.

von Peter II (Gast)


Lesenswert?

Peter II schrieb:
> das sind ja schon mal 393 byte.
ich meinte 693

von Krapao (Gast)


Lesenswert?

> Ich bitte um Schlägwörter, Tipps und Links. Ich verlange natürlich keine
> Lösung oder gar Code.

Da gibt es einen kompletten Abschnitt drüber im AVR-GCC-Tutorial. Such 
mal nach PROGMEM und PSTR...

In der Artikelsammlung sind auch Projekte beschrieben, die mit einer 
Menüführung auf einem LCD arbeiten. Da ist wahrscheinlichst auch 
entsprechender Code zu sehen.

von Manuel S. (doc-snyder)


Lesenswert?

Vielen Dank für die vielen Antworten.

Ich habe noch eine Frage, aber da es mit Arbeitsspeicher sparen nichts 
mehr zu tun hat öffne ich einen neuen Thread:

Beitrag "Struct aus Flash lesen"

Manuel

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.