Zugriff auf Struct im Flash

Gast #1377789
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?
Angehängte Dateien:
#1377798
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.
#1377802
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.
Gast #1377819
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);
...
#1377832
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.
Gast #1377851
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);
#1377861
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?

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.