khomin 0 16 апреля, 2015 Опубликовано 16 апреля, 2015 (изменено) · Жалоба Здравствуйте. Собрал плату на STM32f429, PHY Ksz8041, FreeRTOS. Проект в Coocox, собрал из примеров от ST. При работе только со "штатными" задачами из примеров, все работает нормально (1 час пингов держал), но если добавить несколько собственных задач, стек LwIP через минуту-две перестает нормально работать (или возможно проблема с MAC), при этом сохраняется активность на TX-0-1 на PHY от MAC, все задачи исправно работают (стек не переполняется), пакеты так же продолжают приходить (прерывание ETH_IRQHandler срабатывает). Задача "ethernetif_input" и функция "low_level_input" так же выполняются ... Попытки играть с приоритетами, выделением памяти (heap_4), и т.п. результатов за два дня не принесли :( Знаю про "косячный" драйвер от ST, самые "известные" на форумах баги подправил, но ничего не изменилось Пытался запустить LWIP_DEBUG, но видимо во FreeRTOS retarget надо как-то буферизовать, происходит переполнение стека и оказываюсь в ловушке - vApplicationStackOverflowHook, пока не разобрался. настройки FreeRTOS: #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 ) ) Прием: 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, склейка-разбор пакетов и т.д.), что безусловно полезно и интересно, но уровень для меня пока высоковат ... В общем, товарищи, куда можно дальше копать? Изменено 16 апреля, 2015 пользователем khomin Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 16 апреля, 2015 Опубликовано 16 апреля, 2015 · Жалоба но если добавить несколько собственных задач, стек LwIP через минуту-две перестает нормально работать А эти добавленные задачи случайно не вызывают функции lwip? Потому что нельзя. Функции lwip можно вызывать только из одного потока. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
khomin 0 16 апреля, 2015 Опубликовано 16 апреля, 2015 (изменено) · Жалоба А эти добавленные задачи случайно не вызывают функции lwip? Потому что нельзя. Функции lwip можно вызывать только из одного потока. увы нет, добавленные задачи не используют LwIP, там простые функции опроса кнопок и индикации ... и приоритет у них Idle Рад бы разобрать на низком уровне, да кругом одни указатели и даже содержимое буферов в отладке просто так не посмотришь ... Изменено 16 апреля, 2015 пользователем khomin Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kostya-m 0 17 апреля, 2015 Опубликовано 17 апреля, 2015 · Жалоба А не пробовали добавить стека потокам, в т.ч. и LwIP? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
khomin 0 17 апреля, 2015 Опубликовано 17 апреля, 2015 · Жалоба А не пробовали добавить стека потокам, в т.ч. и LwIP? да, это было первым с чего начал в общем, в процессе разбора, обнаружил ряд моментов: При старте, все работает нормально, через примерно минуту происходит "утечка" памяти, после чего даже в исходящем пакете появляются ошибки (время жизни и т.п.), это видно в wireshark-е выделенные розовым - уже битые пакеты. далее включил #define SYS_LIGHTWEIGHT_PROT 1 , по идеи это защита критической области по освобождению памяти, разницы не заметил. затем включил системную статистику стека, #define LWIP_STATS 1 и структуре lwip_stats.memp.memp[1] появился счет ошибок первое значение в .err по времени совпадает с появлением битых пакетов. причем ошибки появляются только в массиве memp[1], в других значение max не превышает avail. Далее, если так все оставить, счет прибавляется дальше, в конечном итоге работа полностью нарушается, происходит HardFault или просто все слетает ... Буду разбираться дальше ) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
khomin 0 18 апреля, 2015 Опубликовано 18 апреля, 2015 (изменено) · Жалоба разобрался с отправкой, был косяк с очисткой pcb (protocol control block), каждый раз создавался новый, понятное дело через время залезал за пределы памяти. сейчас так: void MyTask(void *pvParametes) { struct pbuf * pb; struct ip_addr addr; struct udp_pcb *pcb; addr.addr = 0x5A6EA8C0; ETH_BSP_Config(); LwIP_Init(); for(;;) { pcb = udp_new(); udp_bind(pcb, IP_ADDR_ANY, 3003); udp_connect(pcb,&addr, 3003); pb = pbuf_alloc(PBUF_TRANSPORT, 512, PBUF_RAM); pb->len = 512; udp_sendto(pcb, pb, &addr, 3003); pbuf_free(pb); udp_disconnect(pcb); udp_remove(pcb); vTaskDelay(1000); } } Некоторое время работает, потом пинги пропадают ... Наверно потому, что счет ошибок в: идет с чудовищной скоростью ... происходит это здесь: 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 раз больше чем в примерах Изменено 18 апреля, 2015 пользователем khomin Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 18 апреля, 2015 Опубликовано 18 апреля, 2015 · Жалоба если слать данные и никто их не будет забирать, забьеться окно, и данные нельзя будет слать... по идее вы должны адекватно реагировать на не возможность отправки данных Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
khomin 0 18 апреля, 2015 Опубликовано 18 апреля, 2015 · Жалоба если слать данные и никто их не будет забирать, забьеться окно, и данные нельзя будет слать... по идее вы должны адекватно реагировать на не возможность отправки данных Спасибо, данные просто выплевываются по UDP. Добился отсутствия счета ошибок, теперь стек просто перестает работать через 5-10 минут отсылок и пинга )) Похоже это конец ( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 18 апреля, 2015 Опубликовано 18 апреля, 2015 · Жалоба теперь стек просто перестает работать через 5-10 минут отсылок и пинга )) Похоже это конец ( Нет, это начало! С такими вводными можно легко обнаружить и устранить. Вот если раз в месяц глючит, то это совсем печально... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
khomin 0 19 апреля, 2015 Опубликовано 19 апреля, 2015 · Жалоба Нет, это начало! С такими вводными можно легко обнаружить и устранить. Вот если раз в месяц глючит, то это совсем печально... оказывается, через время прерывание от DMA Ethernet пропадают, при этом биты RXE-RXEI включены, не представляют где искать причину такого поведения ... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 19 апреля, 2015 Опубликовано 19 апреля, 2015 · Жалоба С такими вводными можно легко обнаружить и устранить. Ну, относительно легко, естественно. оказывается, через время прерывание от DMA Ethernet пропадают, при этом биты RXE-RXEI включены, не представляют где искать причину такого поведения ... Это надо на месте разбираться. У меня были глюки с lwip (весьма редкие, кстати). Стал разбираться внутрисхемным отладчиком - обнаружил невменяемое поведение кода, который нагенерил компилятор. Списал всё на это. Это Яр для Coldfire, если что, и глюки этого компилятора я уже до этого фиксировал. Первый раз, когда обнаружил, понижение уровня оптимизации с High до Medium вроде бы решало проблему. Теперь понизил до None - глюки наконец-то ушли (надеюсь, навсегда). Кстати, в какой-то момент перешёл на gcc для Coldfire, и там этих проблем ни разу не было. Я не к тому, что в данном случае компилятор виноват. Просто надо иметь представление о работе всех частей системы. Если глюк воспроизводится каждые несколько минут - это счастье. А если раз в неделю - это мучение. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
khomin 0 19 апреля, 2015 Опубликовано 19 апреля, 2015 · Жалоба Ну, относительно легко, естественно. Это надо на месте разбираться. У меня были глюки с lwip (весьма редкие, кстати). Стал разбираться внутрисхемным отладчиком - обнаружил невменяемое поведение кода, который нагенерил компилятор. Списал всё на это. Это Яр для Coldfire, если что, и глюки этого компилятора я уже до этого фиксировал. Первый раз, когда обнаружил, понижение уровня оптимизации с High до Medium вроде бы решало проблему. Теперь понизил до None - глюки наконец-то ушли (надеюсь, навсегда). Кстати, в какой-то момент перешёл на gcc для Coldfire, и там этих проблем ни разу не было. Я не к тому, что в данном случае компилятор виноват. Просто надо иметь представление о работе всех частей системы. Если глюк воспроизводится каждые несколько минут - это счастье. А если раз в неделю - это мучение. Думаю без понимания работы стека у меня ничего не получится. Понял, что легко проблему не решить, правда до этого перепробовал фрагменты коды драйвера из разных примеров, одни проблемы сменялись другими, надо разбираться. Вот уже неделю занимаюсь изучением, и дело понемногу продвигается ) По мере появления уже серьезных вопросов, буду отписываться здесь Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Пришелец 0 19 июня, 2017 Опубликовано 19 июня, 2017 · Жалоба Знаю про "косячный" драйвер от ST, самые "известные" на форумах баги подправил, но ничего не изменилось Добрый день! А ссылочку на "известные баги" можно? Занимаюсь с похожей проблемой. И попутно вопрос: как сделать полную инициализацию стека (железа, кучи LWIP, всех контекстов...)? Иными словами аналог RESET но только для LWIP. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zuuuuk 0 17 июля, 2017 Опубликовано 17 июля, 2017 · Жалоба khomin, может заменить lwip на FNET? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться