Будет ли запрос ОС прерывать устройство? - PullRequest
0 голосов
/ 28 января 2019

Возьмем UART в качестве примера.

Когда UART получает данные, устройство (микросхема) UART генерирует прерывание, обработчик прерываний SW обрабатывает это прерывание, например: считывает данные из буфера HW.Эта часть является разумной.

В случае передачи, ОС / драйвер сгенерирует прерывание для устройства (микросхема UART), чтобы сообщить микросхеме UART о необходимости передачи некоторых данных?

Ответы [ 3 ]

0 голосов
/ 28 января 2019

Устройство генерирует аппаратные прерывания, а не ОС или драйверы.

Обычно коммуникационное оборудование генерирует прерывания, когда:

  1. Имеет некоторые данные
  2. Готово к отправке данных
  3. В состоянии ошибки,
  4. Он завершил коммутацию (особенно важно для оборудования с внутренними буферами, такими как FIFO)

Если оборудование использует DMA, у вас могут быть и другие прерывания

Конец транзакции DMA Половина транзакции Ошибка DMA
0 голосов
/ 30 января 2019

Проще говоря, здесь я проверяю Linux 1.0 в качестве основы кода.

static void rs_stop(struct tty_struct *tty)
{
...
info->IER = UART_IER_MSI | UART_IER_RLSI | UART_IER_RDI; 
// you can see UART_IER_THRI is not here, the TX interrupt was disabled.
...
}

static void rs_start(struct tty_struct *tty)
{
    info->IER = (UART_IER_MSI | UART_IER_RLSI |
         UART_IER_THRI | UART_IER_RDI);
  // THRI is enabled here.
}
0 голосов
/ 28 января 2019

Типичный способ обработки UART ввод идет немного дальше, чем вы говорите:

Когда данные получены, UART генерирует прерывание HW, а обработчик прерываний считывает данные из UARTи помещает его в буфер FIFO, часто в кольцевой буфер.

На более высоком уровне, когда ОС хочет получать данные, она смотрит на входной буфер, чтобы увидеть, есть ли там какие-либо данные.

Этот механизм обеспечивает другой уровень асинхронности, и это означает, чтоуправление потоком входных данных должно блокировать только удаленный передатчик, когда входной буфер приемника заполнен (почти).


Один из типичных способов обработки вывода заключается в следующем:

UART генерирует прерывание HW, когда оно готово для передачи данных.Затем обработчик прерываний просматривает выходной буфер FIFO и помещает первый элемент в очередь в регистр передачи UART.В противном случае, если нет данных, ожидающих передачи, состояние прерывания очищается.

На более высоком уровне, когда ОС хочет передать данные, она помещает элемент в выходной буфер и гарантирует, что UART сгенерирует HWпрерывать, когда он готов к передаче, что может быть сразу.

Это означает, что поток выходных данных блокируется, только когда буфер вывода заполнен.


Ни один из них на самом деле не требует прерывания SW на уровне обработки UART.Прерывание SW - это удобный способ взаимодействия приложений с ОС.
...