Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Динамическое создание/удаление задач
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > FreeRTOS
simark1979
Всем здравствуйте)

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

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


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

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

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


И вопрос общего характера, стоит ли так делать? или есть другие идеи? rolleyes.gif
Kabdim
1. Хендл == указатель. Если кратко и упрощая. Можно ли по указателю сказать что там мусор или что-то стоящее?
2. Из прерываний более простые вещи-то не стоит делать.
3. Делать так не стоит. Сделайте мютексы которые будут заняты когда задача не нужна. И будут ваши задачи ставится на паузу.
4. Но если памяти совсем в обрез, и использование потоков подходит под такой сценарий, то порой таким приходится заниматься.
simark1979
Цитата(Kabdim @ May 8 2018, 10:45) *
1. Хендл == указатель. Если кратко и упрощая. Можно ли по указателю сказать что там мусор или что-то стоящее?
2. Из прерываний более простые вещи-то не стоит делать.
3. Делать так не стоит. Сделайте мютексы которые будут заняты когда задача не нужна. И будут ваши задачи ставится на паузу.
4. Но если памяти совсем в обрез, и использование потоков подходит под такой сценарий, то порой таким приходится заниматься.



Вариант с приостановой для меня не совсем пригоден и дело не в отсучтвии памяти.
Дело в том, что некоторые задачи мне нужно запускать именно заново.
Некоторые потоки такие
{
Включить вывод
Пауза 10
Выключить вывод
Пауза 20
}
А работа потока должна начинаться всегда с включения вывода
Kabdim
Так вам abort задачи нужен?

Повспоминал фриртос по доке, удивился, похоже там действительно нет возможности перезапустить задачу. Значит действительно придется городить удаление и запуск. Лучше это делать в отдельной задаче конечно же.
vadon
Цитата
Вариант с приостановой для меня не совсем пригоден и дело не в отсучтвии памяти.
Дело в том, что некоторые задачи мне нужно запускать именно заново.
Некоторые потоки такие
{
Включить вывод
Пауза 10
Выключить вывод
Пауза 20
}
А работа потока должна начинаться всегда с включения вывода


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

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


с любого места программы сигналите семафору и все.
juvf
Цитата(simark1979 @ May 8 2018, 11:01) *
В этой связи возникло два вопроса, которые я не могу понять.
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; //добавляем сброс указаетля
     }
}
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.