Forum: Compiler & IDEs __flash Array zuweisen und zugriff


von Christian (Gast)


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

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Christian schrieb:
>   const uint8_t *arr;
1
const __flash uint8_t *arr;

Zudem gibt es -Waddr-space-convert.

von Karl H. (kbuchegg)


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.

von Christian (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.