Перейти к содержанию
    

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

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

 

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

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

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

 

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

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

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

 

 

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

 

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

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

 

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

Изменено пользователем simark1979

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

 

 

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

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

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

{

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

Пауза 10

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

Пауза 20

}

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

{

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

Пауза 10

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

Пауза 20

}

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

 

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

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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; //добавляем сброс указаетля
     }
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...