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

 
 
> 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
Ответов
Golikov A.
сообщение Apr 18 2015, 05:16
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



если слать данные и никто их не будет забирать, забьеться окно, и данные нельзя будет слать... по идее вы должны адекватно реагировать на не возможность отправки данных
Go to the top of the page
 
+Quote Post
khomin
сообщение Apr 18 2015, 15:42
Сообщение #3


Участник
*

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



Цитата(Golikov A. @ Apr 18 2015, 05:16) *
если слать данные и никто их не будет забирать, забьеться окно, и данные нельзя будет слать... по идее вы должны адекватно реагировать на не возможность отправки данных
Спасибо, данные просто выплевываются по UDP.
Добился отсутствия счета ошибок, теперь стек просто перестает работать через 5-10 минут отсылок и пинга )) Похоже это конец (
Go to the top of the page
 
+Quote Post
scifi
сообщение Apr 18 2015, 15:58
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(khomin @ Apr 18 2015, 18:42) *
теперь стек просто перестает работать через 5-10 минут отсылок и пинга )) Похоже это конец (

Нет, это начало! С такими вводными можно легко обнаружить и устранить. Вот если раз в месяц глючит, то это совсем печально...
Go to the top of the page
 
+Quote Post
khomin
сообщение Apr 19 2015, 07:23
Сообщение #5


Участник
*

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



Цитата(scifi @ Apr 18 2015, 15:58) *
Нет, это начало! С такими вводными можно легко обнаружить и устранить. Вот если раз в месяц глючит, то это совсем печально...

оказывается, через время прерывание от DMA Ethernet пропадают, при этом биты RXE-RXEI включены, не представляют где искать причину такого поведения ...
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 06:46
Рейтинг@Mail.ru


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