Forum: FPGA, VHDL & Co. Microblaze Exception Handling


von Philip K. (philip_k)


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?

von Philip K. (philip_k)


Lesenswert?

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...

von Klaus F. (kfalser)


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.

von Philip K. (philip_k)


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.

von Klaus F. (kfalser)


Lesenswert?

SLR = _stack_end
SHR = _stack

von Philip K. (philip_k)


Lesenswert?

Ok, mein Problem ist wohl eher, dass ich mit der Script-Syntax nichts 
anfangen kann. Werd mich da mal etwas einlesen...

von Philip K. (philip_k)


Lesenswert?

Die schönsten Fehler sind doch die, die nicht mehr auftreten, sobald man 
danach sucht. Im Moment sieht es so aus, dass der Fehler nicht auftritt, 
wenn ich im Code das Exception-Handling aktiviere. Am Programmablauf 
sollte das aber doch eigentlich gar nichts ändern, oder?

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.