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



Pdf көрінісі
бет31/129
Дата28.09.2023
өлшемі4.1 Mb.
#478975
1   ...   27   28   29   30   31   32   33   34   ...   129
Kurniz

Андрей Курниц
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 );
}
/*-----------------------------------------------------------*/


Достарыңызбен бөлісу:
1   ...   27   28   29   30   31   32   33   34   ...   129




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

    Басты бет