Forum: Compiler & IDEs __flash Variable als Parameter


von Stefan (Gast)


Lesenswert?

Hallo Forum,

ich komme im Moment nicht weiter. Ich habe folgenden Code:
1
#include <avr/io.h>
2
3
const __flash uint8_t array[10] = {1,2};
4
5
uint8_t test(const uint8_t *data, uint8_t pos);
6
7
int main(void)
8
{  
9
  uint8_t res = test(array, 1);
10
}
11
12
uint8_t test(const uint8_t* data, uint8_t pos)
13
{
14
  return *(data + pos);
15
}

Die Funktion 'test' soll in meinem Fall Arrays als ersten Parameter 
akzeptieren, welche im Flash als auch im RAM liegen können.

Ich bekomme keine Fehlermeldung aber auch leider nicht das richtige 
Ergebnis als Rückgabewert.

Weiß einer von Euch was ich ändern muss?
Wie kann ich ein Array, welches im FLASH abgelegt ist als Parameter 
einer Funktion übergeben?

Viele Grüße
Stefan

von Karl H. (kbuchegg)


Lesenswert?

Stefan schrieb:

> uint8_t test(const uint8_t *data, uint8_t pos);

die Funktion muss aber auch wissen, dass der Pointer data ins Flash 
zeigt und nicht ins Ram
1
uint8_t test(const __flash uint8_t *data, uint8_t pos)
2
...

Nur dann kann der Compiler entscheiden, wie der Mechanismus sein muss, 
mit dem er bei
1
    .... *(data
vorgehen muss, um den Pointer zu dereferenzieren. Aufs RAM werden andere 
Maschinenbefehle benutzt, als wie wenn die Daten aus dem Flash kommen.

> Die Funktion 'test' soll in meinem Fall Arrays als ersten Parameter
> akzeptieren, welche im Flash als auch im RAM liegen können.

In dem Fall, wenn beides möglich sein soll, kannst du nicht __flash 
benutzen, sondern du musst __memx benutzen.

Mittles __memx wird data dann ein 3 Byte Pointer, in dem neben der 
Adresse dann auch noch die Information enthalten ist, ob es sich um 
einen Flash oder einen SRAM Pointer handelt.

von Karl H. (kbuchegg)


Lesenswert?

Siehe
AVR-GCC-Tutorial
Abschnitt 14.2.2

von Stefan (Gast)


Lesenswert?

Viele Dank und Asche mein Haupt!
Ich habe den Abschnitt über __flash im Tutorial gelesen aber vor 
"Jenseits von Flash" aufgehört.

Viele Grüße
Stefan

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Stefan schrieb:
> Die Funktion 'test' soll in meinem Fall Arrays als ersten Parameter
> akzeptieren, welche im Flash als auch im RAM liegen können.

Alternativ kann man der Funktion eine Variable übergeben, welche die 
Information über die Ablage enthält und anhand dieser den Zeiger casten.

Ist zwar hässlich kann aber brauchbar sein, wenn man älteren mit PROGMEM 
geschriebenen Code an __flash anpassen will.

> Ich bekomme keine Fehlermeldung [...]

Ab 4.8 gibt's -Waddr-space-convert, siehe GCC-Manual:

http://gcc.gnu.org/onlinedocs/gcc-4.8.0/gcc/AVR-Options.html

Die ist AVR-spezifisch und kann verwendet werden wie andere Warnungen 
auch, also etwa als -Werror=addr-space-convert.

Die Warnung ist in erster Linie dafür gedacht, wenn man Code von PROGMEM 
nach __flash umschreiben will.  I.d.R. bekommt man zu viele Warnungen, 
zum Beispiel für PSTR, das ja formal immer noch im Address-Space 
"generic" liegt.

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.