__flash Array zuweisen und zugriff

Gast #4102868
Lesenswert?
• ▲
▼
Hallo,

wollte auch einmal mich in den Zugriff von Variablen welche mit __flash 
initialisiert sind einarbeiten und komme einfach nicht weiter. Hoffe 
hier etwas Hilfe zu bekommen.

Es existieren 2 Array folgender Art.
1
const __flash uint8_t array1[]  = { 0x12, 0x34,...};
2
const __flash uint8_t array2[]  = { 0xaf, 0x63,...};

In einer Funktion möchte ich dann darauf zugreifen, indem ich einer 
Variablen den Zeiger des benötigten Array übergebe.
1
void foo(uint8_t auswahl)
2
{
3
  uint8_t val1, val2, val3 ;
4
  const uint8_t *arr;
5
  if(auswahl == 1)
6
    arr = array1;
7
  else
8
    arr = array2;
9

10
  /* Nun würde hier der Zugriff erfolgen, doch da bekomme ich brauchbares wieder*/
11
  val1 = &arr[0];
12
  val2 = &arr[1];
13
  val3 = &arr[2];
14
  
15
  /* Das funktioniert auch nicht wie erhofft */
16
  val1 = arr++;
17
  val2 = arr++;
18
  val3 = arr++;
19
}

Muss man da per pgm_read_byte zugreifen, ich denke das sollte sich mit 
dem Schlüsselwort __flash erledigt haben?

Danke schonmal für die Hilfe
#4102906
Lesenswert?
• ▲
▼
und dann natürlich noch
1
  val1 = arr[0];    // war:  val1 = &arr[0];
2
  val2 = arr[1];    // war:  val2 = &arr[1];
3
  val3 = arr[2];    // war:  val3 = &arr[2];
4
  
5
  /* Das funktioniert auch nicht wie erhofft */
6
  val1 = *arr++;    // war:  val1 = arr++;
7
  val2 = *arr++;    // war:  val2 = arr++;
8
  val3 = *arr++;    // war:  val3 = arr++;

Das Hauptproblem hat Johann ja schon angesprochen.
Du musst das __flash als Bestandteil des Datentyps ansehen. D.h. das 
darf dir bei Weitergaben von Adressen nicht verloren gehen!
daher:
1
  const __flash uint8_t *arr;
2
  if(auswahl == 1)
3
    arr = array1;
4
...

damit der Compiler auch bei zugriff über 'arr' weiss, dass es sich dabei 
um einen Zugriff ins Flash handelt. Denn dem reinen Zahlenwert der 
Adresse kann man nicht mehr ansehen, ob es sich dabei um eine Adresse 
handelt die ins SRAM führt oder um eine die ins Flash führt.
Gast #4102951
Lesenswert?
• ▲
▼
Danke euch zweien,

Genau das war es. Leider hatte ich dazu kein Beispiel gefunden im Netz, 
die meisten übergeben es an eine Funktion wo das __flash dann mit bei 
der Übergabeparameter steht, deswegen habe ich das dort nicht eingebaut.

Antwort schreiben

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.

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.