Forum: Mikrocontroller und Digitale Elektronik Zugriff auf Struct im Flash


von Elektrohugo (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe eine struct im flash angelegt. Siehe angehängter Code. Wenn ich 
nun mit der Funktion test_1 darauf zugreife erhalte ich die richtigen 
Werte. Diese Zugriffsart kann ja aber nicht im Sinne des Erfinders sein.

void test_1(){
  unsigned long tmp;
    tmp =&menu_nextstate;
    cTest_1[0] = FLASH_Read_Byte(tmp);
    cTest_1[1] = FLASH_Read_Byte(tmp+1);
    cTest_1[2] = FLASH_Read_Byte(tmp+2);
}

Wenn ich nun so darauf zugreife erhalte ich Fantasiewerte.

void test_2(){
  unsigned long tmp;
    cTest_2[0] = FLASH_Read_Byte(menu_nextstate[0].state);
    cTest_2[1] = FLASH_Read_Byte(menu_nextstate[0].input);
    cTest_2[2] = FLASH_Read_Byte(menu_nextstate[0].nextstate);
}

Mache ich da etwas falsch?

von Karl H. (kbuchegg)


Lesenswert?

Elektrohugo schrieb:

> void test_2(){
>   unsigned long tmp;
>     cTest_2[0] = FLASH_Read_Byte(menu_nextstate[0].state);

FLASH_Read_Byte wird nicht sehr erbaut darüber sein, wenn du ihm den 
Status des menu_nextstate[0] als Adresse von der es zu lesen hat, 
unterjubelst.

      cTest_2[0] = FLASH_Read_Byte(&menu_nextstate[0].state);


Edit: Warum arbeitest du einmal mit Strukturen und dann wieder mit 
Arrays. Wenn dein Toolkit nicht über eine Funktion FLASH_Read_Block 
verfügt, dann solltest du dir eine schreiben und eine komplette Struktur 
in einem Rutsch lesen. Langsamer als deine jetzige Lösung ist das auch 
nicht, aber es wäre übersichtlicher.

von Karl H. (kbuchegg)


Lesenswert?

>  unsigned long tmp;
>    tmp =&menu_nextstate;

Eine Adresse ist kein unsigned long.
Will meine eine Adresse in einer Variablen speichern, dann benutzt man 
dazu eine Pointervariable.

Fang bitte an, etwas mehr Aufmerksamkeit den Datentypen zu widmen. Deine 
Fehlerrate an blödsinnigen Fehlern die du selbst verursacht hast, wird 
es dir danken indem sie anfängt zu sinken.

von Elektrohugo (Gast)


Lesenswert?

Danke für die schnelle Antwort. Das hatte ich schon probiert mit dieser 
Fehlermeldung als Resultat:

 Lvalue required USS Fernbedienung.c

von Karl H. (kbuchegg)


Lesenswert?

typedef const struct{
    unsigned char state;


Nimm das const weg.
Das ist an dieser Stelle unsinnig und beschränkt dich nur unnötig.

von Elektrohugo (Gast)


Lesenswert?

Das mit den Datentypen ist mir bewusst.

Hier aber mal ein Auszug aus dem Compilerhandbuch:

// for MCUs with 64kb of Flash memory or less
char FLASH_Read_Byte(unsigned int address);
// for MCUs with Flash memory larger than 64kb
char FLASH_Read_Byte(unsigned long address);

Example
// for MCUs with Flash memory larger than 64kb
unsigned long tmp;
...
tmp = Flash_Read(0x0D00);
...

von Elektrohugo (Gast)


Lesenswert?

Das const habe ich jetzt auch mal weggenommen. Brachte aber auch keinen 
Erfolg

von Karl H. (kbuchegg)


Lesenswert?

Elektrohugo schrieb:
> Das mit den Datentypen ist mir bewusst.
>
> Hier aber mal ein Auszug aus dem Compilerhandbuch:
>
> // for MCUs with 64kb of Flash memory or less
> char FLASH_Read_Byte(unsigned int address);
> // for MCUs with Flash memory larger than 64kb
> char FLASH_Read_Byte(unsigned long address);
>
> Example
> // for MCUs with Flash memory larger than 64kb
> unsigned long tmp;
> ...
> tmp = Flash_Read(0x0D00);
> ...


Nur weil die Funktion einen unsigned long haben will, heißt das noch 
lange nicht, dass das auch vernünftig ist.

von Elektrohugo (Gast)


Lesenswert?

OK sehe ich ein. Aber wo liegt denn nun der Fehler?

von Karl H. (kbuchegg)


Lesenswert?

Elektrohugo schrieb:
> OK sehe ich ein. Aber wo liegt denn nun der Fehler?

Der Fehler liegt immer noch darin, dass du der Leserroutine den Inhalt 
des Status-Members übergibst, anstelle seiner Adresse.

von Elektrohugo (Gast)


Lesenswert?

Ja, aber wie kann ich den die Adresse übergeben?

Das geht nicht:
cTest_2[0] = FLASH_Read_Byte(&menu_nextstate[0].state);

Das auch nicht:
cTest_2[0] = FLASH_Read_Byte(&(menu_nextstate[0].state));

Das geht, bringt mir aber nichts.
cTest_3[0] = FLASH_Read_Byte(&menu_nextstate);

von Karl H. (kbuchegg)


Lesenswert?

Elektrohugo schrieb:
> Ja, aber wie kann ich den die Adresse übergeben?
>
> Das geht nicht:
> cTest_2[0] = FLASH_Read_Byte(&menu_nextstate[0].state);
>
> Das auch nicht:
> cTest_2[0] = FLASH_Read_Byte(&(menu_nextstate[0].state));

Doch.
All diese Versionen sind grundsätzlich das was du haben willst (mit 
einem zusätzlichen Cast um dem FLASH_Read_Byte seinen unsigned long zu 
geben)

Hast du das const aus dem typedef schon rausgenommen?

von Elektrohugo (Gast)


Lesenswert?

Ja das const habe ich aus dem tydef rausgenommen.

Leider lassen sich die obigen nicht compilieren. Ich erhalte dann 
folgende Fehlermeldung.

23 321 Lvalue required USS Fernbedienung.c

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.