Microblaze Exception Handling

OP #3589720
Lesenswert?

Hallo,

wie im Beitrag Beitrag "Microblaze Interrupt-Overrun" habe ich 
ein Problem mit einem MicroBlaze-System.

Deshalb habe ich jetzt mal den MB mit allen verfügbaren Exceptions 
konfiguriert und einen Exception-Handler implementiert, den ich erstmal 
für jede Exception registriert habe.

Der MB greift über AXI -> AXI/PLB bride -> PLB/Wishbone bridge auf die 
Register meines FPGA-Designs zu. Diese Zugriffe funktionieren eigentlich 
bisher problemlos.
Jetzt ist es so, dass sobald ich auf diesem Pfad einen Zugriff mache, 
ich eine "Data Bus Exception" bekomme. Das sehe ich entweder über den 
Debugger mit Breakpoint im Handler oder über einen GPIO, den ich im 
Handler setze.

Jetzt war mein weiterer Plan per Simulation nachzuschauen, ob da auf dem 
Bus irgendwas auffälliges passiert. Seltsamerweise kann ich das 
Verhalten aber in der Simulation nicht nachbilden, am oben erwähnten 
GPIO tut sich gar nichts.

Hat jemand eine Idee, warum das Problem nur im FPGA auftritt, was 
prinzipiell diese Exception auslösen kann oder wo ich weiter forschen 
kann?
#3590967
Lesenswert?

Philip K. schrieb:
> Noch eine Frage am Rande - Ich finde nirgendwo Informationen darüber,
> wie groß eigentlich der Stack des MB ist. Der debugger liefert mir für
> die low/high register (SLR/SHR) die Werte 0x0 und 0xffffffff. Demnach
> wäre der Stack 4G groß, was vermutlich nicht sein kann...

Der Microblaze selbst hat keinen Stack, sondern ein Bereich (section 
.stack) im verfügbaren Speicher wird als Stack reserviert.
Dies geschieht im Linkerscript.
Wo dieser Bereich liegt und wie groß er ist, hängt ganz von deinem 
System ab.

SLR und SHR dienen nur zur Kontrolle, ob während der Laufzeit die 
zugewiesenen Grenzen des Stack verletzt werden (Stack Overflow).
Du oder der Startup Code ist dafür verantwortlich, dass SLR und SHR 
korrekt gesetzt werden, damit dieser Check ausgeführt werden kann.
Bei Dir ist das anscheinend nicht geschehen, weil der volle 
Speicherberich eingetragen ist.
Die Überprüfung ist somit einfach nicht wirksam.
OP #3591431
Lesenswert?

Im linkersript steht

_STACK_SIZE = DEFINED(_STACK_SIZE) ? _STACK_SIZE : 0x400;

und

.stack (NOLOAD) : {
   _stack_end = .;
   . += _STACK_SIZE;
   . = ALIGN(8);
   _stack = .;
   __stack = _stack;
} > microblaze_0_i_bram_ctrl_microblaze_0_d_bram_ctrl

Damit kenne ich die Größe. Aber um SLR und SHR zu setzen muss ich ja die 
Position auch kennen.

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