Forum: FPGA, VHDL & Co. Microblaze - Frage zu delay slots.


von klaus (Gast)


Lesenswert?

Kleine Frage zum Verständnis von Delay Slots beim Microblaze. Ich hatte 
folgenden Code:
1
addi  r5, r0, __bss_start
2
brlid  r15, .L_f_clear_section
3
addi  r6, r0, __bss_end

Meine Idee war nun den delay slot von brlid zu füllen. Die Register r5 
und r6 speichern die Parameter für die Funktion und die initialisierung 
von r6 könnte man (so die Idee) in den delay slot platzieren. Der 
bezeigte Code funktioniert aber nicht. Der Debugger verschluckt sich 
daran auch irgendwie.

Schreibe ich hingegen ein "nop" in den Delay slot funktioniert alles wie 
erwartet:
1
addi  r5, r0, __bss_start
2
addi  r6, r0, __bss_end
3
brlid  r15, .L_f_clear_section
4
nop


Wo liegt hier der Unterschied/das Problem ? Ideen? Vorschläge?

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Was ist den der genaue Fehler?
Bedenke das der Code im delayslot sowohl ausgeführt wird wenn der Sprung 
genommen wird als auch wenn er nicht genommen wird!

Allgemein: Wird die Schleife wirklich so oft aufgerufen das sich hier 
eine Optimierung lohnt?
Zumindest der GCC scheint die Delayslots noch nicht richtig nutzen zu 
können da wird i.A. einfach ein nop eingefügt...

von Georg A. (Gast)


Lesenswert?

__bss_end ist ja so im allgemeinen ein 32Bit-Wert, oder? addi hat 
prinzipiell aber nur 16Bit Platz für die Konstante, die oberen 16bit 
kann man per imm-Instruktion laden. Der Assembler hat dazu eine 
Automatik*), dass er das selbst macht, wenn die Zahl zu gross wird. 
Damit steht halt nur das imm im Delayslot und das addi wird gar nicht 
ausgeführt.

Müsste man eigentlich sehen, wenn man "mb-objdump -d <elf-file>" macht 
und den rohen Assemblercode anschaut.

*) Doku zu .imm:

The assembler provided by Xilinx automatically detects the need for imm 
instructions. When a 32-bit IMM value is specified in a Type B 
instruction, the assembler converts the IMM value to a 16-bit one to 
assemble the instruction and inserts an imm instruction before it in the 
executable file.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Georg hat vermutlich recht, hab ich jezt garnicht dran gedacht das 
__bss_end ein 32bit Wert sein könnte...

von klaus (Gast)


Lesenswert?

> Was ist den der genaue Fehler?
> Bedenke das der Code im delayslot sowohl ausgeführt wird wenn der Sprung
> genommen wird als auch wenn er nicht genommen wird!
Wußte ich nicht, okay. Macht die Sache mit diesen Delay Slots 
komplizierter. Aber da der Sprung nicht konditional ist, hier kein 
Problem denke ich.

> __bss_end ist ja so im allgemeinen ein 32Bit-Wert, oder? addi hat
> prinzipiell aber nur 16Bit Platz für die Konstante, die oberen 16bit
> kann man per imm-Instruktion laden. Der Assembler hat dazu eine
> Automatik*), dass er das selbst macht, wenn die Zahl zu gross wird.
> Damit steht halt nur das imm im Delayslot und das addi wird gar nicht
> ausgeführt.

> Müsste man eigentlich sehen, wenn man "mb-objdump -d <elf-file>" macht
> und den rohen Assemblercode anschaut.

Wow, vielen Dank Georg. Genau das war wohl das Problem. Muss man auch 
erstmal drauf kommen...


Vielen Dank für eure Hilfe

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.