Jump to content

    

Конфигурирование LwIP для отправки UDP пакета на 255.255.255.255

Добрый день. Есть контроллер TM4C129ENCPDT13.

Задача: отправить udp пакет по широковещательному адресу 255.255.255.255 на заданный порт. После первой строчки udp_send (сконфиругирован на 255.255.255.255) контроллер уходит в FaultIsr. На любой другой - без проблем. Что-то где-то я не сконфигурировал...

Инициализация:

void EthernetUDPInit(uint32_t freq)
{
    uint32_t ui32User0, ui32User1;
    uint8_t pui8MACArray[8];

    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOK);
    GPIOPinConfigure(GPIO_PK4_EN0LED0);
    GPIOPinConfigure(GPIO_PK6_EN0LED1);
    GPIOPinTypeEthernetLED(GPIO_PORTK_BASE, GPIO_PIN_4 | GPIO_PIN_6);


    ROM_FlashUserGet(&ui32User0, &ui32User1);

    pui8MACArray[0] = ((ui32User0 >>  0) & 0xff);
    pui8MACArray[1] = ((ui32User0 >>  8) & 0xff);
    pui8MACArray[2] = ((ui32User0 >> 16) & 0xff);
    pui8MACArray[3] = ((ui32User1 >>  0) & 0xff);
    pui8MACArray[4] = ((ui32User1 >>  8) & 0xff);
    pui8MACArray[5] = ((ui32User1 >> 16) & 0xff);

    lwIPInit(freq, pui8MACArray, 0, 0, 0, IPADDR_USE_AUTOIP);
    udp_init();
    ROM_IntPrioritySet(INT_EMAC0, ETHERNET_INT_PRIORITY);
    ROM_IntPrioritySet(FAULT_SYSTICK, SYSTICK_INT_PRIORITY);

}

Тестовая программа:

    char buf [512];
    char buf1 [512];
    g_ui32SysClock = SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ |
                                             SYSCTL_OSC_MAIN | SYSCTL_USE_PLL |
                                             SYSCTL_CFG_VCO_480), 120000000);
    // Configure the device pins.
    //

    //EthernetPing configure

    // Configure SysTick for a periodic interrupt.
    //
    ROM_SysTickPeriodSet(g_ui32SysClock);
    ROM_SysTickEnable();

    gpio_init();
    EthernetUDPInit(g_ui32SysClock);

    buf[0] = 'A';
    buf[1] = 'B';
    buf[2] = 'C';
    buf[3] = 'D';
    buf[4] = 'E';


    struct udp_pcb *UDPSock1 = udp_new();
    ip_set_option(UDPSock1, SOF_BROADCAST);
    struct udp_pcb *UDPSock2 = udp_new();
    struct udp_pcb *UDPSock3 = udp_new();

    udp_recv(UDPSock1, UDPIntHandler, NULL);
    udp_bind(UDPSock1, IP_ADDR_BROADCAST, 7070);

    udp_recv(UDPSock2, UDPIntHandler, NULL);
    udp_bind(UDPSock2, IP_ADDR_ANY, 7071);

    udp_recv(UDPSock3, UDPIntHandler, NULL);
    udp_bind(UDPSock3, IP_ADDR_ANY, 7072);

    //
    // Loop forever.  All the work is done in interrupt handlers.
    //

     struct pbuf* pbuf1= pbuf_alloc(PBUF_POOL, 1500, PBUF_ROM);
     pbuf1->payload = (void*)buf;
     pbuf1->tot_len = 1400; //data length
     pbuf1->len = 1400;
     ROM_SysTickIntEnable();

     static bool flag=false;
     uint32_t port_temp=0;

    while(1)
    {
//        udp_sendto(UDPSock1,pbuf1,(u32_t)0xffffffff,7070);
        udp_send(UDPSock1,pbuf1);
        udp_send(UDPSock2,pbuf1);
        udp_send(UDPSock3,pbuf1);

        //pbuf_free(pbuf1);
        SysCtlDelay(40000000);
            }
}

Укажите, что не так?

 

Edited by somebody111

Share this post


Link to post
Share on other sites
31 minutes ago, somebody111 said:

Укажите, что не так?

err_t            udp_sendto     (struct udp_pcb *pcb, struct pbuf *p,
                                 ip_addr_t *dst_ip, u16_t dst_port);

А вы ему u32 скармливаете. Сделайте так:

udp_sendto(UDPSock1,pbuf1,IP_ADDRESS_BROADCAST,7070);

 

Share this post


Link to post
Share on other sites

Спасибо. Подскажите тогда еще. Вот строчки из примера:

     struct pbuf* pbuf1= pbuf_alloc(PBUF_TRANSPORT, 1500, PBUF_ROM);
     pbuf1->payload = (void*)buf;
     pbuf1->tot_len = 1400; //data length
     pbuf1->len = 1400;

Чем отличается tot_len от len

И что означает 1500?

Вообщем, можете прокомментировать смысл последних двух строчек?

Edited by somebody111

Share this post


Link to post
Share on other sites
5 часов назад, somebody111 сказал:

И что означает 1500?

Размер MTU (в байтах)?

Share this post


Link to post
Share on other sites
16 часов назад, somebody111 сказал:

Вообщем, можете прокомментировать смысл последних двух строчек?

Один пакет может храниться частями в цепочке из нескольких pbuf.

pbuf1->len это размер части, которая храниться в этом pbuf, а

pbuf1->tot_len это размер всего пакета.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this