void Posixino::timerThread() { while (true) { usleep(1000); for (int n = 0; n < 3; n++) { if (interruptCounter[n] < 0) continue; interruptCounter[n] += 1000; if (interruptCounter[n] < interruptTiming[n]) continue; interruptCounter[n] -= interruptTiming[n]; if (n == 0) { # ifdef TIMER0 TIMER0_COMPA_vect(); # endif } if (n == 1) { # ifdef TIMER1 TIMER1_COMPA_vect(); # endif } if (n == 2) { # ifdef TIMER2 TIMER2_COMPA_vect(); # endif } } // for interrupts } // forever } // timerThread()
void performTest(SchedulingStrategy strategy) { uint8_t strategyIndex = 0; lcd_clear(); // Change scheduling strategy switch (strategy) { case OS_SS_EVEN: strategyIndex = 0; lcd_writeProgString(PSTR("Even")); os_setSchedulingStrategy(OS_SS_EVEN); break; case OS_SS_RANDOM: strategyIndex = 4; lcd_writeProgString(PSTR("Random")); os_setSchedulingStrategy(OS_SS_RANDOM); break; case OS_SS_ROUND_ROBIN: strategyIndex = 1; lcd_writeProgString(PSTR("RoundRobin")); os_setSchedulingStrategy(OS_SS_ROUND_ROBIN); break; case OS_SS_INACTIVE_AGING: strategyIndex = 2; lcd_writeProgString(PSTR("InactiveAging")); os_setSchedulingStrategy(OS_SS_INACTIVE_AGING); break; case OS_SS_RUN_TO_COMPLETION: strategyIndex = 3; lcd_writeProgString(PSTR("RunToCompletion")); os_setSchedulingStrategy(OS_SS_RUN_TO_COMPLETION); break; default: break; } _delay_ms(2000); // Perform scheduling test. // Save the id of the running process and call the scheduler. i = 0; while(i < 32) { capture[i++] = 1; TIMER2_COMPA_vect(); } // Print captured schedule lcd_clear(); for (i = 0; i < 32; i++) { lcd_writeDec(capture[i]); _delay_ms(2 * DEFAULT_OUTPUT_DELAY); } // Check captured schedule if (strategyIndex < 4) { _delay_ms(2000); lcd_clear(); for (i = 0; i < 32; i++) { if (capture[i] != pgm_read_byte(&scheduling[strategyIndex][i])) { lcd_writeProgString(PSTR("Error at step ")); lcd_writeDec(i); while (1) {} } if (i == 31) { lcd_writeProgString(PSTR("OK")); } } } _delay_ms(2000); }