Forum: Compiler & IDEs const Daten an bestimme Adresse


von Max (Gast)


Lesenswert?

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

von Uwe (de0508)


Lesenswert?

Warum ,willst du denn das machen ?

von Klaus W. (mfgkw)


Lesenswert?

Ich kenne keinen Profi, der das ernsthaft machen will.

von Max (Gast)


Lesenswert?

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.

von willy (Gast)


Lesenswert?

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.

von Stefan E. (sternst)


Lesenswert?

Tabelle in eine eigene Section legen und diese an der gewünschte Adresse 
platzieren.

von K2R (Gast)


Lesenswert?

Geht mit PROGMEN.... indem Du ein Array über den zu nutzenden Bereich 
legst und innerhald des Arrays addressierst

von (prx) A. K. (prx)


Lesenswert?

Kommt das EEPROM in Frage?

von Linker (Gast)


Lesenswert?

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.

von Thomas W. (thomas100)


Lesenswert?

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

von Max (Gast)


Lesenswert?

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!!!!

von Thomas W. (thomas100)


Lesenswert?

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

von Max (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.