ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Понедельник
25 ноября
373822 Топик полностью
pulo (05.12.2012 07:51, просмотров: 141) ответил pulo на Всем привет!
В общем вроде заработало, изменения делал такие: 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. Всем спасибо!