Читаем Встраиваемые системы. Проектирование приложений на микроконтроллерах семейства 68HC12/HCS12 с применением языка С полностью

  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, связанный с процессом и продолжает выполнение второй части кода, когда задача в очередной раз переходит в активное состояние. Затем задача снова возвращается в состояние готовности и ждет, когда ОСРВ выделит ей процессорное время. Повторим снова, что причина, по которой мы делим код на логические части, состоит в том, чтобы позволить задаче работать до завершения определенной части и затем позволить другой задаче выполнить часть связанного с ней кода, и т.д. Это дает возможность выполнять несколько появившихся задач практически одновременно, хотя в любой момент времени процессор выполняет только одну задачу.

Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже