www.mikrocontroller.net

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


Autor: klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kleine Frage zum Verständnis von Delay Slots beim Microblaze. Ich hatte 
folgenden Code:
addi  r5, r0, __bss_start
brlid  r15, .L_f_clear_section
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:
addi  r5, r0, __bss_start
addi  r6, r0, __bss_end
brlid  r15, .L_f_clear_section
nop


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

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Georg A. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

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

Autor: klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.