Сначала вызывается удаление всех тредов:
Код
struct s_netapp *netapp = netapp_root;
netapp_root = NULL;
while(netapp != NULL)
{
struct s_netapp *current = netapp;
netapp = netapp->next;
vTaskDelete(current->handle);
vPortFree(current);
current = NULL;
}
netapp_root = NULL;
while(netapp != NULL)
{
struct s_netapp *current = netapp;
netapp = netapp->next;
vTaskDelete(current->handle);
vPortFree(current);
current = NULL;
}
Вроде всё проходит ОК.
Затем выход из треда с приличной задержкой чтобы дать возможность выполниться айдлу в котором происходит освобождение памяти. Сам тред в котором запущено удаление так же имеет приоритет айдла.
Затем удаление семафоров:
Код
struct s_semaphr *semphr = semaphr_root;
semaphr_root = NULL;
while(semphr != NULL)
{
printf("semaphore delete... %lu\n", semphr->sema);
struct s_semaphr *current = semphr;
semphr = semphr->next;
vSemaphoreDelete(current->sema);
vPortFree(current);
current = NULL;
printf("ok, semphr = %lu\n", semphr);
}
semaphr_root = NULL;
while(semphr != NULL)
{
printf("semaphore delete... %lu\n", semphr->sema);
struct s_semaphr *current = semphr;
semphr = semphr->next;
vSemaphoreDelete(current->sema);
vPortFree(current);
current = NULL;
printf("ok, semphr = %lu\n", semphr);
}
И тут всё виснет после удаления 6 штук:
Цитата
semaphore delete... 268462400
ok, semphr = 268462640
semaphore delete... 268462544
ok, semphr = 268462784
semaphore delete... 268462664
ok, semphr = 268465112
semaphore delete... 268464992
ok, semphr = 268469624
semaphore delete... 268469504
ok, semphr = 268469960
semaphore delete... 268469840
ok, semphr = 268462640
semaphore delete... 268462544
ok, semphr = 268462784
semaphore delete... 268462664
ok, semphr = 268465112
semaphore delete... 268464992
ok, semphr = 268469624
semaphore delete... 268469504
ok, semphr = 268469960
semaphore delete... 268469840
Крайний семафор был создан в задаче, отвечающей за обработку принятого EMAC пакета и передачу его дальше.
На этом всё просто зависает. Временное отсутствие рабочего отладчика затрудняет дебаг.
Пробовал останавливать все задачи перед удалением семафоров (vTaskSuspendAll()), отключать все прерывания, увеличивать приоритет треда, выходить из треда после удаления каждого семафора (т.е. давать айдлу возможность освободить память) - не помогает, так же всё виснет после удаления 6 семафоров.
Подскажите как попробовать ещё или как иначе лучше решить задачу с перезапуском lwip?