somebody111 0 22 июля, 2019 Опубликовано 22 июля, 2019 (изменено) · Жалоба Добрый день. Есть контроллер 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); } } Укажите, что не так? Изменено 22 июля, 2019 пользователем somebody111 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 22 июля, 2019 Опубликовано 22 июля, 2019 · Жалоба 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); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
somebody111 0 22 июля, 2019 Опубликовано 22 июля, 2019 (изменено) · Жалоба Спасибо. Подскажите тогда еще. Вот строчки из примера: 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? Вообщем, можете прокомментировать смысл последних двух строчек? Изменено 22 июля, 2019 пользователем somebody111 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Grizzly 0 22 июля, 2019 Опубликовано 22 июля, 2019 · Жалоба 5 часов назад, somebody111 сказал: И что означает 1500? Размер MTU (в байтах)? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SSerge 4 23 июля, 2019 Опубликовано 23 июля, 2019 · Жалоба 16 часов назад, somebody111 сказал: Вообщем, можете прокомментировать смысл последних двух строчек? Один пакет может храниться частями в цепочке из нескольких pbuf. pbuf1->len это размер части, которая храниться в этом pbuf, а pbuf1->tot_len это размер всего пакета. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
somebody111 0 23 июля, 2019 Опубликовано 23 июля, 2019 · Жалоба Спасибо Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться