Hallo!
Ich würde gerne eine Datenstruktur vom RAM in den Flash-Speicher
auslagern.
Das ganze sind die Daten für eine LED-Matrix.
Meine Datenstruktur besteht aus den folgenden Typen:
constuint8_tpictureCnt;// picture count in the array
10
constuint8_trepeatCnt;// how often is the picture array repeatet
11
}animation_t;
12
13
typedefstruct{
14
constanimation_t**animations;
15
constuint8_tanimationCnt;
16
}animationSet_t;
Eine beispielhafte Initialisierung der Struktur:
1
/* alleAnAus
2
Description:
3
*/
4
const__flashpicture_talleAnAusPictures[2]={
5
{{0xFFFFFF19,0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF}},
6
{{0x19,0x0,0x0,0x0}},
7
};
8
const__flashanimation_talleAnAus={
9
alleAnAusPictures,
10
2,
11
1
12
};
Mein Problem ist nun, dass ich nicht so recht weiß, wie ich den __flash
Qualifier anzuwenden habe. Mit dem Code von oben funktioniert es leider
nicht.
Der Compiler kompiliert zwar ohne Warnungen und die Daten werden auch im
Flash abgelegt. Das Programm funktioniert dann allerdings nicht mehr.
Wäre super, wenn mit jemand auf die Sprünge helfen könnte.
Gruß
Thorsten
Edit:
Ganz vergessen: Das ganze läuft auf einem ATmega32 und wird mit avr-gcc
Version 4.9.2 kompiliert.
isidor schrieb:> Sven S. schrieb:> Hat er doch geschrieben, kannst nich lesen ?
Na, aber erst im Nachhinein. ;-)
Das Problem hat sich gelöst. Ich habe vergessen für die Variablen in den
Funktionen, die auf die Flash-Variablen zugreifen, __flash zu benutzen.
Jetzt funktioniert es.
Das erste const für die Variable, die sich nicht ändern soll und das
zweite const für den Pointer, der auch nicht geändert werden soll.
So habe ich mir das gedacht. Korrigiert mich, wenn ich da einen
Denkfehler habe.
Wenn der Zeiger (sprich die Adresse) nicht geändert werden soll, müsste
das const rechts vom "*" stehen. Allerdings ist das bei einem
Funktionsargument recht sinnlos, weil die Funktion ja eine Kopie des
Zeigers bekommt. Ob sie die ändert oder nicht spielt für den Aufrufer
keine Rolle.
Thorsten H. schrieb:> Das erste const für die Variable, die sich nicht ändern soll und das> zweite const für den Pointer, der auch nicht geändert werden soll.
No, die beiden const sind redundantz, d.h. eines kann weggelassen
werden: Ob du schreibst "typ const" oder "const typ" ist Wurscht, ditto
beliebig viele Kopien vor oder nach dem Typ.
Bei Zeigern spielt es eine Rolle, auf welcher Seite des "*" das const
steht, aber bei deinem Code ist es an keiner Stelle ein typ*.
Sven S. schrieb:> Also mein PC hat keinen Flash.
Echt? Von wo kommt dann das BIOS?
Johann L. schrieb:> No, die beiden const sind redundantz, d.h. eines kann weggelassen> werden: Ob du schreibst "typ const" oder "const typ" ist Wurscht, ditto> beliebig viele Kopien vor oder nach dem Typ.>> Bei Zeigern spielt es eine Rolle, auf welcher Seite des "*" das const> steht,
Naja, allgemein ausgedrückt: Das const wirkt immer auf das, was links
davon steht. Einzige Ausnahme ist, wenn das const selbst ganz links
steht. Dann wirkt es auf das, was rechts steht.
Also:
1
Xconst*// nicht-konstanter Zeiger auf konstantes X
2
X*const// konstanter Zeiger auf nicht-konstantes X
3
Xconst*const// konstanter Zeiger auf konstantes X
4
constX*// Sonderfall, Effekt ist wie beim ersten Beispiel
5
constX*const// wie Fall 3
6
constXconst*// redundantes const, beides bezieht sich auf das X
> aber bei deinem Code ist es an keiner Stelle ein typ*.
Nicht?
Thorsten H. schrieb:> uint32_t getColumn(const __flash picture_t const * picture, uint8_t> col);