Test der Befehle mit delay slot

Test der Verzweigebefehle mit delay slot


Da der delay slot der Befehle BEQZ, BNEZ, JALR, JALRS, JRS, JR und RFE vom C-Compiler noch nicht genutzt wird, ist ein Test der Befehle nur mit einer Assembler Befehlsfolge möglich. Der Befehl RFE ist zum Abschluss von Interrupt Programmen und wird immer nur in Assembler Befehlsfolgen verwendet werden, die in C-Programme eingebunden werden. Dabei wird jetzt schon immer hinter den RFE Befehl der Befehl SBITS INT im delay slot abgearbeitet. Bei allen anderen Befehlen wird derzeit vom Compiler in den delay slot der Befehl OR r0, r0 geschrieben, der nichts verändert (wird als NOP verwendet). Für einen Test der Abarbeitung von Befehlen im delay slot wurde daher auch ein kleines Assembler Programm geschrieben, welches 5 Funktionen bereitstellt, die von einem C-Programm aufgerufen werden können. Das Assemblerprogramm wurde im SpartanMC SoC Verzeichnis unter:
spartanmc-soc/spartanmc/lib_obj/src/peri/test_delay_slot.s
abgelegt und dazu notwendige header unter:
spartanmc-soc/spartanmc/include/test_delay_slot.h
In einem Projekt für das sp601 Board, das auch für die Programme im Quickguid eingesetzt wird, werden in einem C-Programm dann die 5 Funktionen verwendet. Die Dateien zum Projekt sind:
Informationen zu den im Programm verwendeten Funktionen aus dem Include io_funktionen.h sind im Wiki unter GCC- Konsolenfunktionen zu finden.
Bei der Abarbeitung des Programms ist folgendes Protokoll auf der SpartanMC Konsole entstanden:
test_delay_slot.txt
Test des delay slot in C
========================
1. Test mit BNEZ
   Es wird ein 36 Bit Wert nach links geschoben

36 Bit Startwert: 0x00003C3C3    Schiebezyklen <=18 : 18
Das Ergenis mit BNEZ ist 0xF0F0C0000

Weiter bei jeder Eingabe: 

2. 36 Bit Wert auf 0 testen mit BEQZ

36 Bit Startwert: 123456789
Der Wert ist nicht 0 Flag: 00002

Weiter bei jeder Eingabe: 

3. 36 Bit Wert links schieben mit UP-Aufruf JALRS

36 Bit Startwert: 0x00003C3C3    Schiebezyklen <=18 : 18
Das Ergenis mit JALRS ist 0xF0F0C0000

Weiter bei jeder Eingabe: 

4. 36 Bit Wert rechts schieben mit UP-Aufruf JALR und Ruecksprung mit JR

36 Bit Startwert: 0xF0F0C0000    Schiebezyklen <=18 : 18
Das Ergenis mit JALR ist 0x00003C3C3

Weiter bei jeder Eingabe: 

Test des delay slot in C
========================
1. Test mit BNEZ
   Es wird ein 36 Bit Wert nach links geschoben

36 Bit Startwert: 0x3C3C3C3C3    Schiebezyklen <=18 : 2
Das Ergenis mit BNEZ ist 0xF0F0F0F0C

Weiter bei jeder Eingabe: 

2. 36 Bit Wert auf 0 testen mit BEQZ

36 Bit Startwert: 0
Der Wert == 0

Weiter bei jeder Eingabe: 

3. 36 Bit Wert links schieben mit UP-Aufruf JALRS

36 Bit Startwert: 0x3C3C3C3C3    Schiebezyklen <=18 : 2
Das Ergenis mit JALRS ist 0xF0F0F0F0C

Weiter bei jeder Eingabe: 

4. 36 Bit Wert rechts schieben mit UP-Aufruf JALR und Ruecksprung mit JR

36 Bit Startwert: 0xF0F0F0F0C    Schiebezyklen <=18 : 2
Das Ergenis mit JALR ist 0x3C3C3C3C3

Weiter bei jeder Eingabe: isr_def02 PC= 0049F CC= 0
isr_def02 PC= 004A0 CC= 0
isr_def02 PC= 0049E CC= 0
isr_def02 PC= 0049F CC= 0
isr_def02 PC= 004A0 CC= 0
isr_def02 PC= 0049E CC= 0
isr_def02 PC= 0049F CC= 0
isr_def02 PC= 004A0 CC= 0
isr_def02 PC= 0049E CC= 0
isr_def02 PC= 0049F CC= 0
isr_def02 PC= 004A0 CC= 0
isr_def02 PC= 0049E CC= 0
isr_def02 PC= 0049F CC= 0
isr_def02 PC= 004A0 CC= 0
isr_def02 PC= 0049E CC= 0
isr_def02 PC= 0049F CC= 0
isr_def02 PC= 004A0 CC= 0
isr_def02 PC= 0049E CC= 0

Am Ende des Tests wurde kurz auf BUTTON 0 des sp601 Board gedrückt und dadurch ein Interrupt ausgelöst bei dem die Adressen protokolliert werden auf denen das Programm sich gerade befindet. In der Datei main.lst kann man sehen, das sich das Programm in der Warteschleife von uart_receive auf den Datenadressen 0x93c bis 0x940 befindet. Da im delay slot kein Interrupt erlaubt ist, wird der Befehl auf der Adresse 0x942 nicht mit protokolliert. Die Funktionen aus test_delay_slot.s sind in der Liste ab der Datenadresse 0x8c8 bis 0x92a zu finden.


SpartanMC