Hallo,
ich habe ein kleines Problem mit Arrays im Flash eines ATmega32. Ich
nutze AVR GCC als Compiler. Nun zum Problem:
Ich habe eine ganze Reihe Strings im Flash:
1
constcharid06374[]PROGMEM="Zimmer 7";
2
constcharid06379[]PROGMEM="Zimmer 9";
3
constcharid06384[]PROGMEM="Zimmer 11";
4
constcharid06399[]PROGMEM="Zimmer 21";
nun brauche ich noch ein Array aus einer Structur im Flash was immer
schön einen 16 bit Wert hat und danach die Adresse zu den obrigen
'Strings'.
etwa so:
Das funzt natürlich nicht, war ja klar ;-) .
Könnte mir da jemand weiter helfen? Ich denke ich habe das mit den
Sectionen im Flash noch nicht begriffen und auch bei Zeigern hapert es
wohl.
Gruß Rene
Philipp wrote:
> Nicht eher das der Pointer p_auf_ID_string aufs Flash zeigen soll?> So zeigt er ja ins SRAM oder?
Das ist dem gcc sowieso egal. Pointer ist Pointer.
Das der Pointer ins Flash zeigt, must du durch die Art
der Verwendung des Pointers berücksichtigen.
Sprich: keine * - Derferenzierung sondern pgm_read_xxx
Funktionen benutzen.
Mal anders gefragt: Wie ist diese Aussage
Das funzt natürlich nicht, war ja klar ;-) .
zu begreifen. Hast du Fehlermeldungen vom Compiler oder
ein Runtime Problem?
Noch was zum Verständnis, grundsätzlich sollen beide Arrays im Flash
liegen. Das erste Array besteht nur aus Strings die auf das LCD
ausgegeben werden. Das zweite Array hat als erstes die Adresse die über
den Bus kommt. Selbige wird dann verglichen und wenn sie ausgegeben
werden soll dann wird über den dazugehörigen Pointer auf den richtigen
String aus Array 1 zugegriffen. Aber irgendwie habe ich ein Problem mit
den Zeigern.
Gruß Rene
main.c:58: warning: initialization from incompatible pointer type
Na ja. Ein Pointer auf einen String ist ja auch nicht
unbedingt ein uint16_t*;
static struct{
uint16_t Adresse;
const char* p_auf_ID_string;
};
das sollte abhelfen.
p-adr[] ist ein Array im Flash ab 0x161 aber der Compiler nimmt an das
es im Ram ist wie man an den LDS/LDI/LD sieht. Wie kann ich das Teil
dazu bewegen den LPM Befehl zu benutzen?
Gruß Rene