Forum: Compiler & IDEs prgspace.h umsetzen


von Thomas (Gast)


Lesenswert?

Hallo,

habe ein Problem bei der Umsetzung von prgspace.h:

Ich möchte Initialwerte die sich nur selten ändern
in den Flash-Speicher schreiben. Habe gelesen das in
pgmspace.h Funktionen dafür definiert sind.
Allerdings wird in der Beschreibung sowie im FAQ
nur auf Strings Bezug genommen, deswegen würde mich
mal interessieren ob sich das mit Char oder Integer
Werten auch machen lässt?
Strings sollten doch nichts anderes als Char Werte sein,
nur mit \0 abgeschlossen?

Aber wie muß ich das dann schreiben:

PGM_P array[KOMPONENTE][IDENT] PROGMEM = {???}

array[x][y]
unsigned char table[3][6] = {
{ 0x3e, 0x41, 0x41, 0x41, 0x3e, 0x00  },
{ 0x00, 0x21, 0x7f, 0x01, 0x00, 0x00  },
{ 0x21, 0x43, 0x45, 0x49, 0x31, 0x00  },
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00  }};

Lesezugriff: ?

char X_VAR;
strcpy_P (X_VAR, table[1][1]);


Schreibzugriff: ?
strcpy_P (table[1][1], X_VAR);


Gibt es einfachere Möglichkeiten?

Der Unterschied zwischen den zwei Beispielen im FAQ
wird mir auch nicht ganz klar.

Danke Thomas

von mthomas (Gast)


Lesenswert?

In der gcc-Portierung des Application-Codes fuer den AVR-Butterfly
werden pgmspace-Funktionen in vielfaeltiger Form genutzt. Das kann
mglw. als Beispiel dienen. siehe
http://www.siwawi.arubi.uni-kl.de/avr_projects/
(Ich stelle den Server z.Zt. (5.11.03) auf neue Hardware um, es kann
daher zeitweilig zu Ausfaellen kommen, bei Problemen einfach etwas
spaeter nochmal versuchen.)

Das Thema kommt auch immer wieder im avrfreaks gcc-Forum und in der
avr-gcc mailing-list auf, in den Archiven sollte sich also auch einiges
dazu finden lassen.


Martin

von Thomas (Gast)


Lesenswert?

Mein Programm läuft jetzt soweit, bin mir nur
nicht sicher ob ich es richtig umgesetzt hab.
Hab es mal drangehängt, vielleicht kann mal
jemand einen Blick drauf werfen.
ich benutze nie PGM_P???

Hab den Unterschied der beiden Beispiele im FAQ
nicht wirklich verstanden. Wie kann ich sehen
ob mein Array wirklich im Flash-Speicher steht?

Ist es möglich (mit memcpy_P) das Array zusätzlich
noch in den RAM zu kopieren um Werte im Array
zu ändern?


Danke Thomas


#include <avr/io.h>
#include <avr/pgmspace.h>

#define ANZAHL_KOMPONENTEN 3
#define ANZAHL_IDENTIFIER  7


const unsigned char init_werte[ANZAHL_KOMPONENTEN][ANZAHL_IDENTIFIER]
PROGMEM =
{
{ 0x3e, 0x41, 0x41, 0x41, 0x3e, 0x00  },   //Komponente 0
{ 0x00, 0x21, 0x7f, 0x01, 0x00, 0x00  },   //Komponente 1
{ 0x21, 0x43, 0x45, 0x49, 0x31, 0x00  },
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00  }
};


int main(void)
{

while(1)
  {

  init_wert =
pgm_read_byte(&init_werte[byte1_werte.Slave_Adresse][byte1_werte.Ident]) 
;

  }

return 0;
}

von mthomas (Gast)


Lesenswert?

Erstmal prima, das es nun laeuft.

>ich benutze nie PGM_P???

Indirekt schon. Ist auch nicht wichtig, funktioniert ja so.

> Wie kann ich sehen ob mein Array wirklich im Flash-Speicher steht?

Wenn der Wert von init_wert wir erwartet ist, dann kommen die Daten
wohl aus dem Flash-Array. Im Zweifel die Ausgabedateien des Compilers
durchschauen, dort werden Konstanten im Flash als solche markiert.

>Ist es möglich (mit memcpy_P) das Array zusätzlich
>noch in den RAM zu kopieren um Werte im Array
>zu ändern?

Sollte funktionieren. Zugriff aufs Array im RAM dann ohne pgm_*
"Klimmzuege".

Martin

von Thomas (Gast)


Lesenswert?

Moin,

hab da zwei Compiler-Warnungen aus denen ich nicht
schlau werde. Jemand einen Tip??

main.c:57: warning: excess elements in array initializer
main.c:57: warning: (near initialization for `init_werte')


const unsigned char init_werte[ANZAHL_KOMPONENTEN][ANZAHL_IDENTIFIER]
PROGMEM =
{
{ 0x3e, 0x41, 0x41, 0x41, 0x3e, 0x00  },   //Komponente 0
{ 0x00, 0x21, 0x7f, 0x01, 0x00, 0x00  },   //Komponente 1
{ 0x21, 0x43, 0x45, 0x49, 0x31, 0x00  },
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00  }    // << main.c:57
};

Danke und Ciao, Thomas

von Joerg Wunsch (Gast)


Lesenswert?

Ist doch ziemlich einfach: Du hast einen Initializer mehr als
Feldelemente, d. h. Dein ANZAHL_KOMPONENTEN ist zu klein.

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.