Компоненты и технологии • №2 '2011 компоненты


taskYIELD(). 4. Вызов taskYIELD()



Pdf көрінісі
бет42/129
Дата28.09.2023
өлшемі4.1 Mb.
#478975
1   ...   38   39   40   41   42   43   44   45   ...   129
Kurniz

taskYIELD().
4. Вызов taskYIELD() внутри циклов может 
замедлить выполнение программы.
Для выбора режима кооперативной много-
задачности необходимо задать значение ма-
кроопределения configUSE_PREEMPTION 
в файле FreeRTOSConfig.h равным 0:
#define configUSE_PREEMPTION 
0
Значение configUSE_PREEMPTION, рав-
ное 1, дает предписание ядру FreeRTOS ра-
ботать в режиме вытесняющей многозадач-
ности.
Если включить режим кооперативной 
многозадачности в учебной программе № 1 
[1, № 4] так, как показано выше, выполнить 
сборку проекта и запустить на выполнение 
полученный исполнимый файл rtosdemo.exe,
то можно наблюдать ситуацию, когда все вре-
мя выполняется один экземпляр задачи, а вто-
рой никогда не получает управления (рис. 8, 
см. КиТ № 4`2011, стр. 98).
Это происходит из-за того, что плани-
ровщик никогда не получает управления 
и не может запустить на выполнение другую 
задачу. Теперь обязанность запуска плани-
ровщика ложится на программиста.
Если добавить в функцию, реализующую 
задачу, явный вызов планировщика API-
функцией taskYIELD():


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). 
Планировщик теперь не вызывается каждый 
квант времени, а «ждет», когда его вызовет 
одна из задач.


Достарыңызбен бөлісу:
1   ...   38   39   40   41   42   43   44   45   ...   129




©dereksiz.org 2024
әкімшілігінің қараңыз

    Басты бет