www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Zugriff auf Struct im Flash


Autor: Elektrohugo (Gast)
Datum:
Angehängte Dateien:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Elektrohugo (Gast)
Datum:

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

 Lvalue required USS Fernbedienung.c

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
typedef const struct{
    unsigned char state;


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

Autor: Elektrohugo (Gast)
Datum:

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

Autor: Elektrohugo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das const habe ich jetzt auch mal weggenommen. Brachte aber auch keinen 
Erfolg

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Elektrohugo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK sehe ich ein. Aber wo liegt denn nun der Fehler?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Elektrohugo (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Elektrohugo (Gast)
Datum:

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

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.