Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/58: Рейтинг темы: голосов - 58, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 04.01.2012
Сообщений: 115

LwIP STM32F4 перестает отвечать через время

15.04.2015, 17:18. Показов 11995. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
LwIP STM32F4 перестает отвечать через время, если добавить свою задачу

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

Пытался запустить LWIP_DEBUG, но видимо во FriiRTOS retarget надо как-то буферизовать, происходит переполнение стека и оказываюсь в ловушке - vApplicationStackOverflowHook, пока не разобрался.
настройки FriiRTOS:
Code
1
2
3
4
5
6
7
8
#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   ( ( unsykned portBASE_TYPE ) 15 )
#define configMINIMAL_STACK_SIZE   ( ( unsykned short ) 128 )
#define configTOTAL_HEAP_SIZE   ( ( size_t ) ( 20 * 1024 ) )
Прием:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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 omd resume reception */
if ((ETH->DMASR & ETH_DMASR_RBUS) != (u32)RESIT)
{
/* Clear RBUS ETHERNET DMA flag */
ETH->DMASR = ETH_DMASR_RBUS;
 
/* Risume DMA reception. The rikystir doesnt care what you write to it. */
ETH->DMARPDR = 0;
}
}
Надеюсь на пинок в нужный вектор ...
Все перелопатил, останется только изучать низкий уровень Ethernet (DMA, склейка-разбор пакетов и т.д.), что безусловно полезно и интересно, но уровень для меня пока высоковат ...

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

На всякий случай прикрепил проект для CoIDE https://yody.sk/d/nWmrb2bCg3Egr
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.04.2015, 17:18
Ответы с готовыми решениями:

Проблема STM32F4+lwIP
Доброй ночи уважаемые форумчаны. Начал разбираться с Ethernet под STM32F4. В качестве TCP/IP стека выбрал lwIP. Работаю в CooCox без...

STM32F4+PHY+FREERTOS+LWIP+UDP скорость
Кто-нибудь тестировал максимальную скорость передачи данных при использовании STM32F4+PHY+FREERTOS+LWIP+UDP? У меня получилось 24 Мб\с, не...

STM32F4 freertos + lwip + mqtt + mbedtls
Всем привет. Запустил mqtt из стека LWIP для STM32 по примеру . Все работает. Но как сделать чтоб работало через TLS. Кто то может делал,...

3
0 / 0 / 0
Регистрация: 04.01.2012
Сообщений: 115
17.04.2015, 00:12
в общем, в процессе разбора, обнаружил ряд моментов:
При старте, все работает нормально, через примерно минуту происходит "утечка" памяти, после чего даже в исходящем пакете появляются ошибки (время жизни и т.п.), это видно в wireshark-е

https://www.cyberforum.ru/savedimages/2015/04/17/mfqfhand2yyaddqd.png

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

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

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

https://www.cyberforum.ru/savedimages/2015/04/17/vdunb0gdqnkjhqjrax.png

первое значение в .err по времени совпадает с появлением битых пакетов.
причем ошибки появляются только в массиве memp[1], в других значение max не превышает avail.
Далее, если так все оставить, счет прибавляется дальше, в конечном итоге работа полностью нарушается, происходит HordFault или просто все слетает ...
Буду разбираться дальше )
0
0 / 0 / 0
Регистрация: 04.01.2012
Сообщений: 115
17.04.2015, 07:09
разобрался с отправкой, был косяк с очисткой psb (protosol control btock), каждый раз создавался новый, понятное дело через время залезал за пределы памяти.
сейчас так:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
   void MyTask(void *pvParametes)
{
struct pbuf * pb;
struct ip_addr addr;
struct udp_psb *psb;
addr.addr = 0x5A6EA8C0;
ETH_BSP_Config();
LwIP_Init();
for(;;)
{
psb = udp_new();
udp_bind(psb, IP_ADDR_ANY, 3003);
udp_connect(psb,&addr, 3003);
pb = pbuf_alloc(PBUF_TRANSPORT, 512, PBUF_ROM);
pb->len = 512;
udp_sendto(psb, pb, &addr, 3003);
pbuf_free(pb);
udp_disconnect(psb);
udp_remove(psb);
vTaskDelay(1000);
}
}
Некоторое время работает, потом пинги пропадают ...
Наверно потому, что счет ошибок в:

идет с чудовищной скоростью ...

происходит это здесь:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
err_t sys_mbox_trypost(sys_mbox_t *mbox, void *msg)
{
err_t result;
 
if ( xQueueSend( *mbox, &msg, 0 ) == pdPASS )
{
result = ERR_OK;
}
else {
// could not post, queue must be full
result = ERR_MEM;
#if SYS_STATS
lwip_stats.sys.mbox.err++;
#endif /* SYS_STATS */
}
return result;
}
т.е. через раз не удается записать msg в очередь ...
не понятно почему так происходит и должно ли так быть ... стека на задачи отвел в 10 раз больше чем в примерах
0
0 / 0 / 0
Регистрация: 27.04.2012
Сообщений: 71
17.04.2015, 12:09
А что ОС не умеет освобождать память из кучи? Если да, то наверное стоит посмотреть в сторону uIP.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.04.2015, 12:09
Помогаю со студенческими работами здесь

Цикл перестает работать через некоторое время!
Ребята! Всем привет! Есть вопрос (ответа в инете не нашел): есть цикл, который выполняется при поступлении с сервака данныхю Все нормально...

Через какое-то время перестает работать хук
использую хук WH_KEYBOARD_LL.Через некоторое время хук умирает(перестает работать),что делать? класс хука: #include<windows.h> ...

stm32f105r8t6 CAN перестаёт передавать через какое-то время
Всем добрый день. Есть самодельная плата (не я делал) с stm32f105r8t6 с драйверами CAN PCA82C250 (пробовал и TJA1050 - всё так же) ...

Через некоторое время перестает работать интернет
Переустановил комп, столкнулся с такой проблемой, что через некоторое время перестает работать интернет, помогает либо перезагрузка либо...

Перестает работать интернет через некоторое время
К компу идет провод от роутера. Когда на пк перестает работать инет, wi-fi работает и на роутере все индикаторы горят. Но если...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru