Всем привет!
Пробую uIP + FreeRTOS, за основу взят пример что в комплекте с осью CORTEX_LPC1768_GCC_RedSuite. После небольшой модификации эзернет драйвера заработало на моей плате.
Выкинул оттуда веб-сервер, поигрался с хелоуворлдами - ОК, теперь нужно DHCP.
Взял из uip-1.0 пример dhcp, В uip-conf.h исправил
Код
#define UIP_CONF_BUFFER_SIZE 1536
#define UIP_CONF_UDP 1
В потоке uip изменения минимальные по сравнению с оригинальным демо:
Код
void vuIP_Task(void *pvParameters)
{
portBASE_TYPE i;
uip_ipaddr_t xIPAddr;
struct timer periodic_timer, arp_timer;
extern void ( vEMAC_ISR_Wrapper)(void);
(void) pvParameters;
/* Initialise the uIP stack. */
timer_set(&periodic_timer, configTICK_RATE_HZ / 2);
timer_set(&arp_timer, configTICK_RATE_HZ * 10);
uip_init();
uip_arp_init(); /* добавил тут /*
// uip_ipaddr( xIPAddr, configIP_ADDR0, configIP_ADDR1, configIP_ADDR2, configIP_ADDR3 ); /* убрано т.к. нужен дхцп */
// uip_sethostaddr( xIPAddr );
// uip_ipaddr( xIPAddr, configNET_MASK0, configNET_MASK1, configNET_MASK2, configNET_MASK3 );
// uip_setnetmask( xIPAddr );
/* Create the semaphore used to wake the uIP task. */
vSemaphoreCreateBinary( xEMACSemaphore );
/* Initialise the MAC. */
while (lEMACInit() != pdPASS)
{
vTaskDelay(uipINIT_WAIT);
}
portENTER_CRITICAL();
{
LPC_EMAC->IntEnable = (INT_RX_DONE | INT_TX_DONE);
/* Set the interrupt priority to the max permissible to cause some
interrupt nesting. */
NVIC_SetPriority(ENET_IRQn, configEMAC_INTERRUPT_PRIORITY);
/* Enable the interrupt. */
NVIC_EnableIRQ(ENET_IRQn);
prvSetMACAddress();
}
portEXIT_CRITICAL();
dhcpc_init(&uip_ethaddr, sizeof(uip_ethaddr)); /* собственно оно */
printf("MAC: %X:%X:%X:%X:%X:%X\n", uip_ethaddr.addr[0], uip_ethaddr.addr[1],uip_ethaddr.addr[2],
uip_ethaddr.addr[3],uip_ethaddr.addr[4],uip_ethaddr.addr[5]);
dhcpc_request();
/ * далее цикл без изменеий */
Но ничего не работает. Wireshark-ом не вижу в сети дхцп дискавери от девайса, вообще тишина. dhcpc_appcall() которая задефайнена как UIP_UDP_APPCALL не вызывается вообще.
И ещё странность есть в ответах на пинги. Девайс отвечает дважды на каждый echo request, т.е. вот что вижу если пингую его с компьютера:
Цитата
64 bytes from 192.168.1.100: icmp_req=60916 ttl=64 time=0.140 ms
64 bytes from 192.168.1.100: icmp_req=60916 ttl=64 time=0.156 ms (DUP!)
64 bytes from 192.168.1.100: icmp_req=60917 ttl=64 time=0.139 ms
64 bytes from 192.168.1.100: icmp_req=60917 ttl=64 time=0.156 ms (DUP!)
64 bytes from 192.168.1.100: icmp_req=60918 ttl=64 time=0.137 ms
64 bytes from 192.168.1.100: icmp_req=60918 ttl=64 time=0.154 ms (DUP!)
И ваершарком чётко видно 2 одинаковых ответа на каждый запрос. Пока не копал в реализацию этой фичи (реализовано в uip.c, а там чёрт ногу сломит). Возможно это как-то связано с вышеописанной проблемой с DHCP и причиной тому какая-то врождённая кривизна той демки, либо моих рук