This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] LwIP-AM273X:MCU-PLUS-SDK 套接字 API 未处于阻塞状态

Guru**** 1807890 points
Other Parts Discussed in Thread: AM2732
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1380324/mcu-plus-sdk-am273x-lwip-socket-api-not-being-blocking

器件型号: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 可修复损坏、但会明显降低吞吐量。

这是否为该问题的预期解决方案? 如果不能、确保数据完整性而不显著影响性能的正确方法是什么?

谢谢你