const Daten an bestimme Adresse

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

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.