sdio与wifi接收同时工作,会增加wifi接收的丢包率吗?

jason2
Posts: 44
Joined: Thu Oct 26, 2017 11:02 am

sdio与wifi接收同时工作,会增加wifi接收的丢包率吗?

Postby jason2 » Sat Dec 08, 2018 2:37 am

实验描述:
1·一个esp32作为wifi的发送,一个esp32作为wifi的接收,采用esp_80211_tx。采用80211g,每一包payload大小960bytes。
2·发送不停的地发送数据包,每60包内,数据包与数据包之间没有时间间隔。
3·接收端有一个sdio_transfer_task。接收端每接收到一包,进入wifi_sniffer_packet_handler,通知sdio_transfer_task。sdio_transfer_task向sdio从设备写入两个block。接受端esp32作为接收端主设备。
4·wifi task分配到cpu1 ,sdio_transfer_task分配到cpu0。
5·IDF:基于IDFv3.1
6·如果wifi接收与sdio没有同时工作,那么丢包率很低
代码节选:
1·接收端代码:
  1.  
  2. void wifi_sniffer_packet_handler(void* buff, wifi_promiscuous_pkt_type_t type)
  3. {
  4.  
  5.     if (type != WIFI_PKT_DATA)
  6.         return;
  7.  
  8.     const wifi_promiscuous_pkt_t *ppkt = (wifi_promiscuous_pkt_t *)buff;
  9.     const wifi_ieee80211_packet_t *ipkt = (wifi_ieee80211_packet_t *)ppkt->payload;
  10.     const wifi_ieee80211_mac_hdr_t *hdr = &ipkt->hdr;
  11.  
  12.     if(!((hdr->addr2[4]==0x00)&&(hdr->addr2[5]==0x00)))
  13.     {
  14.         return ;
  15.     }
  16.  
  17.  
  18.        
  19.  
  20.         if(NORMALSENDPACKETS==ipkt->payload[0])//it means it is not the retrans packet
  21.         {
  22.  
  23.             pack_count++;
  24.             register uint32_t i=0;
  25.             register uint8_t pac_seq=ipkt->payload[1];
  26.             if(pac_seq==59)
  27.             {              
  28.                 ets_printf("cb=%d\n",60-pack_count);
  29.                 pack_count=0;
  30.             }
  31.             xEventGroupSetBits(frame_event_group,FRAME_RECEIVED_BIT);
  32.         }
  33.    
  34. }
  35. static void  sdio_transfer_task(void *pvParameters)
  36. {
  37.  
  38.     while(true)
  39.     {
  40.  
  41.         xEventGroupWaitBits(frame_event_group,FRAME_RECEIVED_BIT, pdTRUE, pdTRUE,portMAX_DELAY);
  42.        
  43.        
  44.                 uint8_t sdiotmp[1024]
  45.         esp_err_t user_sdmmc_write_error=sdmmc_write_sectors(card,sdiotmp,1,2);
  46.         if(user_sdmmc_write_error)
  47.         {
  48.             esp_restart();
  49.            }
  50.     }
  51. }
2·发送端代码:
  1. int32_t user_esp_wifi_80211_tx(void * data,size_t datasize,uint32_t picture_count)
  2. {
  3.         wifi_internal_rate_t rate;  
  4.        
  5.         //  struct timeval test_promis_start;
  6.         //  struct timeval test_promis_end;
  7.         //  struct timeval promis_result_time;
  8.         int32_t fail_count=0;
  9.         int pack_num=datasize/PACKSIZE;
  10.  
  11.  
  12.  
  13.        
  14. #ifdef CHANGERTATE
  15.  
  16.         rate.fix_rate = RATE_MCS7;
  17.         esp_wifi_internal_set_rate(100, 1, 4, &rate);
  18. #endif
  19.  
  20.         for(int i=0;i<pack_num;i++)
  21.         {
  22.  
  23.             packetH[DATAOFFSET]=NORMALSENDPACKETS;
  24.             packetH[DATAOFFSET+1]=i;
  25.             memcpy(packetH+DATAOFFSET+2,data+i*PACKSIZE,PACKSIZE);
  26.             int result = esp_wifi_80211_tx(WIFI_MODE_NULL, packetH, sizeof(packetH), true);
  27.            
  28.             if(result)
  29.             {
  30.                 fail_count++;
  31.  
  32.             }
  33.         }
  34.        
  35.  
  36.         return fail_count;
  37.        
  38. }
