Hallo,
ihr Profis könnt mir doch bestimmt sagen wie man einen
char dat[256][24]={{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,usw...
an einen bestimmten Platz im Flash?
Mit PROGMEM? Aber wie an eine definierte Adresse? Hm...
Danke.
Max
damit ich vom Bootloader Code und vom Applikationscode darauf zugreifen kann. Und für den RAM ist mir das zu viel an Daten. Ausserdem ist er eh const.
Ich weis leider nicht ob das mit dem avr-gcc möglich ist. Ich selbst hätte auch schon mal von dieser Möglichkeit gerne Gebrauch gemacht. Nur weils hier Einigen an Fantasie fehlt ist dein Vorhaben noch lange nicht unüblich. Bei uns in der Firma mussten wir das auch mal machen. Der Green Hills Compiler unterstützt dies über Pragmas.
Tabelle in eine eigene Section legen und diese an der gewünschte Adresse platzieren.
Geht mit PROGMEN.... indem Du ein Array über den zu nutzenden Bereich legst und innerhald des Arrays addressierst
K2R schrieb: > Geht mit PROGMEN.... indem Du ein Array über den zu nutzenden Bereich > legst und innerhald des Arrays addressierst Wenn ich ein Array über den Speicher lege, ist der Speicher vergeben. Ich kann ihn zwar darüber indizieren, aber der Linker legt mir da nichts rein.
Hallo Max, das ist ganz einfach. Du erzeugst eine neue Linkersektion und vergibst da die Adresse. Jetzt kannst du in deinem Programm die Variable in dieser Sektion ablegen. Beispiel: Im AVR-Studio stellst du in den Projekteigenschaften/Linker/Memory Settings eine neue Sektion ein, z.B. "SHAREDMEMORY=0x5f6". Die Adresse muss natürlich im Flash liegen. Die Adresse wird in Wordadressen angegeben, nicht Byteadressen!! In deinem Programm schreibst du
1 | char dat[] __attribute__ ((section ("SHAREDMEMORY"))) = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; |
In deinen Projektausgaben gibts ein .map-File. Da kannst du dir das Ergebnis anschauen. Auf die Daten kannst du dann mit pgm_read_...() zugreifen. Viel Spaß Thomas
super erklärt Thomas ... danke!! So hat es funktioniert :) Ich habe soetwas auch schon mit Funktionen gemacht. Geht ja scheinbar auch mit Konstanten so. Allerdings muss die Section scheinbar eine andere sein!! Konnte sie zumindest nicht in die Section mppen die es schon für Funktionen gibt bei mir. Ich habe auch noch eine Funktion die ich auf diese Art in der Applikation zur verfügung stellen möchte und bekomme es nicht hin wegen der "..." wie muss ich das in folgendem Code denn schreiben?
1 | void display(uint8_t *str, ...) |
2 | {
|
3 | display_lib = (void(*)(uint8_t *str, ...)) pgm_read_word (FUNC_START_POINTER+48); |
4 | display_lib(str,...); |
5 | }
|
er beschwert sich verständlicherweise bei
1 | display_lib(str,...); |
aber wie muss ich sowas richtig schreiben? danke für eure Hilfen!!!!
Hallo Max, ja, das ist klar, dass sich der Compiler da beschwert. Du musst die Argumentenliste erst mal greifbar machen.... So sollte es gehen:
1 | #include <stdarg.h> |
2 | typedef void* (*ptDISPLAYLIB) (uint8_t *str, ...); |
3 | |
4 | void display(uint8_t *str, ...) |
5 | {
|
6 | ptDISPLAYLIB display_lib = (ptDISPLAYLIB)pgm_read_word (FUNC_START_POINTER+48); |
7 | |
8 | va_list args; |
9 | va_start(args,str); |
10 | display_lib(str, args); |
11 | va_end(args); |
12 | }
|
Viel Spaß Thomas
Hallo Thomas, du bist mein Held. Es kompiliert zumindest mal. Da wäre ich so schnell nicht drauf gekommen. Testen kann ich es noch nicht leider weil irgend etwas anderes nach meinem Umbau des Codes noch nicht zu funktionieren scheint. Vielen Dank!!!
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.