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?
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...
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.
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.
Ok, mein Problem ist wohl eher, dass ich mit der Script-Syntax nichts anfangen kann. Werd mich da mal etwas einlesen...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.