__flash Variable als Parameter

Gast #3671703
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
#3671737
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.
Persönliche Seite #3672037
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.

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