Jump to content

    

Динамическое создание/удаление задач

Всем здравствуйте)

 

Суть вопроса.

Есть некие потоки которые должны создаваться или удаляться в зависимости от от текущих настроек системы.

Функция, которая должна делать переконфигурацию запущенных задач при сохранении настроек (может вызываться из прерывания кнопки при сохранении настроек)

 

В этой связи возникло два вопроса, которые я не могу понять.

1. Возможно ли без бубнов узнать по её хэндлу создана ли задача в планировщике и нет? или запоминать в static переменных

2 . Возможно ли создавать/удалять задачи из прерываний или лучше из прерывания нужно семафорить спец задаче, которая этим и займется?

 

 

Хотелось бы сделать функцию типа такой (которую можно вызывать из прерываний):

 

убиваем задача_1  (если она существует)
убиваем задача_2  (если она существует)
убиваем задача_3  (если она существует)
убиваем задача_4  (если она существует)
убиваем задача_5  (если она существует)

switch (настройка)
{
  case 1:
     {
       создать    задача_2;
       создать    задача_3;
     }
  case 2:
     {
       создать    задача_3;
     }
  case 3:
     {
       создать    задача_1;
       создать    задача_2;
       создать    задача_5;
     }
...................
...................
}

 

И вопрос общего характера, стоит ли так делать? или есть другие идеи? :rolleyes:

Edited by simark1979

Share this post


Link to post
Share on other sites

1. Хендл == указатель. Если кратко и упрощая. Можно ли по указателю сказать что там мусор или что-то стоящее?

2. Из прерываний более простые вещи-то не стоит делать.

3. Делать так не стоит. Сделайте мютексы которые будут заняты когда задача не нужна. И будут ваши задачи ставится на паузу.

4. Но если памяти совсем в обрез, и использование потоков подходит под такой сценарий, то порой таким приходится заниматься.

Share this post


Link to post
Share on other sites
1. Хендл == указатель. Если кратко и упрощая. Можно ли по указателю сказать что там мусор или что-то стоящее?

2. Из прерываний более простые вещи-то не стоит делать.

3. Делать так не стоит. Сделайте мютексы которые будут заняты когда задача не нужна. И будут ваши задачи ставится на паузу.

4. Но если памяти совсем в обрез, и использование потоков подходит под такой сценарий, то порой таким приходится заниматься.

 

 

Вариант с приостановой для меня не совсем пригоден и дело не в отсучтвии памяти.

Дело в том, что некоторые задачи мне нужно запускать именно заново.

Некоторые потоки такие

{

Включить вывод

Пауза 10

Выключить вывод

Пауза 20

}

А работа потока должна начинаться всегда с включения вывода

Share this post


Link to post
Share on other sites

Так вам abort задачи нужен?

 

Повспоминал фриртос по доке, удивился, похоже там действительно нет возможности перезапустить задачу. Значит действительно придется городить удаление и запуск. Лучше это делать в отдельной задаче конечно же.

Share this post


Link to post
Share on other sites
Вариант с приостановой для меня не совсем пригоден и дело не в отсучтвии памяти.

Дело в том, что некоторые задачи мне нужно запускать именно заново.

Некоторые потоки такие

{

Включить вывод

Пауза 10

Выключить вывод

Пауза 20

}

А работа потока должна начинаться всегда с включения вывода

 

Это делается так:

 

TaskA
{
  for(;;) //вечный цикл
  {
      ждем семафора
      Включить вывод
      Пауза 10
      Выключить вывод
      Пауза 20
  }
}

 

с любого места программы сигналите семафору и все.

Share this post


Link to post
Share on other sites
В этой связи возникло два вопроса, которые я не могу понять.

1. Возможно ли без бубнов узнать по её хэндлу создана ли задача в планировщике и нет? или запоминать в static переменных

 

1. Хендл == указатель. Если кратко и упрощая. Можно ли по указателю сказать что там мусор или что-то стоящее?

 

xTaskHandle handleTask1 = 0;

 

...

if(handleTask1)

{

убиваем задачу

handleTask1 = 0;

}

Хотел написать пример, как это решить, заглянул в мануал, там тот же пример. Судя по описанию, указатель на задачу не сбрасывается в ноль... судя по объявлению функции vTaskDelete() - функция меняет значение указателя. Если не меняет в ноль, то дополняется одной строчкой

 

 

 void vOtherFunction( void )
{
     TaskHandle_t xHandle = NULL;

     // Create the task, storing the handle.
     xTaskCreate( vTaskCode, "NAME", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );

     // Use the handle to delete the task.
     if( xHandle != NULL )
     {
         vTaskDelete( xHandle );
         xHandle = NULL; //добавляем сброс указаетля
     }
}

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now