Hi!
Nun wird mein SRAM langsam knapp und ich muss meine String Konstanten in
den PROGMEM verschieben. Derzeit behelfe ich mir so, das geht doch gibt
es einen eleganteren Weg?
1
voidget_id_name(uint8_tid,char*out){
2
staticcharstrA[]PROGMEM="Alfons";
3
staticcharstrB[]PROGMEM="Julia";
4
staticcharstrC[]PROGMEM="Seb";
5
staticcharstrD[]PROGMEM="Olaf";
6
staticcharstrE[]PROGMEM="unknown";
7
8
switch(id){
9
case0:copy_pgmstr_to_ram(strA,out);break;
10
case1:copy_pgmstr_to_ram(strB,out);break;
11
case2:copy_pgmstr_to_ram(strC,out);break;
12
case3:copy_pgmstr_to_ram(strD,out);break;
13
case4:copy_pgmstr_to_ram(strE,out);break;
14
}
15
}
Ich brauche also zu der ID dann einen Zeiger auf die Zeichenkette.
Meine Versuche mit einer direkte Deklaration eines Array funktioniert
nicht.
Danke für jeden Tip!
Gruß AVRli...
Erspart dir den char PROGMEM Teil. Eleganter (und schneller) geht es,
indem du die Zeiger auf die einzelnen Strings in ein Array packst.
1
staticcharstrA[]PROGMEM="Alfons";
2
staticcharstrB[]PROGMEM="Julia";
3
staticcharstrC[]PROGMEM="Seb";
4
staticcharstrD[]PROGMEM="Olaf";
5
staticcharstrE[]PROGMEM="unknown";
6
7
staticcharstrings[]={
8
strA,
9
strB,
10
...
11
};
12
13
voidget_id_name(uint8_tid,char*out){
14
strcpy_P(out,&(strings[id]);
15
}
Logischerweise kannst du auch diesen in den PROGMEM legen. Spart dir
dann je 2 Byte/Eintrag, nur musst du dann vorher auch diesen aus dem
Flash lesen, siehe [1].
gruß
Mobius
[1] http://www.nongnu.org/avr-libc/user-manual/pgmspace.html
Hallo!
Danke für Eure Hinweise.
Ich habe mich nun an das Beispiel gehalten aber das sorgt nun dafür das
mein Programm nun überhaupt nicht mehr anläuft. :-(
Das wird nun aber auch so in [1] beschrieben.
Ob ich das mit den Zeigern jemals verstehen werde??? :-(
Gruß AVRli...
Deine Strings stehen so ja auch gar nicht im Flash (und die
Pointer-Liste auch nicht). Du bekommst doch auch garantiert "attribute
ignored"-Wanungen vom Compiler. Entweder schreibst du noch ein static
davor, oder du machst globale Variablen daraus.
PS: Und für die Zukunft merken: Warnungen nicht einfach ignorieren, und
bei Fragen hier mit angeben.
Karl heinz Buchegger schrieb:> Mir ist nicht klar, warum du nicht den allereinfachsten Weg gehst
Ja mir wohl auch nicht. :-(
Das ist wirklich ein sehr interessanter Weg! :-D
So konnte ich ohne viel deklarieren meine ganzen Zeichenkette in den
PROGMEM legen. Gut die ganzen str Funktionen müssen dann natürlich die
mit _P sein das war aber nicht so schwer.
Satte 30% hab ich im RAM mit Zeichenketten "verballert". Nun im
Programmspeicher ist noch genügend Platz, auf Geschwindigkeit kommt es
bei der Anwendung nicht an.
Und nebenbei meine Funktion
1
copy_pgmstr_to_ram(PSTR("Alfons"),out);
Gibt es ja auch schon, ach wenn man nicht immer das Rad neu erfinden
würde wollen. Gut ich hab was bei gelernt aber die folgende nehme ich
nun. ;-)
@AVRli (Gast)
>Satte 30% hab ich im RAM mit Zeichenketten "verballert". Nun im>Programmspeicher ist noch genügend Platz, auf Geschwindigkeit kommt es>bei der Anwendung nicht an.
Aus dem RAM lesen dauert beim AVR 2 Takte (ld), aus dem Flash 3 Takte
(lpm). Plus den ganzen Schleifenoverhead ist beides annähernd gleich
schnell.
MfG
Falk