__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

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