diff options
| author | Sven Eisenhauer <sven@sven-eisenhauer.net> | 2023-11-10 15:11:48 +0100 |
|---|---|---|
| committer | Sven Eisenhauer <sven@sven-eisenhauer.net> | 2023-11-10 15:11:48 +0100 |
| commit | 33613a85afc4b1481367fbe92a17ee59c240250b (patch) | |
| tree | 670b842326116b376b505ec2263878912fca97e2 /Bachelor/Mikroprozessorsysteme2/mi2/Termin6 | |
| download | Studium-master.tar.gz Studium-master.tar.bz2 | |
Diffstat (limited to 'Bachelor/Mikroprozessorsysteme2/mi2/Termin6')
| -rw-r--r-- | Bachelor/Mikroprozessorsysteme2/mi2/Termin6/Doku.odt | bin | 0 -> 18903 bytes | |||
| -rw-r--r-- | Bachelor/Mikroprozessorsysteme2/mi2/Termin6/Doku.pdf | bin | 0 -> 117410 bytes | |||
| -rw-r--r-- | Bachelor/Mikroprozessorsysteme2/mi2/Termin6/Doku.sxw | bin | 0 -> 18723 bytes | |||
| -rw-r--r-- | Bachelor/Mikroprozessorsysteme2/mi2/Termin6/Termin6.pdf | bin | 0 -> 9240 bytes | |||
| -rw-r--r-- | Bachelor/Mikroprozessorsysteme2/mi2/Termin6/Termin6Aufgabe1.c | 288 | ||||
| -rw-r--r-- | Bachelor/Mikroprozessorsysteme2/mi2/Termin6/doku.txt | 19 | ||||
| -rw-r--r-- | Bachelor/Mikroprozessorsysteme2/mi2/Termin6/frank_micsys2_praktikum06.zip | bin | 0 -> 27338 bytes | |||
| -rw-r--r-- | Bachelor/Mikroprozessorsysteme2/mi2/Termin6/makefile | 52 | ||||
| -rw-r--r-- | Bachelor/Mikroprozessorsysteme2/mi2/Termin6/ser_io.S | 57 | ||||
| -rw-r--r-- | Bachelor/Mikroprozessorsysteme2/mi2/Termin6/seriell.S | 73 | ||||
| -rw-r--r-- | Bachelor/Mikroprozessorsysteme2/mi2/Termin6/swi.S | 34 |
11 files changed, 523 insertions, 0 deletions
diff --git a/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/Doku.odt b/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/Doku.odt Binary files differnew file mode 100644 index 0000000..9fdfe2a --- /dev/null +++ b/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/Doku.odt diff --git a/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/Doku.pdf b/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/Doku.pdf Binary files differnew file mode 100644 index 0000000..ba7abd9 --- /dev/null +++ b/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/Doku.pdf diff --git a/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/Doku.sxw b/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/Doku.sxw Binary files differnew file mode 100644 index 0000000..6a2f644 --- /dev/null +++ b/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/Doku.sxw diff --git a/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/Termin6.pdf b/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/Termin6.pdf Binary files differnew file mode 100644 index 0000000..e9f745b --- /dev/null +++ b/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/Termin6.pdf diff --git a/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/Termin6Aufgabe1.c b/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/Termin6Aufgabe1.c new file mode 100644 index 0000000..c4ffe50 --- /dev/null +++ b/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/Termin6Aufgabe1.c @@ -0,0 +1,288 @@ +// Lösung zu Termin6&7 +// Aufgabe 1... +// Namen: Andreas Spirka; Sven Eisenhauer +// Matr.: 702789; 707173 +// vom : 25.01.2006 + + +#include "../h/pmc.h" +#include "../h/tc.h" +#include "../h/pio.h" +#include "../h/aic.h" + +void pmcinit(void); +void pioinit(void); +void Timer_init(void); +int massemessen(void); +void pumpestart(void); +void pumpestop(void); +void greeting(void); +void ausgabe(int); +int genaumessen(void); +void Int2Str(int); +void taste_irq_handler (void) __attribute__ ((interrupt)); + +volatile int aktion=0; +char lf[2]; +char cr[2]; + +// für die Initialisierung der Zähler TC4 und TC5 + +#define TC4_INIT TC_CLKS_MCK2 | TC_LDBSTOP | TC_CAPT | TC_LDRA_RISING_EDGE | TC_LDRB_RISING_EDGE +#define TC5_INIT TC_CLKS_MCK2 | TC_LDBSTOP | TC_CAPT | TC_LDRA_RISING_EDGE | TC_LDRB_RISING_EDGE + +// Interruptserviceroutine für die Tasten SW1 und SW2 +void taste_irq_handler (void) +{ + StructPIO* piobaseB = PIOB_BASE; // Basisadresse PIO B + StructAIC* aicbase = AIC_BASE; // Basisadresse Advanced Interrupt Controller + int taste = piobaseB->PIO_PDSR; + if (!(taste & KEY1)) // falls Schalter 1 gedrückt + aktion=1; + if (!(taste & KEY2)) // falls Schalter 2 gedrückt + aktion=2; + + aicbase->AIC_EOICR = piobaseB->PIO_ISR; // AIC End of Interrupt Command Register = 1 +} + +void pmcinit(void) +{ + StructPMC* pmcbase = PMC_BASE; + pmcbase->PMC_PCER = 0x06f84; // Clock PIOA, PIOB, Timer5, Timer4, Timer3,US0 einschalten +} + +void pioinit(void) +{ + StructPIO* piobaseB = PIOB_BASE; // Basisadresse PIO B + StructAIC* aicbase = AIC_BASE; // Basisadresse Advanced Interrupt Controller + // disable all interrupt sources of pio + piobaseB->PIO_IDR = 0xFFFFFFFF; + piobaseB->PIO_PER = KEY1|KEY2; // Schalter 1-2 enabeled + // Interrupt Initialisierung für PIOB (0x4000) + aicbase->AIC_IDCR = (1<<PIOB_ID); // Interrupt disabled + aicbase->AIC_ICCR = (1<<PIOB_ID); // Interrupt clear + aicbase->AIC_SMR[PIOB_ID] = 0x1; // An Stelle 14 Level Sensitive / Höchste Priorität + aicbase->AIC_SVR[PIOB_ID] = (unsigned int)taste_irq_handler; // Adresse der Interrupt Service Routine in Vektor-Tabelle + aicbase->AIC_IECR = (1<<PIOB_ID); // enable PIOB Interrupt in AIC + piobaseB->PIO_IER = KEY1|KEY2; // Schalter 1+2 lösen Interrupts aus +} + +void Timer_init(void) +{ + StructTC* tcbase3 = TCB3_BASE; // Basisadressse TC Block 3 Pumpe + StructTC* tcbase4 = TCB4_BASE; // Basisadressse TC Block 4 Waage + StructTC* tcbase5 = TCB5_BASE; // Basisadressse TC Block 5 Waage + StructPIO* piobaseA = PIOA_BASE; // Basisadresse PIO A + + tcbase3->TC_CCR = TC_CLKDIS; // Disable Clock + + // Initialize the mode of the timer 3 + tcbase3->TC_CMR = + TC_ACPC_CLEAR_OUTPUT | //ACPC : Register C clear TIOA + TC_ACPA_SET_OUTPUT | //ACPA : Register A set TIOA + TC_WAVE | //WAVE : Waveform mode + TC_CPCTRG | //CPCTRG : Register C compare trigger enable + TC_CLKS_MCK1024; //TCCLKS : MCKI / 1024 + + // Initialize the counter: + tcbase3->TC_RA = 244; + tcbase3->TC_RC = 488; // RA = RC/2 für symmetrisches Signal + + // Start the timer : + tcbase3->TC_CCR = TC_CLKEN ; //__ + tcbase3->TC_CCR = TC_SWTRG ; //__ + piobaseA->PIO_PER = (1<<PIOTIOA3) ; // Pio herrscht über pin + piobaseA->PIO_OER = (1<<PIOTIOA3) ; // Output an pin + piobaseA->PIO_CODR = (1<<PIOTIOA3) ; // clear output -> low signal, pumpe aus + +// Periodendauer der Waagensignale messen +// Signal aud TIOA4 ca. 16kHz entspricht ca. einer Periodendauer von 62,5us +// durch den Teiler von 32 ergeben sich ca. 2ms +// Zähler mit positiver Flanke starten + + //piobaseA->PIO_PDR = 0x090; + piobaseA->PIO_PDR = (1<<PIOTIOA4)|(1<<PIOTIOA5); + tcbase4->TC_CCR = TC_CLKDIS; + tcbase4->TC_CMR = TC4_INIT; + tcbase4->TC_CCR = TC_CLKEN; + tcbase4->TC_CCR = TC_SWTRG; + + tcbase5->TC_CCR = TC_CLKDIS; + tcbase5->TC_CMR = TC5_INIT; + tcbase5->TC_CCR = TC_CLKEN; + tcbase5->TC_CCR = TC_SWTRG; +} + +int massemessen(void) +{ + StructTC* tcbase4 = TCB4_BASE; + StructTC* tcbase5 = TCB5_BASE; + volatile int captureRA1; + volatile int captureRB1; + volatile int capturediff1; + volatile float Periodendauer1; + volatile int captureRA2; + volatile int captureRB2; + volatile int capturediff2; + volatile float Periodendauer2; + volatile int c1=18030; + volatile int c2=40; + volatile int masse; + + tcbase4->TC_CCR = TC_SWTRG; + tcbase5->TC_CCR = TC_SWTRG; + while (!( tcbase4->TC_SR & TC_LDBSTOP)); // Capture Register B wurde geladen Messung abgeschlossen + captureRA1 = tcbase4->TC_RA; // + captureRB1 = tcbase4->TC_RB; + capturediff1 = abs(captureRB1) - abs(captureRA1); + Periodendauer1 = abs(capturediff1); + while (!( tcbase5->TC_SR & TC_LDBSTOP)); // Capture Register B wurde geladen Messung abgeschlossen + captureRA2 = tcbase5->TC_RA; // + captureRB2 = tcbase5->TC_RB; + capturediff2 = abs(captureRB2) - abs(captureRA2); + Periodendauer2 = abs(capturediff2); + + masse = c1 * ((Periodendauer1 / Periodendauer2) -1) -c2; + return masse; +} + +void pumpestart(void) +{ + StructPIO* piobaseA = PIOA_BASE; + piobaseA->PIO_PDR = (1<<PIOTIOA3); // Timer herrscht über Bit (Taktsignal) +} + +void pumpestop(void) +{ + StructPIO* piobaseA = PIOA_BASE; + // Vermeiden, daß dauerhaftes High Signal (PIO herrscht über das BIT) + piobaseA->PIO_PER = (1<<PIOTIOA3) ; // PIN der PIO zuweisen + piobaseA->PIO_OER = (1<<PIOTIOA3) ; // wird auf Output gesetzt + piobaseA->PIO_CODR = (1<<PIOTIOA3) ; // Clear Output (low Signal) +} + +void greeting(void) +{ + cr[0]=0x0d; + lf[0]=0x0a; + lf[1]='\0'; + cr[1]='\0'; + puts("AUSSCHANKSTATION\0"); + puts(&cr[0]); + puts(&lf[0]); + puts("Bitte Becher auf die Waage stellen\0"); + puts(&cr[0]); + puts(&lf[0]); + puts("SW1 zum tarieren drücken\0"); + puts(&cr[0]); + puts(&lf[0]); +} + +void ausgabe(int m) +{ + cr[0]=0x0d; + lf[0]=0x0a; + lf[1]='\0'; + cr[1]='\0'; + puts("Gemessene Gesamtmasse: \0"); + Int2Str(m); + puts(&cr[0]); + puts(&lf[0]); + puts("Becher kann entfernt werden\0"); + puts(&cr[0]); + puts(&lf[0]); + +} + +void Int2Str(int m) +{ + int a,i=7; + char string[9]; + string[8] = '\0'; + + while(m != 0) + { + a = m%10; + string[i] = a + '0'; + m = m/10; + i--; + } + puts(&string[i+1]); +} + +int genaumessen(void) +{ + volatile int durchlaeufe=10; + volatile int summe=0; + volatile int retVal=0; + volatile int i=0; + for (i=0;i<durchlaeufe;i++) + { + summe+=massemessen(); + } + retVal= summe/durchlaeufe; + return retVal; +} + +int main(void) +{ + volatile int masse=0; + volatile int tara=0; + volatile int netto=0; + + cr[0]=0x0d; + lf[0]=0x0a; + lf[1]='\0'; + cr[1]='\0'; + + inits(); + greeting(); + pmcinit(); + Timer_init(); + pioinit(); + + for(;;) + { + if(aktion == 1) + { + puts("Tara: \0"); + tara=genaumessen(); + netto=0; + Int2Str(tara); + puts(" SW2 startet die Pumpe"); + puts(&cr[0]); + aktion=0; + } + if (aktion == 2 && tara != 0) + { + puts(&cr[0]); + puts(&lf[0]); + pumpestart(); + while(netto <= 50) + { + masse=genaumessen(); + netto=masse-tara; + puts("Fuellgewicht: \0"); + Int2Str(netto); + puts(&cr[0]); + } + pumpestop(); + ausgabe(masse); + do { + masse=genaumessen(); + } + while (masse > 10); + // Gewicht hat sich geändert, d. h. Becher wurde entfernt + // D. h. von vorne starten + greeting(); + aktion=0; + } + } + // disable piob command register in AIC + //aicbase->AIC_IDCR = (1<<PIOB_ID); + // disable all interrupt sources of pio + //piobaseB->PIO_IDR = 0xFFFFFFFF; + // Timer (0x200), PIOA (0x2000), PIOB (0x4000) ausschalten + //pmcbase->PMC_PCDR = (1<<PIOA_ID)|(1<<PIOB_ID)|(1<<TC3_ID); + return 0; +} diff --git a/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/doku.txt b/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/doku.txt new file mode 100644 index 0000000..ebab65e --- /dev/null +++ b/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/doku.txt @@ -0,0 +1,19 @@ +Dokumentaion Ausschankstation
+
+1. Nach dem Start des Programms erscheint ein Begrüßungstext
+ auf der seriellen Konsole.
+
+2. Stellen Sie einen Becher oder ein Glas auf die Waage.
+
+3. Drücken Sie die Taste SW1 zum tarieren der Waage.
+
+4. Drücken Sie die Taste SW2 zum Start des Abfüllvorgangs.
+
+5. Es werden 50 ml bzw. g abgefüllt.
+
+6. Auf der seriellen Konsole erscheint das Gesamtgewicht
+ auf der Waage. (Behälter plus Inhalt)
+
+7. Entfernen Sie den Becher.
+
+8. Starten Sie einen weiteren Abfüllvorgang mit Schritt 2.
diff --git a/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/frank_micsys2_praktikum06.zip b/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/frank_micsys2_praktikum06.zip Binary files differnew file mode 100644 index 0000000..70ea757 --- /dev/null +++ b/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/frank_micsys2_praktikum06.zip diff --git a/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/makefile b/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/makefile new file mode 100644 index 0000000..9cf7745 --- /dev/null +++ b/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/makefile @@ -0,0 +1,52 @@ +FILE = Termin6Aufgabe1 +Opti = 0 +all: + +# Übersetzen der Quelldatei + arm-elf-gcc -c -g -O$(Opti) $(FILE).c -I ../h + +# Erzeugen der Assemblerdatei aus der Quelldatei + arm-elf-gcc -S -O$(Opti) $(FILE).c -I ../h + +# Erzeugen der benötitgen Objektdateien + arm-elf-gcc -c -g -O$(Opti) swi.S -o swi.o -I ../h + arm-elf-gcc -c -g -O$(Opti) ../boot/boot.s -o boot.o -I ../h +# arm-elf-gcc -c -g -O$(Opti) ../boot/boot_ice.S -o boot_ice.o -I ../h +# arm-elf-gcc -c -g -O$(Opti) ../boot/boot_flash.S -o boot_flash.o -I ../h + arm-elf-gcc -c -g -O$(Opti) seriell.S -o seriell.o -I ../h + arm-elf-gcc -c -g -O$(Opti) ser_io.S -o ser_io.o -I ../h + +# Binden für die RAM-Version + arm-elf-ld -Ttext 0x02000000 -O$(Opti) boot.o swi.o seriell.o ser_io.o $(FILE).o -o $(FILE).elf /gnutools/lib/gcc-lib/arm-elf/3.3.2/libgcc.a +# arm-elf-ld -Ttext 0x02000000 -O$(Opti) boot_ice.o swi.o $(FILE).o -o $(FILE).elf + +# Linkerskripte noch nicht getestet +# arm-elf-ld -T ldscript.ram boot.o swi.o seriell.o ser_io.o swi.o $(FILE).o -o $(FILE).elf /gnutools/lib/gcc-lib/arm-elf/3.2.2/libgcc.a + +# Binden für die FLASH-Version +# arm-elf-ld -Ttext 0x1000000 boot.o swi.o $(FILE).o -o $(FILE).out /usr/gnutools/lib/gcc-lib/arm-elf/3.3.2/libgcc.a +# arm-elf-ld -Ttext 0x1000000 boot_flash.o swi.o $(FILE).o -o $(FILE).out + +# Linkerskripte noch nicht getestet +# arm-elf-ld -T ldscript.rom boot.o seriell.o ser_io.o swi.o $(FILE).o -o $(FILE).out /gnutools/lib/gcc-lib/arm-elf/3.2.2/libgcc.a + +# -I --input-target <bfdname> Assume input file is in format <bfdname> +# -O --output-target <bfdname> Create an output file in format <bfdname> +# -S --strip-all Remove all symbol and relocation information +# -x --discard-all Remove all non-global symbols +# -N --strip-symbol <name> Do not copy symbol <name> +# -O --output-target <bfdname> Create an output file in format <bfdname> +# -g --strip-debug Remove all debugging symbols +# arm-elf-objcopy -I elf32-littlearm -O binary -x -S -N -g $(FILE).out $(FILE).rom +# programm.rom nach /tftpboot/downlaod.bin kopieren <cp name.rom /tftpboot/download.bin> +# Jumper E7 muß auf STD stecken +# Mit <telnet 141.100.xxx.xxx> mit dem BDI2000 verbinden. +# mit <erase 0x1100000> flash-Bereich löschen +# mit <prog 0x1100000 download.bin bin> Programm ins flash schreiben. +# +# +clean: + rm *.o + rm *.s + rm *.elf + rm *.rom diff --git a/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/ser_io.S b/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/ser_io.S new file mode 100644 index 0000000..5bad2a8 --- /dev/null +++ b/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/ser_io.S @@ -0,0 +1,57 @@ +@---------------------------------------------------------------------------- +@ File Name : ser_io.S +@ Object : Ein- Ausgabe-Funktionen der seriellen Schnittstelle +@ +@ Namen : Matr.-Nr.: +@ : Matr.-Nr.: +@ +@---------------------------------------------------------------------------- + +@ Debuginformationen + .file "ser_io.S" + +@ Funktion + .text + .align 2 + .global inits + .type inits,function +inits: + stmfd sp!,{lr} @ Retten der Register + swi 0 + ldmfd sp!,{pc} @ Rücksprung + +@ Funktion + .text + .align 2 + .global puts + .type puts,function +puts: + stmfd sp!,{lr} @ Retten der Register + +// Hier muß Ihr Code eingefügt werden. + mov r5, r0 @ Anfangsadresse des kompletten Strings von r0 nach r5 kopieren +loop: ldrb r0, [r5], #1 @ Holen des Zeichens der Adresse in r5 nach r0 und erhöhe dann Adresse in r5 + cmp r0, #0 @ Ende des Strings? entspricht binärer Null + beq L1 @ Wenn Stringende erreicht + swi 1 @ Auslösen der SWI Methode putchar (swi + offset) + b loop @ weiter bei loop solange Stringende nicht erreicht +L1: + @mov r0, #0x0d @ Carriage Return + @swi 1 @ Auslösen der SWI Methode putchar (swi + offset) + @mov r0, #0x0a @ Linefeed + @swi 1 @ Auslösen der SWI Methode putchar (swi + offset) + ldmfd sp!,{pc} @ Rücksprung + +@ Funktion + .text + .align 2 + .global gets + .type gets,function +gets: + stmfd sp!,{lr} @ Retten der Register + +// Hier könnte Ihr Code eingefügt werden! + + ldmfd sp!,{pc} @ Rücksprung + +.end diff --git a/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/seriell.S b/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/seriell.S new file mode 100644 index 0000000..9560075 --- /dev/null +++ b/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/seriell.S @@ -0,0 +1,73 @@ +@---------------------------------------------------------------------------- +@ File Name : seriell.S +@ Object : Grundfunktionen der seriellen Schnittstelle +@ +@ 1.0 27/10/02 GR : Creation +@---------------------------------------------------------------------------- + + .file "seriell.S" + +#include "../h/pmc.inc" +#include "../h/pio.inc" +#include "../h/usart.inc" + +DEFAULT_BAUD = 38400 +CLOCK_SPEED = 25000000 +US_BAUD = 0x29 @ CLOCK_SPEED / (16*(DEFAULT_BAUD)) + +@ Funktion + .text + .align 2 + .global init_ser + .type init_ser,function +init_ser: + stmfd sp!, {r0-r3, lr} @ Register retten + adr r0,L1 + adr r1,L1_end +init_ser_loop: + ldmia r0!, {r2-r3} + cmp r0, r1 + str r3, [r2] + bne init_ser_loop + ldmfd sp!, {r0-r3, pc} @ Rücksprung +L1: + .word PMC_BASE+PMC_PCER, 0x4 + .word PIOA_BASE+PIO_PDR, 0x18000 + .word USART0_BASE+US_CR, 0xa0 + .word USART0_BASE+US_MR, 0x8c0 + .word USART0_BASE+US_BRGR, US_BAUD + .word USART0_BASE+US_CR, 0x50 +L1_end: + +@ Funktion + .text + .align 2 + .global putchar + .type putchar,function +putchar: + stmfd sp!, {r0-r2, lr} @ Register retten + ldr r2, =USART0_BASE +1: + ldr r1, [r2, #US_CSR] + tst r1, #US_TXRDY @ ist Transmitter frei + beq 1b + str r0, [r2,#US_THR] + ldmfd sp!, {r0-r2, pc} @ Rücksprung + +@ Funktion + .text + .align 2 + .global getchar + .type getchar,function +getchar: + stmfd sp!, {r1, r2, lr} @ Register retten + ldr r2, =USART0_BASE + +1: + ldr r1, [r2, #US_CSR] + ands r1, r1, #US_RXRDY + beq 1b + ldr r0, [r2, #US_RHR] + ldmfd sp!, {r1, r2, pc} @ Rücksprung + +.end diff --git a/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/swi.S b/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/swi.S new file mode 100644 index 0000000..09d5cc4 --- /dev/null +++ b/Bachelor/Mikroprozessorsysteme2/mi2/Termin6/swi.S @@ -0,0 +1,34 @@ +@---------------------------------------------------------------------------- +@ File Name : swi.S +@ Object : SoftwareInterruptHandler +@ +@ 1.0 27/10/02 GR : Creation +@ +@---------------------------------------------------------------------------- + + + .global SWIHandler + .text +SWIHandler: + + ldr sp, STACK @ den Wert von STACK (0x78c) auf sp kopieren + stmfd sp!, {lr} @ retten der Rücksprungadresse + ldr ip,[r14, #-4] @ hole "swi X" Aufruf in ip (lr steht auf Aufruf nach swi Befehl im aufrufenden Programm) + bic ip, ip, #0xff000000 @ maskiere X aus und speichere in ip + mov ip, ip, lsl #2 @ X ist in ip, X * 4 (entspricht lsl #2) ist Offset des swi + ldr lr, =SWIJumpTable @ Lade Adresse von SWIJumpTable in lr + ldr ip, [lr, ip] @ Addiere ip (Offset des SWI) zu Adresse SWIJumpTable und speichere in ip + mov lr, pc @ Speichere pc in lr für Rücksprung + mov pc, ip @ Lade ip nach pc, entspricht Sprung in jeweilige SWI-Routine + ldmfd sp!, {pc}^ @ Rücksprung +STACK: + .word 0x78c + +SWIJumpTable: + .word init_ser + .word putchar + .word getchar +.end + + + |
