乐鑫技术交流
直播中

李勇

7年用户 1298经验值
私信 关注
[问答]

sendto会随机出现return -1的现象是怎么回事?

一、测试环境:

          硬件官方开发板:ESP32_DevKitc_V4

          IDF 的具体版本:ESP-IDF v4.0.1

          开发环境: Windows

          软件工程:使用BSD Socket API Example 官方工程。修改了udp_client.C的应用内容。 menuconfig 做配置更改

        使用 官方的BSD Socket API Example(:esp-idfexamplesprotocolssocketsudp_clientmainudp_client.c(如附件udp_client.c,工程配置如(sdkconfig".txt")))



二、代码出现的问题:

sendto会随机出现return -1 的现象。

错误long   errno:12 。/* Not enough space */



三、提问问题:

可以从串口打印中知道,报错 errno:12 时 send82493  errno:5  /hmi : 204580 /fh : 205240

     esp_get_minimum_free_heap_size()  204580

     esp_get_free_heap_size()  205240

1.可以知道堆还有挺大的空间。为何会报错 errno:12。

2.sendto函数用到的堆空间是在哪里申请和哪里释放的。是否可以用freerost中的void vApplicationStackOverflowHook( TaskHandle_t xTask,签名字符 *pcTaskName );早出原因吗。





A.源代码部分:(详细请看附件)

static void udp_client_task(void *pvParameters)

{

    char rx_buffer[128];

    char addr_str[128];

    int addr_family;

    int ip_protocol;



    while (1) {



#ifdef CONFIG_EXAMPLE_IPV4

        struct sockaddr_in dest_addr;

        dest_addr.sin_addr.s_addr = inet_addr("192.168.1.122");

        dest_addr.sin_family = AF_INET;

        dest_addr.sin_port = htons(19999);

        addr_family = AF_INET;

        ip_protocol = IPPROTO_IP;

        inet_ntoa_r(dest_addr.sin_addr, addr_str, sizeof(addr_str) - 1);

#else // IPV6

        struct sockaddr_in6 dest_addr;

        inet6_aton(HOST_IP_ADDR, &dest_addr.sin6_addr);

        dest_addr.sin6_family = AF_INET6;

        dest_addr.sin6_port = htons(PORT);

        addr_family = AF_INET6;

        ip_protocol = IPPROTO_IPV6;

        inet6_ntoa_r(dest_addr.sin6_addr, addr_str, sizeof(addr_str) - 1);

#endif



        int sock = socket(addr_family, SOCK_DGRAM, ip_protocol);

        if (sock < 0) {

            ESP_LOGE(TAG, "Unable to create socket: errno %d", errno);

            break;

        }

       ESP_LOGI(TAG, "Socket created, sending to %s:%d", "192.168.1.102",9999);

       // uint8_t  flag1 = 2;



       int i = 0;

           int errtimer = 0;

                while(1){

                                   int err = sendto(sock, payload, 29, 0, (struct sockaddr *)&dest_addr, sizeof(dest_addr));

                    if (err < 0) {

                                        errtimer++;

                   printf("errno:%dn",errno);

                                    printf("send%d  errno:%d  /",i,errtimer);

                                        int heapmini = esp_get_minimum_free_heap_size();

                                    printf("hmi : %d /",heapmini);

                                        int ferrHeap = esp_get_free_heap_size();

                                        printf("fh : %d /:",ferrHeap);

                    int ferrinHeap = esp_get_free_heap_size();

                                        printf("fih : %d n",ferrinHeap);


                    }

                                vTaskDelay(4);//4ms

                                i++;

                                if(i%200 == 0)

                                {

                                         printf("send%d  errno:%d  /",i,errtimer);

                                        int heapmini = esp_get_minimum_free_heap_size();

                                    printf("hmi : %d /",heapmini);

                                        int ferrHeap = esp_get_free_heap_size();

                                        printf("fh : %d /:",ferrHeap);

                    int ferrinHeap = esp_get_free_heap_size();

                                        printf("fih : %d n",ferrinHeap);

                                }

                }



                 vTaskDelete(NULL);



    }

}





B.串口打印部分报文:(详细请看附件)

[17:33:59.440]收←◆send82000  errno:0  /hmi : 208440 /fh : 217308 /:fih : 217308



[17:34:00.240]收←◆send82200  errno:0  /hmi : 208440 /fh : 217932 /:fih : 217932



[17:34:01.040]收←◆send82400  errno:0  /hmi : 208440 /fh : 218348 /:fih : 218348



[17:34:01.396]收←◆errno:12

send82489  errno:1  /hmi : 204580 /fh : 205240 /:fih : 205240

errno:12

send82490  errno:2  /hmi : 204580 /fh : 205240 /:fih : 205240

errno:12

send82491  errno:3  /hmi : 204580 /fh : 205240 /:fih : 205240

errno:12

send82492  errno:4  /hmi : 204580 /fh : 205240 /:fih : 205240

errno:12

send82493  errno:5  /hmi : 204580 /fh : 205240 /:fih : 205240

errno:12

send82494  errno:6  /hmi : 204580 /fh : 205240 /:fih : 205240

errno:12

send82495  errno:7  /hmi : 204580 /fh : 205240 /:fih : 205240

errno:12

send82496  errno:8  /hmi : 204580 /fh : 205240 /:fih : 205240




[17:34:01.852]收←◆send82600  errno:8  /hmi : 204580 /fh : 218556 /:fih : 218556



[17:34:02.652]收←◆send82800  errno:8  /hmi : 204580 /fh : 218344 /:fih : 218344

更多回帖

发帖
×
20
完善资料,
赚取积分