RT-THREAD 串口TXDMA BUG

void uart_test(void)
{
    int fd;
    char buffer[32];

    fd = open("/dev/uart1", O_RDWR);

    if (fd >= 0)
    {
        buffer[16] = '\r';
        buffer[17] = '\n';

        memset(buffer, '1', 16);
        write(fd, buffer, 18);
        memset(buffer, '2', 16);
        write(fd, buffer, 18);
        memset(buffer, '3', 16);
        write(fd, buffer, 18);
        memset(buffer, '4', 16);
        write(fd, buffer, 18);
        memset(buffer, '5', 16);
        write(fd, buffer, 18);
    }
}

以上代码在RT-THREAD上执行后,

我们预期的效果应该是第一行输出16个‘1’,第二行输出16个‘2’...第5行输出16个5.

但实际上在开启串口TXDMA的情况下,串口1输出的数据无法预测。

导致这个问题的原因是 RT-THREAD Serial驱动框架中使用 rt_data_queue 来记录需要发送的数据(指针...注意,仅记录指针),当

_serial_dma_tx()函数返回后,如果数据缓冲区被回收用作它用,则发送的数据无法预测。

该问题可以在串口驱动的 struct rt_uart_ops::dma_transmit 接口中增加信号量来解决,但如此解决方式,将严重影响系统性能,会导致发送线程必须等待数据全部发送完成后,才能继续执行后续程序。

若数据记录方式依然采用 rt_data_queue,该问题将很难优美的解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值