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,该问题将很难优美的解决。