Forum: Mikrocontroller und Digitale Elektronik Hardfault EEPROM


von Bert S. (kautschuck)


Angehängte Dateien:

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

von Anal Ysator (Gast)


Lesenswert?

Der Fehler ist in Zeile 42 deines Programms.

Das wird dir hier jeder sagen den du fragst.

von Jens (Gast)


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?

von Bert S. (kautschuck)


Lesenswert?

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.

von KI-Besitzer (Gast)


Lesenswert?


von Bert S. (kautschuck)


Lesenswert?

KI-Besitzer schrieb:
> http://www.keil.com/support/docs/3629.htm

Danke, ich verwende aber Atollic Truestudio, daher ist das wohl nicht 
ableitbar.

von Bert S. (kautschuck)


Lesenswert?

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

von Jens (Gast)


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.

von Bert S. (kautschuck)


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)

von Carl D. (jcw2)


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.

von Jens (Gast)


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

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
Noch kein Account? Hier anmelden.