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



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

уничтожение задач
Задача может уничтожить саму себя или 
любую другую задачу в программе с помо-
щью 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].

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




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

    Басты бет