Как контроллер DMA обрабатывает устройства ввода, например, последовательный порт - PullRequest
0 голосов
/ 18 апреля 2020

Итак, на данный момент я узнал, что ЦП программирует адрес источника, адрес назначения, количество слов и направление на контроллер DMA всякий раз, когда ему необходимо передать данные, скажем, с жесткого диска. Но в этом примере жесткий диск - просто тупое устройство, поэтому это имеет смысл, поскольку жесткий диск никогда не может инициировать передачу данных.

Но что если мы подключили последовательный порт, где в определенных случаях мы собираемся получить 8 бит данных? Я знаю, что контроллер DMA используется для передачи большой памяти, но я хочу сделать DMA для этих 8 бит. Но драйвер устройства на ЦПУ не может определить, когда поступают данные, а также не может определить объем поступающих данных, поскольку последовательный порт может отправлять 8 или 16 бит или вообще не передавать данные. Таким образом, в этом случае, кто заполняет счетчик и адреса памяти контроллера DMA, поскольку драйвер устройства совершенно неизвестен, когда поступят данные.

1 Ответ

1 голос
/ 20 апреля 2020

Использование последовательного DMA ввода сложно, когда входящие данные не являются непрерывным потоком или пакетами фиксированной длины. Точные данные будут зависеть от специфицированных c контроллеров UART и DMA, но, как правило, каждый поступающий символ будет скопирован в местоположение next в предоставленном буфере DMA, и прерывание будет сгенерировано Контроллер DMA, когда буфер наполовину заполнен и полностью заполнен.

Однобайтовый буфер DMA служит малой цели по сравнению с использованием доступного прерывания данных UART и просто задержит обработку байтов на один символьный период.

Если бы ваш буфер DMA был длиной два символа, вы бы получили прерывание для каждого символа (один для половины передачи и один для полной передачи), что решает проблему частично заполненные буферы не обслуживаются, но совсем не уменьшают издержки на прерывания, поэтому дают небольшое преимущество по сравнению с прямой обработкой прерываний UART. Если ваш UART включает буфер FIFO, это был бы лучший способ справиться с асинхронным последовательным вводом, когда требуется только небольшая буферизация.

Когда используется больший буфер DMA, частота прерываний уменьшается, но если буфер не заполнен, вы не получите прерывания, и данные могут ждать бесконечно долго. Одним из решений этой проблемы является реализация механизма тайм-аута, при котором, если прерывание DMA не поступает в течение периода времени, определяемого скоростью передачи и длиной буфера, то обработчик тайм-аута извлекает все данные, буферизованные в настоящее время. Такой механизм требует осторожности, чтобы избежать состязаний между тайм-аутом и прерыванием DMA, и обеспечить, чтобы данные, поступающие в то время, когда обрабатывается тайм-аут, не терялись или чтобы данные, полученные по таймауту, не повторялись, когда прерывание прямого доступа к памяти в конечном счете прибывает.

...