⇤ ← Версия 1 от 2020-01-20 19:33:18
6500
Комментарий:
|
← Версия 2 от 2020-06-24 20:18:48 ⇥
6540
|
Удаления помечены так. | Добавления помечены так. |
Строка 1: | Строка 1: |
= 08.1 Conspect (ru) = | |
Строка 2: | Строка 3: |
• Выполняется внешними устройствами – они передают данные и принимают. • Эти устройства должны быть контролируемы • Устройства: o Запоминающие o Передающие |
* Выполняется внешними устройствами – они передают данные и принимают. * Эти устройства должны быть контролируемы * Устройства: * Запоминающие * Передающие |
Строка 14: | Строка 15: |
• Управляющий (записывает команды) • Порт данных (читает результат выполненных команд) |
* Управляющий (записывает команды) * Порт данных (читает результат выполненных команд) |
Строка 19: | Строка 20: |
• Нет специальных инструкций для доступа и управления устройствами • Отсутствие “совместной” памяти: операции с адресами MMIO выполняются разными аппаратными средствами, они могут быть более медленными, асинхронными и т.д. • Могут использоваться в качестве “регистров устройств”, как порты: o Регистры управляющие (где мы пишем команды для устройства) o Регистр данных (записываем сюда или читаем отсюда информацию) o Регистр статусов (отображает текущее состояние устройства(обычно сообщает готово ли устройство к работе) |
* Нет специальных инструкций для доступа и управления устройствами * Отсутствие “совместной” памяти: операции с адресами MMIO выполняются разными аппаратными средствами, они могут быть более медленными, асинхронными и т.д. * Могут использоваться в качестве “регистров устройств”, как порты: * Регистры управляющие (где мы пишем команды для устройства) * Регистр данных (записываем сюда или читаем отсюда информацию) * Регистр статусов (отображает текущее состояние устройства(обычно сообщает готово ли устройство к работе) |
Строка 29: | Строка 30: |
• Арбитраж шины, когда наше устройство прочитало данные и положило их в память и это же устройство прочитало свои данные и тоже хочет положить их в память. Адреса памяти разные => не будет конфликта, но если они захотели это одновременно, то кто-то должен принять решение о том, кто первый кладет свои байтики в память. Это и есть арбитраж, но во время использования DMA, т.к. шина данных одна и несколько устройств одновременно хотят что-то в память положить, а вообще хотят получить DMA в своё собственное пользование. • Как сигнализировать о том, что устройство готово к работе? Самый простой способ – polling. Это опрос устройства, а не готово ли оно? Недостаток: мы постоянно должны это устройство опрашивать. |
* Арбитраж шины, когда наше устройство прочитало данные и положило их в память и это же устройство прочитало свои данные и тоже хочет положить их в память. Адреса памяти разные => не будет конфликта, но если они захотели это одновременно, то кто-то должен принять решение о том, кто первый кладет свои байтики в память. Это и есть арбитраж, но во время использования DMA, т.к. шина данных одна и несколько устройств одновременно хотят что-то в память положить, а вообще хотят получить DMA в своё собственное пользование. * Как сигнализировать о том, что устройство готово к работе? Самый простой способ – polling. Это опрос устройства, а не готово ли оно? Недостаток: мы постоянно должны это устройство опрашивать. |
Строка 37: | Строка 36: |
1) настраиваем устройство, чтоб оно совершало ввод/вывод 2) запускается цикл проверки того, что устройство готово a. если устройство готово, то после I/O, мы можем им еще поуправлять b. если нет, то do with irrelevant 3) Перезапустить, если нужно |
1. настраиваем устройство, чтоб оно совершало ввод/вывод 1. запускается цикл проверки того, что устройство готово a. если устройство готово, то после I/O, мы можем им еще поуправлять a. если нет, то do with irrelevant 1. Перезапустить, если нужно |
Строка 46: | Строка 44: |
1) Световые индикаторы (16 штук) 2) Кнопки (16 штук) |
1.Световые индикаторы (16 штук) 1.Кнопки (16 штук) |
Строка 52: | Строка 50: |
DLS – управление регистрами: есть 4 регистра, в которые мы пишем и 1 регистр, в котором мы читаем. FFFF0010 – левый блок (байт) FFFF0011 – правый блок (байт), каждый бит в вашем байте, который мы записываем в регистр соответствует одной палочке на светодиоде. |
* DLS – управление регистрами: есть 4 регистра, в которые мы пишем и 1 регистр, в котором мы читаем. * FFFF0010 – левый блок (байт) * FFFF0011 – правый блок (байт), каждый бит в вашем байте, который мы записываем в регистр соответствует одной палочке на светодиоде. |
Строка 69: | Строка 67: |
X = (offset / 4) % (DisplayWidth / UnitWidth) Y = (offset / 4) / (DisplayWidth / UnitWidth) |
* X = (offset / 4) % (DisplayWidth / UnitWidth) * Y = (offset / 4) / (DisplayWidth / UnitWidth) |
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