Hi, Ich versuche auf einem STM32F405VGT6 den virtuellen EEPROM einzurichten, jedoch wirft mir dann z.B sprintf einen Hardfault. Die EEPROM Emulation läuft auf Sektor 2 und 3 und somit ab 0x0800 8000. Ich habe mal den Flash analysiert und gesehen, dass im Flash an der Stelle 0x0800 8db8 bereits etwas sitzt, daher wohl der Hardfault. Somit kann ich die 16kByte pages wohl vergessen und muss auf die 128kByte Pages ausweichen. Jemand eine Idee warum hier 0x0800 8db8 bereits belegt ist, obwohl eigentlich vorher noch genügen Speicher vorhanden ist? https://www.st.com/content/ccc/resource/technical/document/reference_manual/3d/6d/5a/66/b4/99/40/d4/DM00031020.pdf/files/DM00031020.pdf/jcr:content/translations/en.DM00031020.pdf
Der Fehler ist in Zeile 42 deines Programms. Das wird dir hier jeder sagen den du fragst.
Du musst dem linker schon sagen das er in dem Bereich der Page die du löschen willst nichts platziert und wenn dann nur die Daten die du lesen willst. Woher soll bekannt sein das du die Page gelöscht wird?
Jens schrieb: > Du musst dem linker schon sagen das er in dem Bereich der Page die du > löschen willst nichts platziert und wenn dann nur die Daten die du lesen > willst. Ok, danke, ich versuche das mal zu implementieren.
KI-Besitzer schrieb: > http://www.keil.com/support/docs/3629.htm Danke, ich verwende aber Atollic Truestudio, daher ist das wohl nicht ableitbar.
Ich habe hier mal ein Beispiel für ein Linker Skript gefunden um einen Bereich für den EEPROM zu reservieren. Nun muss ich aber nur einen Zwischenbereich reservieren (Sektor 2 und 3) und nicht die letzten Pages. Wie kann ich das bewerkstelligen? https://github.com/fishpepper/OpenGround/blob/master/linker/STM32F072VB_FLASH.ld
In dem du diese Zeile anpasst EMULATED_EEPROM (rwx) : ORIGIN = 0x8000000+128K-2*2048 LENGTH=2*2048 Du kannst aber auch ein 2k array definieren welches direkt an die Adresse geschrieben wird und darein deine Daten packen.
Jens schrieb: > EMULATED_EEPROM (rwx) : ORIGIN = 0x8000000+128K-2*2048 LENGTH=2*2048 Das schon, aber dann darf ich ja FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 128K-2*2048 nur bis 0x8008000 gehen lassen, obwohl der ganze Flash 1MByte ist. Oder kann ich etwas wie folgt definieren: FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 32k EMULATED_EEPROM (rwx) : ORIGIN = 0x8000000+32k LENGTH=2*16k FLASH (rx) : ORIGIN = 0x8000000+32k+2*16k, LENGTH = 1024k-(32k+2*16k)
Bert S. schrieb: > Jens schrieb: >> EMULATED_EEPROM (rwx) : ORIGIN = 0x8000000+128K-2*2048 LENGTH=2*2048 > > Das schon, aber dann darf ich ja > > FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 128K-2*2048 > > nur bis 0x8008000 gehen lassen, obwohl der ganze Flash 1MByte ist. Oder > kann ich etwas wie folgt definieren: > > FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 32k > EMULATED_EEPROM (rwx) : ORIGIN = 0x8000000+32k LENGTH=2*16k > FLASH (rx) : ORIGIN = 0x8000000+32k+2*16k, LENGTH = > 1024k-(32k+2*16k) Da einzige, das bei ARM im Flash einen festen Platz hat, ist das .isr Segment am Beginn. Danach muß nicht .text kommen, da kann man auch die EeproEmulation reinlegen. Davor noch den "." auf den passenden Pagestart ausgerichtet und schon passt es.
2 Words sind fest. Der Cstack als erstes und dann die Reset Adresse. Die Vector Tabelle muss nur einen bestimmten Offset haben und kann sogar im RAM liegen. Ob es klappt die Adresse so um zu ändern kommt auf deinen linker an weil du den eigentlichen Flash Bereich für dein Programm unterbrichst. Im Iar gibt es eine Pragma location Definition mit der man eine Variable oder konstante an eine feste Adresse setzt. #pragma location=0x8008000 Uint8_t dummy[2048]; Der linker baut den Rest vom Programm dann um den Bereich herum
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.