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

 
 
> Удаление семафора "на лету", Зависания при удалении семафоров
Cosmojam
сообщение Sep 29 2013, 16:15
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 311
Регистрация: 12-01-11
Из: Калининград (Koenigsberg)
Пользователь №: 62 182



Есть задача сделать программный перезапуск lwip при ошибках. Для этого в ассёртах выдаётся семафор, в который упёрта задача собственно выполняющая перезапуск. Все создаваемые треды, семафоры и очереди сохраняются в связных списках по ходу создания (в sys_arch.c в функция создания этих объектов вызов добавления их в списки)
Сначала вызывается удаление всех тредов:
Код
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;
    }

Вроде всё проходит ОК.
Затем выход из треда с приличной задержкой чтобы дать возможность выполниться айдлу в котором происходит освобождение памяти. Сам тред в котором запущено удаление так же имеет приоритет айдла.
Затем удаление семафоров:
Код
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);
    }

И тут всё виснет после удаления 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

Крайний семафор был создан в задаче, отвечающей за обработку принятого EMAC пакета и передачу его дальше.
На этом всё просто зависает. Временное отсутствие рабочего отладчика затрудняет дебаг.

Пробовал останавливать все задачи перед удалением семафоров (vTaskSuspendAll()), отключать все прерывания, увеличивать приоритет треда, выходить из треда после удаления каждого семафора (т.е. давать айдлу возможность освободить память) - не помогает, так же всё виснет после удаления 6 семафоров.
Подскажите как попробовать ещё или как иначе лучше решить задачу с перезапуском lwip?


--------------------
typedef enum { no, yes, maybe } bool; | блог тут
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 31st July 2025 - 10:56
Рейтинг@Mail.ru


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