simark1979 0 8 мая, 2018 Опубликовано 8 мая, 2018 (изменено) · Жалоба Всем здравствуйте) Суть вопроса. Есть некие потоки которые должны создаваться или удаляться в зависимости от от текущих настроек системы. Функция, которая должна делать переконфигурацию запущенных задач при сохранении настроек (может вызываться из прерывания кнопки при сохранении настроек) В этой связи возникло два вопроса, которые я не могу понять. 1. Возможно ли без бубнов узнать по её хэндлу создана ли задача в планировщике и нет? или запоминать в static переменных 2 . Возможно ли создавать/удалять задачи из прерываний или лучше из прерывания нужно семафорить спец задаче, которая этим и займется? Хотелось бы сделать функцию типа такой (которую можно вызывать из прерываний): убиваем задача_1 (если она существует) убиваем задача_2 (если она существует) убиваем задача_3 (если она существует) убиваем задача_4 (если она существует) убиваем задача_5 (если она существует) switch (настройка) { case 1: { создать задача_2; создать задача_3; } case 2: { создать задача_3; } case 3: { создать задача_1; создать задача_2; создать задача_5; } ................... ................... } И вопрос общего характера, стоит ли так делать? или есть другие идеи? :rolleyes: Изменено 8 мая, 2018 пользователем simark1979 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kabdim 0 8 мая, 2018 Опубликовано 8 мая, 2018 · Жалоба 1. Хендл == указатель. Если кратко и упрощая. Можно ли по указателю сказать что там мусор или что-то стоящее? 2. Из прерываний более простые вещи-то не стоит делать. 3. Делать так не стоит. Сделайте мютексы которые будут заняты когда задача не нужна. И будут ваши задачи ставится на паузу. 4. Но если памяти совсем в обрез, и использование потоков подходит под такой сценарий, то порой таким приходится заниматься. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
simark1979 0 8 мая, 2018 Опубликовано 8 мая, 2018 · Жалоба 1. Хендл == указатель. Если кратко и упрощая. Можно ли по указателю сказать что там мусор или что-то стоящее? 2. Из прерываний более простые вещи-то не стоит делать. 3. Делать так не стоит. Сделайте мютексы которые будут заняты когда задача не нужна. И будут ваши задачи ставится на паузу. 4. Но если памяти совсем в обрез, и использование потоков подходит под такой сценарий, то порой таким приходится заниматься. Вариант с приостановой для меня не совсем пригоден и дело не в отсучтвии памяти. Дело в том, что некоторые задачи мне нужно запускать именно заново. Некоторые потоки такие { Включить вывод Пауза 10 Выключить вывод Пауза 20 } А работа потока должна начинаться всегда с включения вывода Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kabdim 0 8 мая, 2018 Опубликовано 8 мая, 2018 · Жалоба Так вам abort задачи нужен? Повспоминал фриртос по доке, удивился, похоже там действительно нет возможности перезапустить задачу. Значит действительно придется городить удаление и запуск. Лучше это делать в отдельной задаче конечно же. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vadon 0 8 мая, 2018 Опубликовано 8 мая, 2018 · Жалоба Вариант с приостановой для меня не совсем пригоден и дело не в отсучтвии памяти. Дело в том, что некоторые задачи мне нужно запускать именно заново. Некоторые потоки такие { Включить вывод Пауза 10 Выключить вывод Пауза 20 } А работа потока должна начинаться всегда с включения вывода Это делается так: TaskA { for(;;) //вечный цикл { ждем семафора Включить вывод Пауза 10 Выключить вывод Пауза 20 } } с любого места программы сигналите семафору и все. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
juvf 17 14 мая, 2018 Опубликовано 14 мая, 2018 · Жалоба В этой связи возникло два вопроса, которые я не могу понять. 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; //добавляем сброс указаетля } } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться