while ((ATDSTAT 0x8000) == 0) {
/* проверить окончание преобразования по*/
/*состоянию флага SCF */
;
}
/* сохранить результаты ATD-преобразования*/
/* в глобальном массиве char */
sens[0] = ADR7H; /*крайний левый датчик */
sens[1] = ADR6H; /*средний левый датчик */
sens[2] = ADR5H; /*центральный датчик */
sens[3] = ADR4H; /*средний правый датчик */
sens[4] = ADR3H; /*крайний правый датчик */
sens[5] = ADR2H; /*Датчик Холла */
code_section = 2; /*update code_section variable */
break;
case 2:
/*анализ информации датчиков для решения о повороте. Примечание: пороги для*/
/*датчика Холла(hes_threshold) и для ИК-датчиков (opto_threshold)являются*/
/* глобальными переменными и определены экспериментально*/
if (sens[5] hes_threshold) { /*сигнал с датчика Холла, объезд*/
pwm_motors(back_up); /* робот дает задний ход*/
/*действия, следующие после того */
/* как робот отъехал назад */
if (sens[0] opto_threshold) pwm_motors(right_turn);
else pwm_motors(left_turn);
for (i=0; i0xFFFF; i++) { /*задержка перед вращением двигателя */
for(j=0; j15; j++) {
;
}
}
}
/*если обнаружен тупик - задний ход*/
else if ((sens[2]opto_threshold) (sens[0]opto_threshold) (sens[4]opto_threshold)) {
pwm_motors(back_up);
}
/*если стенки спереди и слева, */
/*поворот робота направо */
else if((sens[0]opto_threshold) (sens[2]opto_threshold)) {
pwm_motors(right_turn);
}
/*если стенки спереди и справа, */
/*поворот робота налево */
else if((sens[2]opto_threshold) (sens[4]opto_threshold)) {
pwm_motors(left_turn);
}
/*если стенка перед средним правым */
/* датчиком, то полуповорот направо */
else if (sens[1] opto_threshold) {
pwm_motors(half_right);
}
/*если стенка перед средним левым */
/* датчиком, то полуповорот налево */
else if (sens[3]opto_threshold) {
pwm_motors(half_left);
}
/*если сигналов от датчиков нет */
/*продолжить движение вперед */
else {
pwm_motors(forward);
}
code_section = 0; /* изменить переменную code_section */
break;
}/*конец switch*/
return code_section;
}
Когда задача, связанная с функцией process_turn
, переходит из состояния готовности в активное состояние, ОСРВ вызывает функцию с параметром 0. Функция process_turn
затем выполняется до первой отметки прерывания в коде. Достигнув этой отметки, функция возвращает управление ОСРВ, которая модифицирует TCB, связанный с процессом и продолжает выполнение второй части кода, когда задача в очередной раз переходит в активное состояние. Затем задача снова возвращается в состояние готовности и ждет, когда ОСРВ выделит ей процессорное время. Повторим снова, что причина, по которой мы делим код на логические части, состоит в том, чтобы позволить задаче работать до завершения определенной части и затем позволить другой задаче выполнить часть связанного с ней кода, и т.д. Это дает возможность выполнять несколько появившихся задач практически одновременно, хотя в любой момент времени процессор выполняет только одну задачу.