Программное обеспечение BeagleBone Black UART FIFO размера? - PullRequest
2 голосов
/ 31 октября 2019

Я разрабатываю специальное приложение для BeagleBone Black, которое должно использовать возможности UART устройства через Debian Linux, работающий на BBB, для чтения больших порций данных. Для чтения из UART я открываю одно из устройств / dev / ttyO0, / dev / ttyO1 и т. Д. С функцией open() в неблокирующем режиме. А потом я пытаюсь читать с этого порта с помощью функции read(2) :

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

Я хотел бы знать, какое наибольшее разумное число для параметраcount и как это связано с буфером FIFO UART?

В техническом справочном руководстве AM335x (документ TI spruh73p, стр. 4328, раздел 19.3.6) я вижу, что буфер HWДлиной 64 байта. Но, как я подозреваю, используя функцию read(), моя программа не обменивается данными напрямую с аппаратным буфером fifo, а читает из программного буфера последовательного драйвера Linux (если он есть). Это правда? Если да, то какой размер программного обеспечения fifo? Может ли кто-нибудь, пожалуйста, просветить это поле для меня?

1 Ответ

2 голосов
/ 01 ноября 2019

А потом я пытаюсь читать с этого порта с помощью функции read (2)

Вместо "порта" , вы на самом деле несколькослои, удаленные из аппаратного устройства, и чтение из системного буфера последовательного терминала.

Я хотел бы знать, какое наибольшее разумное число для счетчика параметров и как оно связано с UARTБуфер FIFO?

Прежде всего count должен быть не больше предоставленного пользовательского буфера.
Для блокировки read () вы, вероятно, могли бы сделать это countразмером с любой буфер, который вы можете выделить.
Для неблокирующего read () значение count больше, чем приемный буфер терминала, не имеет большого смысла.
Обратите внимание, что count - это простозапрос, и системный вызов read () может возвращаться с меньшим, чем запрошенное количество байтов.

Размеры буферов драйвера UART FIFO и последовательного порта не имеют значения для любого чтения () запросов из пространства пользователя.
См. Драйверы последовательного порта Linux .

... он считывает данные из буфера программного обеспечения драйвера последовательного порта Linux (если есть). Это правда?

Почти.
Системный вызов read () из пространства пользователя извлекает данные из буфера терминала.
Драйвер терминала является драйвером более высокого уровня, чем последовательный портВодитель.

Буфер терминала не имеет прямого подключения к FIFO UART.
Если используется DMA, то данные передаются из FIFO UART в буфер DMA.
Если используется PIO, то данныепередается из UART FIFO в буфер драйвера.
В любом случае драйвер последовательного порта в конечном итоге передает данные в буфер tty-флип.
В режиме без прерывания данные из буфера tty-флип передаются на терминал/ line-дисциплина буфер.
Снова обратитесь к Драйверы последовательного интерфейса Linux .

Если да, то какой размер программного обеспечения fifo?

Буфер приема терминала обычно составляет 4096 байт, хотя вы можете написать собственную дисциплину строки с другимизменить размер или переопределить макрос.
Начиная с включите / linux / tty.h в исходный код ядра Linux:

#define N_TTY_BUF_SIZE 4096

Драйвер терминала является общим для всех архитектур, поддерживаемых Linux,поэтому ваш BBB должен иметь конечный буфер 4096 байт.

...