Easyelectronics.ru

Электроника для всех
Текущее время: 20 июн 2018, 10:23

Часовой пояс: UTC + 5 часов



    • JLCPCB - Платы прототипов всего за 2$ c бесплатной доставкой (при первом заказе)
    • 10 PCBs за $2 для 2 слоев, $15 для 4 слойной, $74 для 6 слойной платы.
    • Крупнейший китайский производитель прототипных плат. 290000+ клиентов & 8000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин радиодеталей.

Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
 Заголовок сообщения: не удаляет задачи
СообщениеДобавлено: 21 фев 2018, 19:14 
Только пришел

Зарегистрирован: 23 окт 2013, 17:53
Сообщения: 8
Откуда: Kiev
Добрый день!
Создается поток:
Код:
osThreadDef(SearchDs18b20, Task_SearchDs18b20, osPriorityRealtime, 0, 128);
H_Ds18b20 = osThreadCreate(osThread(SearchDs18b20), NULL);

он выполняется и в конце в функции вызываются строки:
vTaskDelete(H_Ds18b20);
Но он не удаляется. Проверял вызывая uxTaskGetNumberOfTasks();
С каждым новым запуском Task_SearchDs18b20 количество запущеных потоков растет....
Код функции Task_SearchDs18b20 :
Код:
void Task_SearchDs18b20(void const * argument)
{
   uint8_t   Ds18b20TryToFind=5;
   do
   {
      OneWire_Init(&OneWire,_DS18B20_GPIO ,_DS18B20_PIN);
      TempSensorCount = 0;   
      OneWireDevices = OneWire_First(&OneWire);
      while (OneWireDevices)
      {
         osDelay(500);
         TempSensorCount++;
         OneWire_GetFullROM(&OneWire, ds18b20[TempSensorCount-1].Address);
         OneWireDevices = OneWire_Next(&OneWire);
      }
                if(TempSensorCount>0){
                        break;
                }
      Ds18b20TryToFind--;
   }while(Ds18b20TryToFind>0);       
        vTaskDelete(NULL);

Пробовал так же перед вызовом vTaskDelete вызывать vQueueDelete


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: не удаляет задачи
СообщениеДобавлено: 21 фев 2018, 19:28 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 1822
Скажу сходу, не вдаваясь в подробности: если задача не удаляется, значит, у вас модель менеджера памяти не поддерживает удаления задач - обычный heap1.c. Выберите другой менеджер. Для этого просто заметите файл heap1.c на какой-нибудь типа heap2.c, heap4.c, heap.5c.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: не удаляет задачи
СообщениеДобавлено: 21 фев 2018, 20:06 
Только пришел

Зарегистрирован: 23 окт 2013, 17:53
Сообщения: 8
Откуда: Kiev
Посмотрел, используется heap4.c


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: не удаляет задачи
СообщениеДобавлено: 21 фев 2018, 20:22 
Заглядывает иногда

Зарегистрирован: 15 ноя 2015, 12:11
Сообщения: 99
A "OneWire_Next(&OneWire);" гарантированно "сходится"? А пустое тело процедуры потока с одним лишь vTaskDelete(NULL) тоже зомбиков плодит?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: не удаляет задачи
СообщениеДобавлено: 21 фев 2018, 21:01 
Только пришел

Зарегистрирован: 23 окт 2013, 17:53
Сообщения: 8
Откуда: Kiev
siarzhuk писал(а):
A "OneWire_Next(&OneWire);" гарантированно "сходится"? А пустое тело процедуры потока с одним лишь vTaskDelete(NULL) тоже зомбиков плодит?

В Task_SearchDs18b20 отсавил только vTaskDelete(NULL) и добавил osDelay(100); все равно не удаляется.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: не удаляет задачи
СообщениеДобавлено: 21 фев 2018, 21:50 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 23 ноя 2010, 20:11
Сообщения: 56
Откуда: Омск
Проверьте, получает ли системная задача IDLE управление.
В референсе на FreeRTOS говорится, что сборка памяти и окончательное освобождение ресурсов задачи проиходят именно в той самой функции. Пруф на алглийском
Проверить, получает ли функция управление можно, создав обработчик вызова vApplicationIdleHook() (примеры ищутся легко).
Так же можно в момент удаления потока делать паузу остальным нитям, чтобы диспетчер задач смог запустить IDLE задачу. (vTaskDelay или мьютексы для всех? Грубовато).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: не удаляет задачи
СообщениеДобавлено: 22 фев 2018, 09:00 
Старожил

Зарегистрирован: 16 ноя 2012, 07:47
Сообщения: 2621
Если честно, то задачка немного кривая, не нравится мне этот while c условием. У себя пару раз пытался так делать, но иногда работало криво. Попробуйте классически - while(1), а в нем уже весь ваш код с удалением задачи. Не помню с чем связано, но тело задачки не должно вылезать за границы while(1). Какая версия FreeRTOS, кстати?
К тому же, не совсем понятно, зачем каждый раз переинициализировать OneWire. Чуть причесанный код ниже, попробуйте его
Код:
static   void   TestRTOS( void *pvParameters )
{
   while(1)
   {
      uint8_t   Ds18b20TryToFind=5;
      do
      {
         OneWire_Init(&OneWire,_DS18B20_GPIO ,_DS18B20_PIN);
         TempSensorCount   = 0;   
         OneWireDevices   = OneWire_First(&OneWire);
         while (OneWireDevices)
         {
            osDelay(500);
            OneWire_GetFullROM(&OneWire, ds18b20[TempSensorCount++].Address);
            OneWireDevices = OneWire_Next(&OneWire);
         }
         if(TempSensorCount > 0)   break;
      }while(--Ds18b20TryToFind > 0);       
      vTaskDelete(NULL);
   }
}


UPD:
Аналогичный код, выдрал из работающего проекта:
Show Code


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: не удаляет задачи
СообщениеДобавлено: 22 фев 2018, 15:52 
Только пришел

Зарегистрирован: 23 окт 2013, 17:53
Сообщения: 8
Откуда: Kiev
Всем большое спасибо!
Как и предполагали системная задача IDLE не запускалась так как не хватало времени для нее. Здесь напартачил:
Код:
void StartDefaultTask(void const * argument)
{
  for(;;)
  {
            number=uxTaskGetNumberOfTasks();           
  }
}

изменил на:
Код:
void StartDefaultTask(void const * argument)
{
  for(;;)
  {
            number=uxTaskGetNumberOfTasks();   
           [b] osDelay(500);[/b]
  }
}

И все заработало(лишнии потоки перестали плодиться)
Только приступил к изучению FreeRTOS, поэтому куча граблей.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB