const Daten an bestimme Adresse

Gast #2693531
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.
Gast #2693546
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.
#2693584
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
Gast #2693663
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!!!!
#2693681
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
Gast #2693717
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!!!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren