Forum: Compiler & IDEs Progmem und Pointer


von Dirk (Gast)


Lesenswert?

Hallo,

leider muss ich diese Frage hier posten. Ich muss wohl zugeben das ich
irgendwo eine Wissenlücke habe bei PROGMEM und Zeiger. Ich hoffe jemand
kann meine Wissenslücke schliessen.

const unsigned char tabelle1[] PROGMEM = {0x01 , 0x08 , 0x07};
const unsigned char tabelle2[] PROGMEM = {0xFF , 0xFE , 0xFA};
unsigned char a;
unsigned char i;
unsigned char f;

PGM_P table[2] PROGMEM = {tabelle1, tabelle2};

int main(void)
{
 i=0;
 f=2;
 a = pgm_read_byte(&table[0][2]);
}

Der Code funktioniert und ich kriege die richtigen Daten.
Tausche ich aber die Zeile gegen die folgende Zeile aus kriege ich
immer falsche Werte. Muss ich mit strcmp_P arbeiten oder wo mache ich
den Fehler?

 a = pgm_read_byte(&table[i][f]);


Gruß,

Dirk

von A.K. (Gast)


Lesenswert?

So ungefähr:
 p = pgm_read_word(&table[i]);
 a = pgm_read_byte(&p[f]);

von Dirk (Gast)


Lesenswert?

Hi,

tut mir leid das verstehe ich nicht ganz. Wieso muss ich erst 2 Byte
einlesen und zwischenspeichern damit ich dann auf den Wert zugreifen
kann.

Wieso kann ich nicht direkt die Zahlen gegen Variablen austauschen?
Ich wünsche keinen fertigen Code, sondern mehr eine Erklaerung zum
Problem. Ich würde gerne die Problematik verstehen.

Wenn ich die Daten nicht im Flash ablege funktioniert es. Ich habe mit
GCC auf dem PC getestet, deshalb vermute ich das ich irgendwo ein
Fehler beim PROGMEM mache.

Ich würde mich über eine Erklärung freuen.

Gruß,

Dirk

von A.K. (Gast)


Lesenswert?

table[i]
ist ein Speicherzugriff. Auf RAM. Das Array steht im ROM.

Kannst natürlich auch
 pgm_read_byte(&((irgendein typecast)pgm_read_word(&table[i]))[f]);
schreiben, wenn Du das übersichtlicher findest.

Mit Konstanten geht es, weil der Compiler bei eingeschalteter
Optimierung den Zugriff auf table[i] wegoptimiert. Schalte mal die
Optimierung aus, dann geht's wieder nicht.

von Dirk (Gast)


Lesenswert?

Hi,

danke schoen fuer die Erklaerung. Einige Probleme werden mir nun
klarer.

Gruß,
Dirk

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.