Hallo,
bei meinem Projekt kommt es auf jedes Byte an. Beim Optimieren habe ich
festgestellt, dass die Initialisierung von Variablen eigentlich besser
laufen könnte.
Ich habe z.B. einen großen struct bzw. Array davon (mit Beispielwerten):
1
typedefunion{
2
uint8_tIndex[5];
3
struct{
4
uint8_tA,B,C,D,E;
5
}Name;
6
}tFlex;
7
8
typedefstruct{
9
int8_tAlpha,Beta;
10
tFlexflex;
11
}tData;
12
13
tDataData[COUNT_DATA]={
14
{7,1,{{23,42,1,2,3}}},
15
{2,4,{{47,11,0,0,7}}},
16
{47,87,{{0,8,15,0,0}}},
17
{9,73,{{3,1,4,1,5}}},
18
{5,10,{{1,1,2,3,5}}},
19
{2,11,{{90,60,90,0,190}}},
20
{1,0,{{0,0,0,0,0}}},
21
{1,0,{{0,0,0,0,0}}},
22
{1,0,{{0,0,0,0,0}}},
23
{1,0,{{0,0,0,0,0}}},
24
{1,0,{{0,0,0,0,0}}},
25
{1,0,{{0,0,0,0,0}}},
26
{1,0,{{0,0,0,0,0}}},
27
{1,0,{{0,0,0,0,0}}},
28
{1,0,{{0,0,0,0,0}}},
29
{1,0,{{0,0,0,0,0}}},
30
{1,0,{{0,0,0,0,0}}},
31
// ...diese "leeren" (man beachte die 1 an Stelle 1)
32
// Zeilen wiederholen sich bis zum Ende des Arrays...
33
}
Dieses Array befindet sich im RAM und im EEPROM. Die o.g. Werte sind der
Default, für den Fall, dass die Werte im EEPROM ungültig sind oder falls
man einen Reset der Werte auf den Default braucht.
Mein Gedanke war nun folgender: Da im Default nur einige Zeilen Werte
enthalten, müsste sich doch durch die Art und Weise des Init eine Menge
Platz sparen lassen. Kann man irgendwie "in einem Rutsch" einen Struct
aus dem ROM ins RAM kopieren?
Ich habe es so probiert, aber das frisst auch ziemlich viel Speicher:
Erst die Ganze Geschichte als noinit (im Gegensatz zu oben):
Ich empfinde den Zugriff auf jedes Element mit pgm_read_byte als sehr
umständlich. Geht das nicht irgendwie in einem Rutsch bzw. mit einer
einzigen Schleife?
Es gibt doch memcpy_P aus avr/pgmspace.h der AVR-LibC. Das spart schon
mal copydata.
Den Array-Anfang kannst en bloc initialisieren; es sind 6*sizeof(tData)
Bytes.
Danke! Weiß auch nicht, wie mir memcpy_P entgehen konnte. Damit klappt's
gut und es spart mir jetzt insgesamt im fertigen Programm ca. 250 Bytes,
was natürlich ein kleiner Jackpot ist.
Hätte ja sein können, dass das auch ein Feature ist, das ich übersehen
habe. ;)
Aber mal ehrlich, spart das wirklich Platz oder ist das nur eine etwas
eleganter aussehende Konstruktion? Ich meine, intern kocht der GCC auch
nur mit Wasser. Und neuere Versionen neigen im Allgemeinen doch eher
dazu, größeren Code zu erzeugen.