Forum: Compiler & IDEs AVR-GCC: Pointer auf Flash-Array


von Michael H. (overthere)


Lesenswert?

Hallo zusammen,

ich habe bereits die Forensuche benutzt, leider nichts passendes 
gefunden. Ich möchte mit dem AVR-GCC und Tiny24 einen Pointer auf ein 
Flash-array - für ein Blinken der LED zuständig - anlegen.

prog_uint8_t blink_slow[] PROGMEM = {
 BLINK_GREEN, BLINK_NONE , BLINK_NONE, BLINK_NONE, BLINK_NONE,
 BLINK_NONE, BLINK_NONE , BLINK_NONE, BLINK_NONE, BLINK_NONE};
prog_uint8_t blink_med[] PROGMEM = {
 BLINK_GREEN, BLINK_GREEN , BLINK_GREEN, BLINK_GREEN, BLINK_NONE,
 BLINK_NONE, BLINK_NONE , BLINK_NONE, BLINK_NONE, BLINK_NONE};
prog_uint8_t blink_fast[] PROGMEM = {
 BLINK_GREEN, BLINK_GREEN , BLINK_GREEN, BLINK_GREEN, BLINK_GREEN,
 BLINK_GREEN, BLINK_GREEN , BLINK_GREEN, BLINK_NONE, BLINK_NONE};
prog_uint8_t* blinker;

Wenn ich das Byte nun so lade.
>readByte = pgm_read_byte(&blink_fast[blinker_pos]);
geht alles prächtig.

Ich möchte aber auf den Array per Pointer zugreifen.
>blinker=&blink_fast;
>readByte = pgm_read_byte(blinker[blinker_pos]);

In diesem Fall motzt GCC und der Blinker funktioniert nicht. Wie muss 
ich nun den Pointer auf das Array definieren, dass es funktioniert?

Vielen Dank für Eure Hilfe!

Michael

von Mark .. (mork)


Lesenswert?

Klar motzt der gcc. Im ersten Fall machst Du alles richtig und übergbist 
die Adresse des Chars:

> readByte = pgm_read_byte(&blink_fast[blinker_pos]);

Im zweiten fall wird aber der Char selbst übergeben, obwohl ein Zeiger 
datauf erwartet wird.

> readByte = pgm_read_byte(blinker[blinker_pos]);

Schreib also ein & vor blinker[blinker_pos] analog zur ersten Version, 
um seine Adresse zu bekommen.

MfG Mark

von Michael H. (overthere)


Lesenswert?

Vielen Dank, das klappt jetzt schon mal. Aber GCC motzt immer noch wegen 
dem Assignment/Zuweisung auf meinen Pointer:
main.c:103: warning: assignment from incompatible pointer type

prog_uint8_t* blinker;
blinker=&blink_lowbatt;
readByte = pgm_read_byte(&blinker[blinker_pos]);

Was kann ich gegen die Warnung unternehmen?

von Karl H. (kbuchegg)


Lesenswert?

> main.c:103: warning: assignment from incompatible pointer type

Zeig mal deine ganzen Datentypen
Welches ist Zeile 103?

> blinker=&blink_lowbatt;

Der Name des Arrays alleine fungiert schon als Spezifikation für die 
Startadresse des Arrays

  blinker = blink_lowbatt;


(Ein C-Buch wäre angebracht, da steht das und noch 1000 andere 
wissenswerte Dinge drinnen)

von Michael H. (overthere)


Lesenswert?

Hi,

vielen dank für deine Hilfe, man lernt nie aus. Nun meckert er nicht 
mehr.

Danke

Michael

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.