Arkitektur og operativsystemer (dArkOS)


Besvarelse af ugeopgave, uge 48

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

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


Der er udformet to booleske funktioner til at aflæse tilstanden af trykfølere på port 1 og 3:
int16 Touch1( void ) { return(Port1Raw() < 500); } int16 Touch3( void ) { return( Port3Raw() < 500); }
Det er lykkedes at lave et sekventielt program, som både afvikler Program 1 og 2 samt holder øje med Prgm:
void _start(void) { Running = 0; ProgramNumber = 1; lcd_show_icon(LCD_STANDING); lcd_show_digit(ProgramNumber); /* 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; IRQ1_Interrupt_Handler = OnOffBreak; ISCR = 3; IER = 3; while (1) { PortA(Float); PortB(Float); PortC(Float); while ( ! Running ) { while ( Prgm ) { ProgramNumber = 3-ProgramNumber; } BusyPauseMS(500); lcd_show_digit(ProgramNumber); } } while ( Running ) { switch ( ProgramNumber ) { case 1: /* Program 1 */ PortA(OnPos); PortC(OnPos); break; case 2: /* Program 2 */ if ( Touch1() ) PortA(Float); else PortA(OnPos); if ( Touch3() ) PortC(Float); else PortC(OnPos); break; default: break; } } } }

Der er udformet et multiprogram med to processer:

#include "RCX_String.h" #include "RCX_Control.h" #include "H8.h" #include "Time.h" #include "LCD.h" #include "Battery.h" #include "Buttons.h" #include "InputPorts.h" #include "RCX_Interrupts.h" #include "OutputPorts.h" #include "RoundRobinScheduler.h" #define forever while (1) static volatile byte Running; static byte ProgramNumber; int16 Touch1( void ) { return( Port1Raw() < 800); } int16 Touch3( void ) { return( Port3Raw() < 800); } void ResetProcess( void ) { while ( ! OnOff ) ; SchedulerClose(); RCX_Reset(); } void Process1() { forever { while( Prgm ) { switch ( ProgramNumber ) { case 1: ProgramNumber = 2; break; case 2: ProgramNumber = 1; break; } lcd_show_digit(ProgramNumber); BusyPauseMS(500); } } } void Process2() { forever { while ( ! Running ); while ( Running ) { switch ( ProgramNumber ) { case 1: /* Program 1 */ PortA(OnNeg); PortC(OnNeg); break; case 2: /* Program 2 */ if ( Touch1() ) PortA(Float); else PortA(OnNeg); if ( Touch3() ) PortC(Float); else PortC(OnNeg); break; default: break; } } PortA(Float); PortB(Float); PortC(Float); } } void OnOffProcess() { forever { while ( Run ) { switch ( Running ){ case 0: Running = 1; lcd_show_icon(LCD_WALKING); break; case 1: Running = 0; lcd_show_icon(LCD_STANDING); break; } BusyPauseMS(500); } } } void _start(void) { Running = 0; ProgramNumber = 1; lcd_show_icon(LCD_STANDING); lcd_show_digit(ProgramNumber); SchedulerInit(); StartProcess( ResetProcess); StartProcess( Process1); StartProcess( Process2); StartProcess( OnOffProcess); forever { lcd_show_int16(Current); } }
Beskriv her hvilken afprøvning I har foretaget. Beskriv, hvordan det sikres, at knappen OnOff altid kan bruges til at slukke for RCX. Beskriv også hvordan det sikres, at Prgm altid har virkning i multiprogrammet.
Vores afprøvning er ganske banal, vi har simpelt hen trykket på alle knapperne lidt på skift og set at den opfører sig som specifiseret. At onOff altid kan bruges er sikret ved at det er lavet som en process og scheduleren vil så sørge for at der bliver tid til processen. Og det er samme måde vi har lavet Prgm så derfor kan vi også være sikre på den.