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?
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.
> 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.
Danke für die schnelle Antwort. Das hatte ich schon probiert mit dieser Fehlermeldung als Resultat: Lvalue required USS Fernbedienung.c
typedef const struct{ unsigned char state; Nimm das const weg. Das ist an dieser Stelle unsinnig und beschränkt dich nur unnötig.
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); ...
Das const habe ich jetzt auch mal weggenommen. Brachte aber auch keinen Erfolg
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.
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.
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);
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.