mikrocontroller.net

Forum: Compiler & IDEs Progmem und Pointer


Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: A.K. (Gast)
Datum:

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

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

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

Gruß,
Dirk

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.