2·sdkconfig文件在附件之中

问题:
1·sdio与wifi接收同时工作,会增加wifi接收的丢包率吗?
2·是不是因为sdio与wifi接收同时工作,sdio输出20mhz的时钟,影响了wifi的接收灵敏度吗?
3·wifi代码不开源,wifi_sniffer_packet_handler是在wifi接收中断中执行的吗?
4·wifi中断优先级比sdio_host中断的优先级要高吗?
Attachments
乐鑫问题.rar
(15.59 KiB) Downloaded 759 times

littlesky
Posts: 51
Joined: Fri Jun 09, 2017 7:49 am

Re: sdio与wifi接收同时工作,会增加wifi接收的丢包率吗?

Postby littlesky » Thu Dec 13, 2018 6:21 am

1·sdio与wifi接收同时工作,会增加wifi接收的丢包率吗?
—— sdio 任务的优先级是多少?若是比较低的话不会增加 wifi 接收的丢包率。
2·是不是因为sdio与wifi接收同时工作,sdio输出20mhz的时钟,影响了wifi的接收灵敏度吗?
—— 不会。
3·wifi代码不开源,wifi_sniffer_packet_handler是在wifi接收中断中执行的吗?
—— 不是,是在 wifi 任务中执行的。
4·wifi中断优先级比sdio_host中断的优先级要高吗?
—— 优先级是一样的。
建议:
1. sdio 任务优先级设低一些,至少低于 23.
2. sniffer 回调函数中将收到的包复制一份给 sdio 任务处理,因为这个包在回调函数返回后会被立即释放掉。
3. menuconfig 中将 wifi rx buffer 个数设大一些,设为 25。

jason2
Posts: 44
Joined: Thu Oct 26, 2017 11:02 am

Re: sdio与wifi接收同时工作,会增加wifi接收的丢包率吗?

Postby jason2 » Mon Dec 17, 2018 5:50 am

感谢您的回复!
1. sdio 任务优先级设低一些,至少低于 23.
--------优先级已经设置到了非常低。设置成了10。10是否还是不够低?
2. sniffer 回调函数中将收到的包复制一份给 sdio 任务处理,因为这个包在回调函数返回后会被立即释放掉。
---这个明白,目前只是做试探性试验而已,sdio_task要传的数据是直接定义在一片固定的内存之中的。
3. menuconfig 中将 wifi rx buffer 个数设大一些,设为 25。
---wifi rx buffer设成25,有一定改善,改善不大。

请问:
是否是因为sdio传送过程中会产生sdio host的中断,影响了wifi_sniffer_packet_handler的执行效率,进而影响了接收的丢包率呢?

liuzhifu
Posts: 39
Joined: Tue Dec 13, 2016 2:18 am

Re: sdio与wifi接收同时工作,会增加wifi接收的丢包率吗?

Postby liuzhifu » Fri Dec 21, 2018 11:45 am

Hi Jason2,

这个问题可能是由于你使用了 xEventGroupSetBits/xEventGroupWaitBits 来同步信息有关。 请改成使用 Queue 的方式在两个 task 之间进行数据传输。

jason2
Posts: 44
Joined: Thu Oct 26, 2017 11:02 am

Re: sdio与wifi接收同时工作,会增加wifi接收的丢包率吗?

Postby jason2 » Sat Dec 22, 2018 8:07 am

queue 的方式比 xEventGroupSetBits/xEventGroupWaitBits 来同步信息 要更快吗?为什么呢?

ESP_igrr
Posts: 2067
Joined: Tue Dec 01, 2015 8:37 am

Re: sdio与wifi接收同时工作,会增加wifi接收的丢包率吗?

Postby ESP_igrr » Sat Dec 22, 2018 11:48 am

In the case when event group is used from ISR, FreeRTOS will defer the action of setting the bit and will execute it from Timer task (priority=1). The reason for this is explained in FreeRTOS documentation, see section "avoiding non-determinism" in this page: https://www.freertos.org/FreeRTOS-Event-Groups.html.

FreeRTOS Queues do not have this limitation.

littlesky
Posts: 51
Joined: Fri Jun 09, 2017 7:49 am

Re: sdio与wifi接收同时工作,会增加wifi接收的丢包率吗?

Postby littlesky » Thu Dec 27, 2018 1:28 pm

But in this case, event group is not used in ISR.

Who is online

Users browsing this forum: Google [Bot] and 55 guests