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

 
 
> LwIP STM32F4 перестает отвечать через время, если добавить свою задачу
khomin
сообщение Apr 16 2015, 07:40
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 26
Регистрация: 14-06-14
Пользователь №: 81 950



Здравствуйте. Собрал плату на STM32f429, PHY Ksz8041, FreeRTOS. Проект в Coocox, собрал из примеров от ST. При работе только со "штатными" задачами из примеров, все работает нормально (1 час пингов держал), но если добавить несколько собственных задач, стек LwIP через минуту-две перестает нормально работать (или возможно проблема с MAC), при этом сохраняется активность на TX-0-1 на PHY от MAC, все задачи исправно работают (стек не переполняется), пакеты так же продолжают приходить (прерывание ETH_IRQHandler срабатывает). Задача "ethernetif_input" и функция "low_level_input" так же выполняются ... Попытки играть с приоритетами, выделением памяти (heap_4), и т.п. результатов за два дня не принесли sad.gif
Знаю про "косячный" драйвер от ST, самые "известные" на форумах баги подправил, но ничего не изменилось

Пытался запустить LWIP_DEBUG, но видимо во FreeRTOS retarget надо как-то буферизовать, происходит переполнение стека и оказываюсь в ловушке - vApplicationStackOverflowHook, пока не разобрался.

настройки FreeRTOS:
HTML
#define configUSE_PREEMPTION 1
#define configUSE_IDLE_HOOK 0
#define configUSE_TICK_HOOK 0
#define configCPU_CLOCK_HZ ( 150000000 )
#define configTICK_RATE_HZ ( ( portTickType ) 1000 )
#define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 15 )
#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 128 )
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 20 * 1024 ) )

Прием:
CODE

void ethernetif_input( void * pvParameters )
{
struct pbuf *p;

for( ;; )
{
if (xSemaphoreTake( s_xSemaphore, emacBLOCK_TIME_WAITING_FOR_INPUT)==pdTRUE)
{
while ((p = low_level_input( s_pxNetIf )) != 0)
{
if (p != 0)
{
if (ERR_OK != s_pxNetIf->input( p, s_pxNetIf))
{
pbuf_free(p);
p=NULL;
}
}
}
}
ethernet_watchdog();
}
}

static void ethernet_watchdog(void)
{
/* When Rx Buffer unavailable flag is set: clear it and resume reception */
if ((ETH->DMASR & ETH_DMASR_RBUS) != (u32)RESET)
{
/* Clear RBUS ETHERNET DMA flag */
ETH->DMASR = ETH_DMASR_RBUS;

/* Resume DMA reception. The register doesn't care what you write to it. */
ETH->DMARPDR = 0;
}
}

Надеюсь на пинок в нужный вектор ...
Все перелопатил, останется только изучать низкий уровень Ethernet (DMA, склейка-разбор пакетов и т.д.), что безусловно полезно и интересно, но уровень для меня пока высоковат ...

В общем, товарищи, куда можно дальше копать?

Сообщение отредактировал khomin - Apr 16 2015, 12:10
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Мусатов Констант...
сообщение Apr 17 2015, 07:44
Сообщение #2


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

Группа: Участник
Сообщений: 188
Регистрация: 10-10-06
Пользователь №: 21 172



А не пробовали добавить стека потокам, в т.ч. и LwIP?
Go to the top of the page
 
+Quote Post
khomin
сообщение Apr 17 2015, 19:03
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 26
Регистрация: 14-06-14
Пользователь №: 81 950



Цитата(Мусатов Константин @ Apr 17 2015, 07:44) *
А не пробовали добавить стека потокам, в т.ч. и LwIP?
да, это было первым с чего начал

в общем, в процессе разбора, обнаружил ряд моментов:
При старте, все работает нормально, через примерно минуту происходит "утечка" памяти, после чего даже в исходящем пакете появляются ошибки (время жизни и т.п.), это видно в wireshark-е

выделенные розовым - уже битые пакеты.

далее включил #define SYS_LIGHTWEIGHT_PROT 1 , по идеи это защита критической области по освобождению памяти, разницы не заметил.

затем включил системную статистику стека,
#define LWIP_STATS 1
и структуре lwip_stats.memp.memp[1] появился счет ошибок

первое значение в .err по времени совпадает с появлением битых пакетов.
причем ошибки появляются только в массиве memp[1], в других значение max не превышает avail.
Далее, если так все оставить, счет прибавляется дальше, в конечном итоге работа полностью нарушается, происходит HardFault или просто все слетает ...
Буду разбираться дальше )
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 30th July 2025 - 01:50
Рейтинг@Mail.ru


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