реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Динамическое создание/удаление задач
simark1979
сообщение May 8 2018, 06:01
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 14-03-09
Из: Краснодарский край
Пользователь №: 46 094



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

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

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


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

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

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


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

Сообщение отредактировал simark1979 - May 8 2018, 07:38
Go to the top of the page
 
+Quote Post
Kabdim
сообщение May 8 2018, 07:45
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842



1. Хендл == указатель. Если кратко и упрощая. Можно ли по указателю сказать что там мусор или что-то стоящее?
2. Из прерываний более простые вещи-то не стоит делать.
3. Делать так не стоит. Сделайте мютексы которые будут заняты когда задача не нужна. И будут ваши задачи ставится на паузу.
4. Но если памяти совсем в обрез, и использование потоков подходит под такой сценарий, то порой таким приходится заниматься.
Go to the top of the page
 
+Quote Post
simark1979
сообщение May 8 2018, 08:09
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 14-03-09
Из: Краснодарский край
Пользователь №: 46 094



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



Вариант с приостановой для меня не совсем пригоден и дело не в отсучтвии памяти.
Дело в том, что некоторые задачи мне нужно запускать именно заново.
Некоторые потоки такие
{
Включить вывод
Пауза 10
Выключить вывод
Пауза 20
}
А работа потока должна начинаться всегда с включения вывода
Go to the top of the page
 
+Quote Post
Kabdim
сообщение May 8 2018, 10:55
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842



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

Повспоминал фриртос по доке, удивился, похоже там действительно нет возможности перезапустить задачу. Значит действительно придется городить удаление и запуск. Лучше это делать в отдельной задаче конечно же.
Go to the top of the page
 
+Quote Post
vadon
сообщение May 8 2018, 19:16
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 97
Регистрация: 27-07-10
Из: харьков
Пользователь №: 58 632



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


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

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


с любого места программы сигналите семафору и все.
Go to the top of the page
 
+Quote Post
juvf
сообщение May 14 2018, 09:44
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



Цитата(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; //добавляем сброс указаетля
     }
}
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th April 2024 - 23:38
Рейтинг@Mail.ru


Страница сгенерированна за 0.04103 секунд с 7
ELECTRONIX ©2004-2016