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

 
 
> LPC17, FreeRTOS, uIP, проблема с DHCP, а так же странности с ICMP
Cosmojam
сообщение Feb 2 2012, 14:19
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 311
Регистрация: 12-01-11
Из: Калининград (Koenigsberg)
Пользователь №: 62 182



Всем привет!
Пробую 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 и причиной тому какая-то врождённая кривизна той демки, либо моих рук sm.gif


--------------------
typedef enum { no, yes, maybe } bool; | блог тут
Go to the top of the page
 
+Quote Post



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

 


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


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