Hardfault EEPROM

OP #5526222
Lesenswert?

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
Angehängte Dateien:
Gast #5526238
Lesenswert?

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?
Gast #5526291
Lesenswert?

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.
OP #5526307
Lesenswert?

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)
#5526339
Lesenswert?

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.
Gast #5526351
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren