www.mikrocontroller.net

Forum: Compiler & IDEs AVR: Struct im Flash mit Zeiger auf RAM


Autor: K.L. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin moin,

Ich habe eine Struktur im Flash abgelegt, die einen Zeiger auf eine 
Variable im RAM enthält. Das Lesen der Variable funktioniert, aber das 
Beschreiben nicht. Wer kann mir weiterhelfen?
#include <avr/pgmspace.h>

typedef struct
{
  prog_char  x;              // char im Flash
  prog_char  y;              // char im Flash
       char  *v;             // Zeiger im Flash auf char im RAM
} ts_value;

unsigned char uc_value = 3;  // hier hin zeigt *v
                             // struct im Flash
ts_value PROGMEM  value = { 1, 2, &uc_value };

void function ( ts_value *value )
{                    
  unsigned char * PROGMEM ptr_value;
                             // hole Adresse im Flash => Zeiger auf SRAM
  ptr_value = pgm_read_word ( &value->v );
  
  if ( *ptr_value == 1 )     // s.o.: uc_value = 3;
  {
     //code wird ausgeführt
  }
  *ptr_value = 4;            // Variable im SRAM soll geändert werden: geht nicht
}

Autor: K.L. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ups, habe drei kleine Fehler korrigiert:
"char *v" in "unsigned char *v"
"void function (ts_value * value)" in "void function ( const ts_value * 
value)"
"ptr_value = pgm_read_word ( &value->v );" in "ptr_value = (unsigned 
char *) pgm_read_word ( &value->v );"
typedef struct
{
  prog_char       x;         // char im Flash
  prog_char       y;         // char im Flash
  unsigned char  *v;         // Zeiger im Flash auf char im RAM
} ts_value;
 
unsigned char uc_value = 3;  // hier hin zeigt *v
                             // struct im Flash
ts_value PROGMEM  value = { 1, 2, &uc_value };

void function ( const ts_value *value )
{                    
  unsigned char * PROGMEM ptr_value;
                             // hole Adresse im Flash => Zeiger auf SRAM
  ptr_value = (unsigned char *) pgm_read_word ( &value->v ); 
  
  if ( *ptr_value == 1 )     // s.o.: uc_value = 3;
  {
     //code wird ausgeführt
  }
  *ptr_value = 4;            // Variable im SRAM soll geändert werden: geht nicht
}

Wie bekomme ich es hin, dass ich die Variable im RAM über der Zeiger im 
Flash verändern kann?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
unsigned char * PROGMEM ptr_value;

Warum hier PROGMEM?
Dieser Pointr kann logischerweise nicht im Flash angesiedelt sein. 
Dieser Pointer ist ein ganz normaler Pointer.

Autor: K.L. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> unsigned char * PROGMEM ptr_value;
>
> Warum hier PROGMEM?
> Dieser Pointr kann logischerweise nicht im Flash angesiedelt sein.
> Dieser Pointer ist ein ganz normaler Pointer.

Das stimmt allerdings. Mein Gedanke war: Der Zeiger kommt aus dem Flash. 
Jetzt gehts.

Danke.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.