Андрей Курниц
kurnits@stim.by
Динамическое
изменение приоритета
При создании задачи ей назначается опре-
деленный приоритет. Однако во FreeRTOS
есть возможность динамически изменять
приоритет уже созданной задачи, даже после
запуска планировщика. Для динамического
изменения приоритета задачи служит API-
функция vTaskPrioritySet(). Ее прототип:
void vTaskPrioritySet( xTaskHandle pxTask, unsigned portBASE_
TYPE uxNewPriority );
Назначение параметров:
1. pxTask — дескриптор (handle) задачи,
приоритет которой необходимо изменить.
Дескриптор задачи может быть получен при
создании экземпляра задачи API-функцией
xTaskCreate() (параметр pxCreatedTask [1,
№ 3]). Если необходимо изменить приори-
тет задачи, которая вызывает API-функцию
vTaskPrioritySet(), то в качестве параметра
pxTask следует задать NULL.
2. uxNewPriority — новое значение при-
оритета, который будет присвоен за-
даче. При задании приоритета больше
(configMAX_PRIORITIES — 1) приоритет
будет установлен равным (configMAX_
PRIORITIES — 1).
Прежде чем изменить приоритет какой-либо
задачи, может оказаться полезной возмож-
ность предварительно получить значение ее
приоритета. API-функция uxTaskPriorityGet()
позволяет это сделать. Ее прототип:
unsigned portBASE_TYPE uxTaskPriorityGet( xTaskHandle pxTask );
Назначение параметров и возвращаемое
значение:
1. pxTask — дескриптор задачи, приоритет ко-
торой необходимо получить. Если необхо-
димо получить приоритет задачи, которая
вызывает API-функцию uxTaskPriorityGet(),
то в качестве параметра pxTask следует за-
дать NULL.
2. Возвращаемое значение — непосредствен-
но значение приоритета.
Наглядно продемонстрировать исполь-
зование API-функций vTaskPrioritySet()
и uxTaskPriorityGet() позволяет учебная про-
грамма № 1:
#include
#include
#include
#include “FreeRTOS.h”
#include “task.h”
/* Прототипы функций, которые реализуют задачи. */
void vTask1( void *pvParameters );
void vTask2( void *pvParameters );
/* Глобальная переменная для хранения приоритета Задачи 2 */
xTaskHandle xTask2Handle;
/*-----------------------------------------------------------*/
int main( void )
{
/* Создать Задачу 1, присвоив ей приоритет 2.
Передача параметра в задачу, как и получение дескриптора
задачи, не используется */
xTaskCreate( vTask1, “Task 1”, 1000, NULL, 2, NULL );
/* Создать Задачу 2 с приоритетом = 1, меньшим,
чем у Задачи 1. Передача параметра не используется.
Получить дескриптор создаваемой задачи в переменную
xTask2Handle */
xTaskCreate( vTask2, “Task 2”, 1000, NULL, 1, &xTask2Handle );
/* Запустить планировщик. Задачи начнут выполняться.
Причем первой будет выполнена Задача 1 */
vTaskStartScheduler();
return 0;
}
/*-----------------------------------------------------------*/
/* Функция Задачи 1 */
void vTask1( void *pvParameters )
{
unsigned portBASE_TYPE uxPriority;
/* Получить приоритет Задачи 1. Он равен 2 и не изменяется
на протяжении всего времени
работы учебной программы № 1 */
uxPriority = uxTaskPriorityGet( NULL );
for( ;; )
{
/* Сигнализировать о выполнении Задачи 1 */
puts(“Task1 is running” );
/* Сделать приоритет Задачи 2 на единицу больше
приоритета Задачи 1 (равным 3).
Получить доступ к Задаче 2 из тела Задачи 1 позволяет
дескриптор Задачи 2, который сохранен в глобальной
переменной xTask2Handle*/
puts( “To raise the Task2 priority” );
vTaskPrioritySet( xTask2Handle, ( uxPriority + 1 ) );
/* Теперь приоритет Задачи 2 выше. Задача 1
продолжит свое выполнениение лишь тогда,
когда приоритет Задачи 1 будет уменьшен. */
}
vTaskDelete( NULL );
}
/*-----------------------------------------------------------*/
/* Функция Задачи 2 */
void vTask2( void *pvParameters )
{
unsigned portBASE_TYPE uxPriority;
/* Получить приоритет Задачи 2. Так как после старта
планировщика Задача 1 имеет более высокий приоритет,
то если Задача 2 получает управление, значит, ее приоритет
был повышен до 3 */
uxPriority = uxTaskPriorityGet( NULL );
for( ;; )
{
/* Сигнализировать о выполнении Задачи 2 */
puts( “Task2 is running” );
/* Задача 2 понижает свой приоритет на 2 единицы
(становится равен 1). Таким образом, он становится ниже
приоритета Задачи 1, и Задача 1 получает управление */
puts( “To lower the Task2 priority” );
vTaskPrioritySet( NULL, ( uxPriority - 2 ) );
}
vTaskDelete( NULL );
}
/*-----------------------------------------------------------*/
Достарыңызбен бөлісу: |