www.daimi.au.dk/~smunk/dArkOS/uge48
Det er lykkedes at lave et sekventielt program, som både afvikler Program 1 og 2 samt holder øje med Prgm:int16 Touch1( void ) { return(Port1Raw() < 500); } int16 Touch3( void ) { return( Port3Raw() < 500); }
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:
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.#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); } }