完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我现在使用esp32c3的ap模式,通过spi口接收数据,然后把数据通过wifi tcp连接发送给电脑,我使用examples/wifi/iperf例子测速发现速度可以达到15Mbits/sec。我从spi口接收数据后直接放到Ringbuffer中,然后在另一个线程中读Ringbuffer通过wifi发送,但spi接收速度最高只能120KByte/sec,否则Ringbuffer会爆。我按文档(https://docs.espressif.com/projects/esp ... erformance)中说的修改过一些参数,但完全没有作用,下面的我的代码,请帮我看下有没有问题。谢谢
Code: Select all void spi_slave_task(void *pvParameters){ esp_err_t ret; spi_slave_transaction_t t; memset(&t, 0, sizeof(t)); uint8_t *recvbuf = (uint8_t *)malloc(SPI_RX_MAX * sizeof(uint8_t)); if(recvbuf == NULL) { ESP_LOGE(SPI_SLAVE, "Receive buffer memory allocation failed!"); return; } while(1) { memset(recvbuf, 0x00, SPI_RX_MAX); //Set up a transaction of 128 bytes to send/receive t.length=SPI_RX_MAX*8; t.rx_buffer=recvbuf; ret=spi_slave_transmit(RCV_HOST, &t, portMAX_DELAY); UBaseType_t res = xRingbufferSend(buf_handle, recvbuf, t.trans_len/8, pdMS_TO_TICKS(10)); if (res != pdTRUE) { ESP_LOGE(SPI_SLAVE, "Failed to send itemn"); } }}void wifi_send_task(void *pvParameters){ while(1) { size_t item_size; char *item = (char *)xRingbufferReceiveUpTo(buf_handle, &item_size, pdMS_TO_TICKS(10), SPI_RX_MAX*2); if (item != NULL) { // 如果网络连接,通过网络发送数 if(tcp_is_connect == true) { int written = send(tcp_sock, item, item_size, 0); if (written < 0) { ESP_LOGE(SPI_SLAVE, "Error occurred during sending: errno %d", errno); } } vRingbufferReturnItem(buf_handle, (void *)item); } }}void spi_slave_task_init(void){ buf_handle = xRingbufferCreate(64*1024, RINGBUF_TYPE_BYTEBUF); if (buf_handle == NULL) { ESP_LOGE(SPI_SLAVE, "Failed to create ring buffern"); } spi_slave_init(); xTaskCreate(spi_slave_task, "spi_slave", 2048, NULL, 5, NULL); xTaskCreate(wifi_send_task, "wifi_send", 2048, NULL, 6, NULL);} |
|
相关推荐
1个回答
|
|
根据您提供的信息,您的ESP32-C3在AP模式下通过SPI接收数据,然后将数据通过WiFi TCP连接发送到电脑。您发现在这种情况下,SPI接收速度最高只能达到120KByte/sec,否则Ringbuffer会溢出。您已经尝试根据官方文档调整了一些参数,但没有效果。
为了解决这个问题,我们可以从以下几个方面进行分析和优化: 1. **SPI接收速度**:首先,我们需要确保SPI接收速度不是瓶颈。请检查SPI配置,确保您使用的是最佳的时钟速率和数据传输模式。同时,检查SPI驱动程序是否正确实现了,以确保数据能够高效地从SPI总线读取。 2. **Ringbuffer大小**:您提到在SPI接收速度较高时,Ringbuffer会溢出。请确保Ringbuffer的大小足够大,以容纳在高接收速度下的数据。如果需要,可以考虑增加Ringbuffer的大小。 3. **线程调度**:在您的系统中,SPI数据接收和TCP数据发送是由两个不同的线程处理的。请确保线程调度是高效的,以便在数据到达时及时处理。您可以使用ESP-IDF的FreeRTOS功能来优化线程调度。 4. **TCP发送性能**:尽管您在iperf测试中达到了15Mbits/sec的速度,但在实际应用中,TCP发送性能可能会受到其他因素的影响。请检查TCP连接的配置,例如窗口大小、拥塞控制算法等,以确保它们不会限制发送速度。 5. **内存管理**:在高数据速率下,内存管理变得尤为重要。请确保您的系统在处理大量数据时不会耗尽内存。您可以使用ESP-IDF的内存调试工具来检查内存使用情况。 6. **代码优化**:检查您的代码,看看是否有任何可以优化的地方,以提高数据传输速度。例如,减少函数调用、使用更高效的数据结构等。 |
|
|
|
只有小组成员才能发言,加入小组>>
733 浏览 1 评论
552浏览 6评论
461浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
445浏览 5评论
446浏览 4评论
417浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-24 15:32 , Processed in 0.590759 second(s), Total 48, Slave 41 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号