102
КОМПОНЕНТЫ И ТЕХНОЛОГИИ •
№ 5 '2011
компоненты
микроконтроллеры
/*-----------------------------------------------------------*/
/* Функция, реализующая задачу */
void vTask( void *pvParameters )
{
volatile long ul;
volatile TaskParam *pxTaskParam;
/* Преобразование типа void* к типу TaskParam* */
pxTaskParam = (TaskParam *) pvParameters;
for( ;; )
{
/*
Вывести на экран строку,
переданную в качестве
параметра при создании задачи */
puts( (const char*)pxTaskParam->string );
/* Задержка на некоторый период Т2*/
for( ul = 0; ul < pxTaskParam->period; ul++ )
{
}
/* Принудительный вызов планировщика.
Другой экземпляр
задачи получит управление
и
будет выполняться, пока не вызовет taskYIELD()
или блокирующую API-функцию */
taskYIELD();
}
vTaskDelete( NULL );
}
то процессорное время теперь будут полу-
чать оба экземпляра задачи. Результат вы-
полнения программы не будет отличаться
от приведенного на рис. 6 (см. КиТ № 4’2011,
стр. 98). Но разделение процессорного вре-
мени между задачами будет происходить
иначе (рис. 7).
На рис. 7 видно, что теперь Задача 1, как
только начала выполняться, захватывает
процессор на длительное время, до тех пор
пока в явном виде не вызовет планировщик
API-функцией
taskYIELD() (момент вре-
мени N). После вызова планировщика он
передает управление Задаче 2, которая тоже
удерживает процессор в своем распоряжении
до вызова
taskYIELD() (момент времени M).
Планировщик теперь не вызывается каждый
квант времени, а «ждет», когда его вызовет
одна из задач.
Достарыңызбен бөлісу: