MicroBlaze uClinux下USART输入缓冲区大小查询及FIFO适配需求
如何获取MicroBlaze uClinux上USART输入缓冲区大小
针对你的场景(MicroBlaze uClinux + 精简版BusyBox v1.23.2),我整理了几个实用的方法来排查USART输入缓冲区的大小,帮你设置合理的应用层FIFO:
1. 先查硬件层面的FIFO大小
MicroBlaze的USART通常是FPGA上的AXI UART IP(比如AXI UART Lite或AXI UART 16550),硬件本身会带一个小FIFO:
- 可以通过查看内核的串口驱动信息,执行命令:
输出里会包含每个串口的硬件FIFO大小(比如16550类UART通常是16字节,如果是定制IP可能更大)。cat /proc/tty/driver/serial - 如果你的系统有内核配置文件,还可以检查UART相关的编译选项:
找类似# 有zcat的话用这个 zcat /proc/config.gz | grep -i fifo # 没有zcat直接查看 cat /proc/config | grep -i fifoSERIAL_8250_FIFO_SIZE这类选项,能看到硬件FIFO的配置值。
2. 再看内核软件缓冲区大小
Linux内核的tty层会给串口额外加一个软件缓冲区,默认大小通常是4096字节,但可以通过以下方式确认:
- 用
stty命令查看串口参数:
关注和输入缓冲相关的参数,或者直接查看sysfs节点:stty -F /dev/ttyS0 -acat /sys/class/tty/ttyS0/fifo_size # 针对AXI驱动的节点 cat /sys/class/tty/ttyS0/device/uartfifosize - 最直接的方式是实际测试:写一个简单的C程序,在非阻塞模式下读取串口,直到无数据可读,统计总字节数(这个数值是硬件FIFO+内核软件缓冲区的总和):
编译运行这个程序,同时快速向串口发送大量数据,就能得到当前实际可用的输入缓冲总大小。#include <stdio.h> #include <unistd.h> #include <fcntl.h> #include <errno.h> int main() { int fd = open("/dev/ttyS0", O_RDONLY | O_NONBLOCK); if (fd < 0) { perror("Failed to open serial port"); return 1; } char buf[1024]; int total_bytes = 0; int read_bytes; // 循环读取直到无数据 while ((read_bytes = read(fd, buf, sizeof(buf))) > 0) { total_bytes += read_bytes; } if (errno != EAGAIN) { perror("Read error"); } else { printf("Total available bytes in buffer: %d\n", total_bytes); } close(fd); return 0; }
3. 为你的应用层FIFO设置合理大小
结合你的需求(既不过大也不过小):
- 如果硬件FIFO较小(比如16字节),内核缓冲区是4096字节,那应用层FIFO可以设为256~512字节,既能覆盖突发数据,又不会浪费内存;
- 如果你测试发现单次非阻塞读取能拿到20+字节,那把应用层FIFO设为64或128字节也足够应对大部分场景,后续可以根据实际运行情况再调整。
内容的提问来源于stack exchange,提问作者Stefatronik
相关产品推荐
相关产品推荐

