08.1 Conspect (ru)
Ввод/вывод – поток данных внутри и вне
- Выполняется внешними устройствами – они передают данные и принимают.
- Эти устройства должны быть контролируемы
- Устройства:
- Запоминающие
- Передающие
Ввод: мышь, клавиатура Вывод: графики, телефоны Ввод/вывод: консоль, хранилище
Methods of device control Порт:
- Управляющий (записывает команды)
- Порт данных (читает результат выполненных команд)
MMIO (mind memory input and output): вся/часть памяти устройства сопоставляется с определенной областью адресного устройства.
- Нет специальных инструкций для доступа и управления устройствами
- Отсутствие “совместной” памяти: операции с адресами MMIO выполняются разными аппаратными средствами, они могут быть более медленными, асинхронными и т.д.
- Могут использоваться в качестве “регистров устройств”, как порты:
- Регистры управляющие (где мы пишем команды для устройства)
- Регистр данных (записываем сюда или читаем отсюда информацию)
- Регистр статусов (отображает текущее состояние устройства(обычно сообщает готово ли устройство к работе)
Direct memory access – процесс, когда программа что - то считает, а в это время внешнее устройство потихоньку считывает данные, а после завершения она заявляет о готовности в этом месте памяти появились данные (внешнее устройство внезапно само умеет обращаться к оперативной памяти без участия процессора).
Какие возникают проблемы?
Арбитраж шины, когда наше устройство прочитало данные и положило их в память и это же устройство прочитало свои данные и тоже хочет положить их в память. Адреса памяти разные => не будет конфликта, но если они захотели это одновременно, то кто-то должен принять решение о том, кто первый кладет свои байтики в память. Это и есть арбитраж, но во время использования DMA, т.к. шина данных одна и несколько устройств одновременно хотят что-то в память положить, а вообще хотят получить DMA в своё собственное пользование.
- Как сигнализировать о том, что устройство готово к работе? Самый простой способ – polling. Это опрос устройства, а не готово ли оно? Недостаток: мы постоянно должны это устройство опрашивать.
Polling – это такой способ взаимодействия с внешними устройствами, когда мы их периодически опрашиваем их готовность.
Алгоритм приблизительно такой:
- настраиваем устройство, чтоб оно совершало ввод/вывод
- запускается цикл проверки того, что устройство готово
- если устройство готово, то после I/O, мы можем им еще поуправлять
- если нет, то do with irrelevant
- Перезапустить, если нужно
Digital Lab Sim – имитация внешнего устройства, которой можно программно управлять в Mars. Содержит два блока:
- 1.Световые индикаторы (16 штук) 1.Кнопки (16 штук)
- DLS – управление регистрами: есть 4 регистра, в которые мы пишем и 1 регистр, в котором мы читаем.
- FFFF0010 – левый блок (байт)
- FFFF0011 – правый блок (байт), каждый бит в вашем байте, который мы записываем в регистр соответствует одной палочке на светодиоде.
Во время того, как программа проверяет готовность мы используем системный вызов sleep(), тем самым перенаправляя поток выполнения обратно в ядро до истечения времени ожидания.
Bitmap Display в отличии от DLS мапит целый кусок памяти, который соответствует видео памяти на экране.
Главное в настройке это адрес привязки. Его стоит привязать к memory map.
Ширина и высота очень важны, т.к. их произведение дает размер видеопамяти, Каждый пиксель экрана соответствует одному машинному слову закодированному в RGB (red green blue).
Формулы как вычислять координаты X и Y.
X = (offset / 4) % (DisplayWidth / UnitWidth)
Y = (offset / 4) / (DisplayWidth / UnitWidth)
-где offset это адрес привязки, UnitWidth и DisplayWidth