Ввод/вывод – поток данных внутри и вне • Выполняется внешними устройствами – они передают данные и принимают. • Эти устройства должны быть контролируемы • Устройства: o Запоминающие o Передающие

Ввод: мышь, клавиатура Вывод: графики, телефоны Ввод/вывод: консоль, хранилище

Methods of device control Порт: • Управляющий (записывает команды) • Порт данных (читает результат выполненных команд)

MMIO (mind memory input and output): вся/часть памяти устройства сопоставляется с определенной областью адресного устройства. • Нет специальных инструкций для доступа и управления устройствами • Отсутствие “совместной” памяти: операции с адресами MMIO выполняются разными аппаратными средствами, они могут быть более медленными, асинхронными и т.д. • Могут использоваться в качестве “регистров устройств”, как порты: o Регистры управляющие (где мы пишем команды для устройства) o Регистр данных (записываем сюда или читаем отсюда информацию) o Регистр статусов (отображает текущее состояние устройства(обычно сообщает готово ли устройство к работе)

Direct memory access – процесс, когда программа что - то считает, а в это время внешнее устройство потихоньку считывает данные, а после завершения она заявляет о готовности в этом месте памяти появились данные (внешнее устройство внезапно само умеет обращаться к оперативной памяти без участия процессора).

Какие возникают проблемы? • Арбитраж шины, когда наше устройство прочитало данные и положило их в память и это же устройство прочитало свои данные и тоже хочет положить их в память. Адреса памяти разные => не будет конфликта, но если они захотели это одновременно, то кто-то должен принять решение о том, кто первый кладет свои байтики в память. Это и есть арбитраж, но во время использования DMA, т.к. шина данных одна и несколько устройств одновременно хотят что-то в память положить, а вообще хотят получить DMA в своё собственное пользование.

• Как сигнализировать о том, что устройство готово к работе? Самый простой способ – polling. Это опрос устройства, а не готово ли оно? Недостаток: мы постоянно должны это устройство опрашивать.

Polling – это такой способ взаимодействия с внешними устройствами, когда мы их периодически опрашиваем их готовность.

Алгоритм приблизительно такой: 1) настраиваем устройство, чтоб оно совершало ввод/вывод 2) запускается цикл проверки того, что устройство готово

a. если устройство готово, то после I/O, мы можем им еще поуправлять b. если нет, то do with irrelevant 3) Перезапустить, если нужно

Digital Lab Sim – имитация внешнего устройства, которой можно программно управлять в Mars. Содержит два блока: 1) Световые индикаторы (16 штук) 2) Кнопки (16 штук) 1.png

DLS – управление регистрами: есть 4 регистра, в которые мы пишем и 1 регистр, в котором мы читаем. FFFF0010 – левый блок (байт) FFFF0011 – правый блок (байт), каждый бит в вашем байте, который мы записываем в регистр соответствует одной палочке на светодиоде.

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

Bitmap Display в отличии от DLS мапит целый кусок памяти, который соответствует видео памяти на экране. 2.png

Главное в настройке это адрес привязки. Его стоит привязать к memory map.

Ширина и высота очень важны, т.к. их произведение дает размер видеопамяти, Каждый пиксель экрана соответствует одному машинному слову закодированному в RGB (red green blue).

Формулы как вычислять координаты X и Y. X = (offset / 4) % (DisplayWidth / UnitWidth) Y = (offset / 4) / (DisplayWidth / UnitWidth)

-где offset это адрес привязки, UnitWidth и DisplayWidth

3.png