__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

Eine eigene Frage? Dieser Thread ist über 12 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.