请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:MCU-PLUS-SDK AM273X 主题中讨论的其他器件:AM2732
工具与软件:
您好!
LwIP 将套接字 API 描述为"顺序式 API、分块函数"的一部分。 开销更大、但可以从除 TCPIP 线程之外的任何线程调用。"。
我尝试在 AM2732上使用 UDP 流式传输 RTP、但注意到许多传出的数据包已损坏。
我知道、在发送之前需要在发送缓冲区上执行缓存失效、并且发送缓冲区应该是缓存大小的倍数:
#define R5F_CACHE_LINE_SIZE (32) #define UTILS_ALIGN(x, align) ((((x) + ((align)-1)) / (align)) * (align)) static u8_t rtp_send_packet[UTILS_ALIGN(RTP_PACKET_SIZE, R5F_CACHE_LINE_SIZE)] __attribute__ ((aligned(R5F_CACHE_LINE_SIZE), section(".bss:UDP_SND_BUF"))); /*...*/ do { /*...*/ CacheP_wbInv(rtp_send_packet, sizeof(rtp_send_packet), CacheP_TYPE_ALLD); if (lwip_sendto(sock, rtp_send_packet, sizeof(struct rtp_hdr) + rtp_payload_size, 0, (struct sockaddr *)to, sizeof(struct sockaddr)) >= 0) { /*...*/ } while (rtp_data_index < sizeof(rtp_data)); /*...*/
添加简单的睡眠或一些调试打印解决了该问题、因此我开始研究使用 DMA 的底层函数。
如果我错了、请帮我更正、但我注意到所有东西都使用队列工作、所以 lwip_sendto 在排队完成时就会尽早返回、然后在中断函数 EnetCpdma_txIsr 内、队列会被处理并实际发送。
在该 DMA 函数内添加 SemaphoreP_post 并 在 lwip_sendto 后执行 SemaphoreP_pend 可修复损坏、但会明显降低吞吐量。
这是否为该问题的预期解决方案? 如果不能、确保数据完整性而不显著影响性能的正确方法是什么?
谢谢你