Arbeitsspeicher sparen

OP #2378910
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
Gast #2378926
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.

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