发帖
19 0 0

又测试了BL8的UDP传输,依旧问题多多

armfans
高级会员

2

主题

12

回帖

640

积分

高级会员

积分
640
问题汇总 2635 19 2024-3-8 16:08:30
BL618的wifi性能太低了,如何进行优化

之前的帖子中测试了BL618的wifi性能,不是很理想,TCP传输率太低了,UDP的传输率还可以,这两个测试都是使用官方SDK提供的测试程序,自己改了下demo中提供udp测试程序,发现比官方的程序慢了将近10倍

自己写的iperf测试

自己写的iperf测试

官方SDK的iperf测试程序

官方SDK的iperf测试程序

把SDK翻遍了才发现官方的测试程序也打包进wifi库了,没有代码,只有个libwifi6.a文件,一步步排查代码,发现是socket的sendto函数延时过高造成的,不管发送多少字节,哪怕只是100字节,也至少有2ms的阻塞延时,改成非阻塞模式,也没能解决这个阻塞情况。
  1. void iperf_client(void *thread_param)
  2. {
  3.     int sock = -1,i;
  4.     int opt = -1;
  5.     struct sockaddr_in udp_addr, remote_addr;

  6.     uint8_t* send_buf;
  7.     u32_t tick1, tick2;
  8.     uint64_t sentlen;
  9.     socklen_t addr_len;

  10.     int32_t *pkt_id_p;
  11.     int32_t pkt_cnt = 0;
  12.     int actual_send = 0;
  13.     int want_send = 0;
  14.     int send_time = 0;



  15.     send_buf = (uint8_t *) pvPortMalloc(IPERF_BUFSZ);
  16.     if (!send_buf)
  17.         return ;

  18.     for (i = 0; i < IPERF_BUFSZ; i ++)
  19.         send_buf[i] = i & 0xff;
  20.    
  21.     vTaskDelay(2000);

  22.     pkt_id_p = (int32_t *)send_buf;
  23.     want_send = IPERF_BUFSZ;

  24.     while(1)
  25.     {
  26.         if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) {
  27.             printf("udp create socket error\r\n");
  28.             continue;
  29.         }

  30.         setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));

  31.         udp_addr.sin_family = AF_INET;
  32.         udp_addr.sin_port = htons(UDP_PORT);
  33.         udp_addr.sin_addr.s_addr = INADDR_ANY;
  34.         memset(&(udp_addr.sin_zero), 0, sizeof(udp_addr.sin_zero));

  35.         printf("Server ip Address : %s:%d\r\n", udp_addr.sin_addr.s_addr, UDP_PORT);

  36.         if (bind(sock, (struct sockaddr *)&udp_addr, sizeof(struct sockaddr)) != 0) {
  37.             printf("udp bind falied!\r\n");
  38.             closesocket(sock);
  39.             continue;
  40.         }
  41.         printf("udp bind port success!\r\n");

  42.         printf("UDP Test Start...\r\n");

  43.          long n = 1;
  44.          lwip_ioctl(sock,FIONBIO,&n);

  45.         remote_addr.sin_family = AF_INET;
  46.         remote_addr.sin_port = htons(UDP_PORT);
  47.         remote_addr.sin_addr.s_addr = inet_addr("192.168.2.248");
  48.         memset(&(udp_addr.sin_zero), 0, sizeof(udp_addr.sin_zero));
  49.         addr_len = sizeof(struct sockaddr);



  50.         if (connect(sock,(struct sockaddr *)&remote_addr,sizeof(struct sockaddr)) == -1)
  51.         {
  52.             printf("Connect failed!\n");
  53.             closesocket(sock);
  54.             vTaskDelay(10);
  55.             continue;
  56.         }

  57.         printf("Connect to iperf server successful!\n");

  58.         tick1 = sys_now();
  59.          while (1)
  60.          {


  61.             tick2 = sys_now();
  62.             if (tick2 - tick1 >= configTICK_RATE_HZ * 5)
  63.             {
  64.                 float f;
  65.                 f = (float)(sentlen*configTICK_RATE_HZ/125/(tick2 - tick1));
  66.                 f /= 1000.0f;
  67.                 printf("send speed = %.4f Mbps!\n", f);

  68.                 tick1 = tick2;
  69.                 sentlen = 0;
  70.             }

  71.             *pkt_id_p = htonl(pkt_cnt); // datagrams need to be sequentially numbered
  72.             if (pkt_cnt >= INT32_MAX) pkt_cnt = 0;            
  73.             else  pkt_cnt++;

  74.             send_time = bflb_mtimer_get_time_us();
  75.             actual_send = sendto(sock, send_buf, want_send, 0, (struct sockaddr *)&remote_addr, addr_len);
  76.             send_time = bflb_mtimer_get_time_us() - send_time;
  77.             printf("sendtime = %dus\r\n",send_time);
  78.             if (actual_send != want_send)
  79.             {
  80.                 printf("send fail,%d\r\n",actual_send);
  81.             }
  82.             else
  83.             {
  84.                 sentlen += actual_send;
  85.             }

  86.         
  87.         }
  88.         closesocket(sock);
  89.     }   

  90. }
复制代码




──── 0人觉得很赞 ────
Snipaste_2024-03-08_15-47-15.png

使用道具 举报

2024-3-8 16:17:40
2024-3-8 16:20:51
Snipaste_2024-03-08_16-14-31.png
就卡在这个sendto函数中了,sendto函数再进去就是lwip库了,官方的iperf程序也用的就这个lwip,应该不是lwip造成的问题



2024-3-8 17:56:10
抓个技术给你瞧瞧
他这个TCP离谱,这个测试的demo,之前我测过就UDP还可以。TCP就不太行了
2024-3-8 18:52:56
TCP离谱,没想到UDP更离谱,它官方的iperf程序就可以达到30Mbps,问题不开源的,只提供库,demo就给了几个简单功能,文档也没有任务wifi相关的东西,浪费了1周时间调试这个片子,有问题无从下手,以后真不敢再碰这个资料不齐的芯片了
2024-3-8 18:54:26
Ai-Thinker小泽 发表于 2024-3-8 18:05
他这个TCP离谱,这个测试的demo,之前我测过就UDP还可以。TCP就不太行了

bl618的网络性能我都不太关心了

为啥似乎好像每次技术都抓你一个人
2024-3-9 09:34:46
2024-3-9 16:46:42
学习
2024-3-11 08:28:45
赞 学习了
您需要登录后才可以回帖 立即登录
高级模式
12下一页
统计信息
  • 会员数: 28290 个
  • 话题数: 40266 篇