В общем вроде заработало, изменения делал такие: 1) Чтобы FreeRTOS нормально маскировал прерывания:
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = ETH_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
2) Добавил фикс на функцию:
void ethernetif_input(void * pvParameters)
{
struct pbuf *p;
while (1) {
if (xSemaphoreTake(s_xSemaphore, emacBLOCK_TIME_WAITING_FOR_INPUT)==pdTRUE) {
while ((p = low_level_input( s_pxNetIf )) != 0) {
if (p != 0) {
if (s_pxNetIf->input( p, s_pxNetIf) != ERR_OK) {
pbuf_free(p);
p=NULL;
}
}
}
}
ethernet_watchdog();
}
}
3) Поставил в 1:
/**
* SYS_LIGHTWEIGHT_PROT==1: if you want inter-task protection for certain
* critical regions during buffer allocation, deallocation and memory
* allocation and deallocation.
*/
#define SYS_LIGHTWEIGHT_PROT 1
4) В функции выделялось не size, а постоянное количество:
sys_mbox_t sys_mbox_new(int size)
{
xQueueHandle mbox;
( void ) size;
//mbox = xQueueCreate( archMESG_QUEUE_LENGTH, sizeof( void * ) ); // fix
mbox = xQueueCreate( size, sizeof( void * ) );
#if SYS_STATS
++lwip_stats.sys.mbox.used;
if (lwip_stats.sys.mbox.max < lwip_stats.sys.mbox.used) {
lwip_stats.sys.mbox.max = lwip_stats.sys.mbox.used;
}
#endif /* SYS_STATS */
return mbox;
}
Ночь простояла с 6 потоками ping разного размера (32, 512, 1024) + открыто 6 страниц с информацией о задачах FreeRTOS.
Всем спасибо!