BeagleBone Black UART软件FIFO的大小是多少?

时间:2019-10-31 20:10:52

标签: c debian uart beagleboneblack fifo

我正在BeagleBone Black上开发一个自定义应用程序,该应用程序必须通过BBB上运行的Debian Linux使用设备的UART功能,以读取大块数据。为了从UART读取,我使用open() function在非阻塞模式下打开/ dev / ttyO0,/ dev / ttyO1等设备之一。然后,我尝试使用read(2) function从此端口读取:

ssize_t read(int fd, void *buf, size_t count);

我想知道参数count的最大合理数字是什么,它与UART的FIFO缓冲区有何关系?

在AM335x技术参考手册(TI文档spruh73p,第4328页,第19.3.6节)中,我可以看到HW缓冲区的长度为64个字节。但是,正如我怀疑通过使用read()函数,我的程序没有直接与硬件fifo缓冲区通信,而是从Linux的串行驱动程序的软件缓冲区(如果有)中读取数据。这是真的?如果是,fifo软件的大小是多少?有人可以帮我启发一下这个领域吗?

1 个答案:

答案 0 :(得分:2)

  

然后我尝试使用read(2)函数从该端口读取

实际上是从硬件设备中删除了几层,而不是从“端口” 中读取了串行终端的系统缓冲区。

  

我想知道参数计数的最大合理数字是多少,它与UART的FIFO缓冲区有何关系?

首先count不得大于提供的用户缓冲区。
对于阻塞的 read(),您可以将count设为与您可以分配的任何缓冲区一样大。
对于无阻塞的 read(),比终端接收缓冲区大的count毫无意义。
请注意,count只是一个请求, read()系统调用返回的字节数可以少于请求的字节数。

UART FIFO和串行端口驱动器缓冲区的大小与用户空间中的任何 read()请求无关。
参见Linux serial drivers

  

...正在从Linux的串行驱动程序的软件缓冲区中读取(如果有的话)。这是真的?

差不多。
用户空间中的 read()系统调用从终端缓冲区中获取数据。
终端驱动程序是比串行端口驱动程序更高级别的驱动程序。

终端缓冲区与UART FIFO没有直接连接。
如果使用DMA,则数据将从UART FIFO传输到DMA缓冲区。
如果使用PIO,则数据将从UART FIFO传输到驱动器缓冲区。
无论哪种情况,串行端口驱动程序最终都会将数据传输到tty翻转缓冲区。
在非中断模式下,来自tty翻转缓冲区的数据将传输到终端/线路规则缓冲区。
再次参考Linux serial drivers

  

如果是,fifo软件的大小是多少?

终端接收缓冲区通常为4096字节,尽管您可以编写自己的具有不同大小的线路规则,或者重新定义宏。
来自Linux内核源代码中的include/linux/tty.h

#define N_TTY_BUF_SIZE 4096

终端驱动程序是Linux支持的所有体系结构所共有的,因此您的BBB应该具有4096字节的终端缓冲区。