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

 
 
> 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
Ответов
khomin
сообщение Apr 18 2015, 01:57
Сообщение #2


Участник
*

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



разобрался с отправкой, был косяк с очисткой 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 раз больше чем в примерах

Сообщение отредактировал khomin - Apr 18 2015, 02:07
Go to the top of the page
 
+Quote Post



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

 


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


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