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