100
КОМПОНЕНТЫ И ТЕХНОЛОГИИ • № 9 '2011
компоненты
микроконтроллеры
void vApplicationIdleHook(void) {
/* Так как задача Бездействие не выполняет других действий,
то вызов vCoRoutineSchedule() размещен внутри бесконечного
цикла.*/
for (;;) {
vCoRoutineSchedule();
}
}
Результаты работы учебной программы
№ 1 приведены на рис. 2. На рис. 2 видно, что
сообщения на дисплей выводят обе сопро-
граммы, следовательно, каждая из них по-
лучает процессорное время. На рис. 3 пред-
ставлено разделение процессорного вре-
мени между сопрограммами.
Сопрограммы выполняются в режиме
кооперативной многозадачности, поэтому
текущая сопрограмма выполняется до тех
пор, пока не произойдет явное переключе-
ние на другую сопрограмму. На протяжении
времени 0…t1 будет выполняться только
Сопрограмма 1, а именно будет выполняться
продолжительный по времени пустой цикл
(рис. 3). Как только пустой цикл Сопрограммы
1 будет завершен, в момент времени t1 прои-
зойдет явное переключение на другую сопро-
грамму. В результате чего управление получит
Сопрограмма 2 на такой же продолжительный
промежуток времени — t1…t2.
Следует обратить внимание на обязатель-
ный вызов API-функции crDELAY(xHandle, 0),
благодаря которому происходит принуди-
тельное переключение на другую сопрограм-
му и, таким образом, реализуется принцип
кооперативной многозадачности.
Продемонстрировать важность «ручного»
переключения на другую сопрограмму можно,
если исключить из функции Сопрограммы 1
вызов API-функции crDELAY(). В таком слу-
чае результаты работы программы (рис. 4)
будут свидетельствовать о том, что процес-
сорное время получает только Сопрограмма
1. Причиной этому является тот факт, что
Сопрограмма 1 не выполняет принудительно-
го переключения на другую сопрограмму, что
является необходимым условием корректной
работы кооперативной многозадачной среды.
Достарыңызбен бөлісу: |