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)
12.10.2011 13:27
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
Peter II (Gast)
12.10.2011 13:28
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)
12.10.2011 13:28
Peter II schrieb:
> das sind ja schon mal 393 byte.
ich meinte 693
von
Krapao (Gast)
12.10.2011 13:29
> 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.
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.