уничтожение задач
Задача может уничтожить саму себя или
любую другую задачу в программе с помо-
щью API-функции vTaskDelete(). Удаленная
задача физически не существует и, следова-
тельно, никогда не выполняется. Нет воз-
можности восстановить удаленную задачу,
единственный выход — создать новую.
Ядро FreeRTOS устроено так, что внутрен-
няя реализация задачи Бездействие отвечает
за освобождение памяти, которую использо-
вала удаленная задача. К программам, в кото-
рых происходит создание и удаление задач,
предъявляется следующее требование. Если
разработчик использует функцию-ловушку
задачи Бездействие [1, № 4], то время выпол-
нения этой функции должно быть меньше
времени выполнения задачи Бездействие
(то есть времени, пока нет ни одной задачи,
готовой к выполнению).
Следует отметить, что при уничтожении
задачи ядро освобождает лишь системную,
не доступную прикладному программисту
память, связанную с задачей. Вся память
и другие ресурсы, которые программист ис-
пользовал в задаче, также явно должны быть
освобождены.
Прототип API-функции vTaskDelete():
void vTaskDelete( xTaskHandle pxTaskToDelete );
Единственный параметр pxTaskToDelete —
это дескриптор задачи, которую необходимо
уничтожить. Если необходимо уничтожить
задачу, которая вызывает API-функцию
vTaskDelete(), то в качестве параметра
pxTaskToDelete следует задать NULL.
Учебная программа № 2 демонстрирует ди-
намическое создание и уничтожение задач:
#include
#include
#include
#include “FreeRTOS.h”
#include “task.h”
/* Прототипы функций, которые реализуют задачи. */
void vTask1( void *pvParameters );
void vTask2( void *pvParameters );
/*-----------------------------------------------------------*/
int main( void )
{
/* Статическое создание Задачи 1 с приоритетом 1 */
xTaskCreate( vTask1, “Task 1”, 1000, NULL, 1, NULL );
/* Запустить планировщик. Задача 1 начнет выполняться */
vTaskStartScheduler();
return 0;
}
/*-----------------------------------------------------------*/
/* Функция Задачи 1 */
void vTask1( void *pvParameters )
{
for( ;; )
{
/* Сигнализировать о выполнении Задачи 1 */
puts(“Task1 is running” );
/* Динамически (после старта планировщика) создать
Задачу 2 с приоритетом 2.
Она сразу же получит управление */
xTaskCreate( vTask2, “Task 2”, 1000, NULL, 2, NULL );
/* Пока выполняется Задача 2 с более высоким
приоритетом, Задача 1 не получает процессорного
времени. Когда Задача 2 уничтожила сама себя,
управление снова получает Задача 1 и переходит
в блокированное состояние на 100 мс. Так что в системе
не остается задач, готовых к выполнению, и выполняется
задача Бездействие */
vTaskDelay( 100 );
}
vTaskDelete( NULL );
}
/*-----------------------------------------------------------*/
/* Функция Задачи 2 */
void vTask2( void *pvParameters )
{
/* Задача 2 не делает ничего, кроме сигнализации о своем
выполнении, и сама себя уничтожает. Тело функции
не содержит бесконечного цикла, так как в нем нет
необходимости. Тело функции Задачи 2 выполнится 1 раз,
после чего задача будет уничтожена. */
puts( “Task2 is running and about to delete itself” );
vTaskDelete( NULL );
}
/*-----------------------------------------------------------*/
Перед запуском планировщика создает-
ся Задача 1 с приоритетом 1. В теле Задачи 1
динамически создается Задача 2 с более вы-
соким приоритетом. Задача 2 сразу же после
создания получает управление, сигнализиру-
ет о своем выполнении и сама себя уничто-
жает. После чего снова управление получает
Задача 1.
Следует обратить внимание на тело функ-
ции Задачи 2. В нем отсутствует бесконечный
цикл, что вполне допустимо, так как функ-
ция завершается вызовом API-функции уни-
чтожения этой задачи. Задача 2 в отличие
от Задачи 1 является спорадической [5].
Достарыңызбен бөлісу: |