Arkitektur og operativsystemer (dArkOS)


Besvarelse af ugeopgave, uge 47

Per Abrahamsen, 20001358, 3,
Søren S Munk, 20001614, 3,
Mads Peter Lindberg, 20001990, 3.

www.daimi.au.dk/~smunk/dArkOS/uge46


Programmet RunInt.c er oversat og bragt til at køre på en RCX.

Ved almindeligt kald af RunInt ser stakken således ud: r5,r4,r3,r2,r1,r6 Ved aktivering via afbrydelser ser stakken således ud: r5,r4,r3,r2,r1,r6,CCR,CCR*,PC (Upper byte),PC (Lower byte) .

Forklar om det er når Run trykkes ind eller slippes, at afbrydelsen får virkning.
Først gang der skal trykkes på RUN knappen testes der på om kanppen er trykket ned.
De følgende gange er der sat en interupt handler til RUN-knappen som aktiveres når knappen trykkes ned.

Programmet er udvidet så knappen OnOff også kan give anledning til afbrydelser. Programmet ser således ud:

#include "RCX_String.h" #include "RCX_Control.h" #include "H8.h" #include "Time.h" #include "LCD.h" #include "Battery.h" #include "Buttons.h" #include "RCX_Interrupts.h" /* Interrupt handler for Run button */ static int16 Count; void RunInt (void) { asm("push r0 push r1 push r2 push r3 push r4 push r5 "); Count = Count + 2; asm("pop r5 pop r4 pop r3 pop r2 pop r1 pop r0 "); } void OnOffBreak (void) { lcd_show_icon(LCD_STANDING); Count = Count + 4; } void _start(void) { lcd_show_int16(BatteryLevel()); lcd_show_icon(LCD_STANDING); while ( ! Run ); while ( Run ); lcd_show_icon(LCD_WALKING); Count = 0; lcd_show_int16(Count); BusyPauseMS(1000); RunInt(); /* Make RunInt the interrupt handler for the Run button (IRQ0) */ /* Generate interrupt by the falling edge of Run button (IRQ0) */ /* Enable Run button interrupts (IRQ0 interrupts) */ IRQ0_Interrupt_Handler = RunInt; ISCR = 3; IER = 3; IRQ1_Interrupt_Handler = OnOffBreak; while ( ! View ){ lcd_show_int16(Count); if ( Count > 10 ){ Count = 0; } } RCX_Reset(); }

Der er sat en forsinkelse ind i OnOffInt3 sekunder. Forklar hvilken virkning dette har på udskrivningen i ruden og på registrering af afbrydelser fra Run
OnOff har en forsinkelse som påvirker alle andre interupts. Altså er der er en 3 sekunders forsinkelse på Run efter et tryk på OnOff.
.

OnOffInt kalder RCX_Reset og RunInt styrer visning af LEGO mand og tilstand af global variabel Running. Dette giver følgende program:

#include "RCX_String.h" #include "RCX_Control.h" #include "H8.h" #include "Time.h" #include "LCD.h" #include "Battery.h" #include "Buttons.h" #include "RCX_Interrupts.h" #include "OutputPorts.h" /* Interrupt handler for Run button */ static int16 Count; static int16 Running; void RunInt (void) { asm("push r0 push r1 push r2 push r3 push r4 push r5 "); Count = Count + 2; asm("pop r5 pop r4 pop r3 pop r2 pop r1 pop r0 "); if (Running) { lcd_show_icon(LCD_STANDING); Running = 0; } else { lcd_show_icon(LCD_WALKING); Running = 1; } } void OnOffBreak (void) { RCX_Reset(); } void _start(void) { Running = 0; lcd_show_int16(BatteryLevel()); lcd_show_icon(LCD_STANDING); while ( ! Run ); while ( Run ); lcd_show_icon(LCD_WALKING); Count = 0; lcd_show_int16(Count); BusyPauseMS(1000); RunInt(); /* Make RunInt the interrupt handler for the Run button (IRQ0) */ /* Generate interrupt by the falling edge of Run button (IRQ0) */ /* Enable Run button interrupts (IRQ0 interrupts) */ IRQ0_Interrupt_Handler = RunInt; ISCR = 3; IER = 3; IRQ1_Interrupt_Handler = OnOffBreak; while ( ! View ){ lcd_show_int16(Count); if ( Count > 10 ){ Count = 0; } if (Running) { PortA(OnPos); PortC(OnPos); } else { PortA(Float); PortC(Float); } } RCX_Reset(); }
Ja de styres jo ved at run ændre ved vores variabel Running, og i while-løkken tjekker vi på Running og hvis den er 1 så tænder vi for portene, og hvis Running er 0 så slukker vi dem. .