Выше представлена часть фотошаблона печатной платы (PCB) для встроенной системы. Различные цвета линий соответствуют различным медным слоям на PCB. Светло-желтые прямоугольники являются шелкографией, которая помечает места, где припаивают устройства. Сероватые точки являются монтажными отверстиями. Фотография с разрешения Henrik Christophersen.
Чтобы понять, как оборудование ввода/вывода (В/В) соединяется с процессором, и как программное обеспечение общается с этими устройствами В/В, рассмотрим сейчас архитектуру В/В, которая аналогична тому, что можно найти в современных встроенных устройствах.
Процессоры должны пересылать данные в память и в устройства ввода/вывода (В/В) по шине, как показано на рисунке 2.1. Шина содержит адресную информацию, значение данных для пересылки, и информацию о статусе шины, которая указывает операцию, выполняемую шиной (т.е., чтение или запись).
Современные вычислительные системы являются более сложными, и они в действительности содержат иерархию шин различных типов. Каждая используемая шина имеет различную стоимость и полосу пропускания. Обычно, большая полоса пропускания является более дорогой. Некоторые шины часто требуются для поддержки унаследованных устройств.
Чтобы понять, как память и устройства В/В взаимодействуют с микросхемой процессора, и как программное обеспечение взаимодействует с оборудованием устройства В/В, необходимо понять основы того, как эти данные пересылаются по шинам компьютера. Мы кратко опишем работу двух обычных компьютерных шин, а затем рассмотрим пример архитектуры шины встроенной компьютерной системы.
(рис 2.1) Архитектура с одной шиной использовалась в первых компьютерах. Современные системы являются более сложными и содержат фактически иерархию различных шин
Чтобы понять, как шины действуют в компьютере, и как они используются в оборудовании В/В, мы начнем с рассмотрения шины микропроцессора первого поколения.
Устройство, которое инициирует передачу по шине называется мастером шины или инициатором.
Пример декодера 4-битного адреса, созданного с помощью вентиля AND, показан на рисунке 2.2. При использовании цифровых
(рис 2.2) Схема простого декодера адреса для 4-битного адреса = 0xA
Четыре основные линии состояния шины указывают на тип цикла передачи шины, чтение памяти (MEMR), запись в память (MEMW), чтение В/В (IOR), или запись В/В (
Большинство сигналов шины управляются с помощью логических устройств с тремя состояниями. Вспомните, что логика с тремя состояниями имеет третье состояние, которое является высоким импедансом или отсутствием соединения, как видно на рисунке 2.3. Буфер с тремя состояниями имеет дополнительную управляющую линию, которая заставляет его действовать в точности как обычный буфер или переходить в состояние высокому импедансу (Z используется для импеданса), т.е. отсоединяться. Это позволяет нескольким устройствам управлять шиной, но только по очереди. Только одно устройство в данный момент времени включает свое управление с тремя состояниями, чтобы заставить свои выводы задавать сигналы шины высокими или низкими. Это возможно, так как каждому устройству В/В задан свой собственный уникальный диапазон адресов В/В, на которых оно отвечает.
(рис 2.3) Буфер с тремя состояниями. Для управления большинством сигналов шины должны использоваться выходы логического вентиля с тремя состояниями
Таким образом выводы нескольких вентилей с тремя состояниями, связанные вместе, выполняют ту же логическую функцию, что и мультиплексор, они соединяют один из нескольких вводов с одним выходом. Входы поступают из различных устройств, а выходом в данном случае будет шина.
Два устройства, отвечающие на одном и том же адресе во время операции чтения, будут создавать конфликт шины, приводящий к неправильным значениям шины данных. Ошибка проектирования или дефект в управляющей логике с тремя состояниями устройства может закоротить шину данных и вызвать сбой компьютера. Некоторые более старые платы ISA имели переключатели или перемычки, которые использовались для задания адреса устройства, чтобы избежать конфликта адресации. Это часто требуется, когда в системе используется несколько устройств одного типа.
Первые ПК имели предварительно заданные диапазоны адресов В/В для обычных устройств В/В на
| Диапазон адресов в/в | Устройство в/в |
|---|---|
| 000h - 00Fh | контроллер DMA |
| 020h – 021h | контроллер прерываний |
| 040h- 043h | таймер |
| 060h- 063h | контроллер клавиатуры |
| 070h – 071h | часы реального времени |
| 080h – 083h | регистр страниц DMA |
| 0A0h – 0AFh | 2-ой контроллер прерываний |
| 0C0h – 0CFh | 2-ой контроллер DMA |
| 0E0h – 0FFh | зарезервировано |
| 200h – 207h | игровой адаптер |
| 278h - 27Fh | параллельный принтер (LPTx:) |
| 2E8h - 2EFh | последовательный порт 4 (COM4:) |
| 2F8h - 2FFh | последовательный порт 2 (COM2:) |
| 378h - 37Fh | параллельный принтер ( |
| 3B0h - 3BBh | адаптер |
| 3BCh - 3BFh | параллельный принтер (LPTx:) |
| 3C0h - 3CFh | адаптер VGA/ |
| 3D0h - 3DFh | адаптер |
| 3E8h - 3EFh | последовательный порт 3 (COM3:) |
| 3F0h - 3F7h | контроллер флоппи-диска |
| 3F8h - 3FFh | последовательный порт 1 (COM1:) |
Примечание: Первые ПК декодировали только нижние 10 битов адреса В/В.
(рис 2.4) Пример операции записи В/В шины ISA
Цикл записи ISA показан на рисунке 2.4. Сначала мастер шины (обычно процессор) посылает адрес памяти или В/В по линиям системного адреса (
Затем сигнал IOWR поддерживается высоким, а целевое устройство (обычно устройство В/В) сохраняет значение шины данных на положительной волне сигнала IOWR. Значение шины данных должно сохраняться в целевом устройстве с помощью регистра, так как оно присутствует только в течение нескольких циклов синхронизации, прежде чем в шине данных появится другое значение. Вспомните, что регистры можно создавать, используя по одному D-триггеру на бит и соединяя все входы.
Мастер-устройство затем освобождает адресную шину и шину данных, выключая свои драйверы с тремя состояниями, чтобы задать для следующего цикла шины. В конце цикла шины новое значение данных будет сохранено в регистре вывода данных целевого устройства для использования внешними устройствами В/В.
Цикл чтения ISA показан на рисунке 2.5. Сначала мастер шины (обычно процессор) посылает адрес памяти или В/В по линиям системного адреса (
(рис 2.5) Пример операции чтения В/В шины ISA
Прерывания и циклы DMA могут запрашиваться устройствами по
Интерфейсы устройств В/В обычно соединяются с шиной. Основным строительным блоком, используемым для интерфейса устройств В/В, является порт В/В (называемый также регистром В/В). Порт входа В/В пересылает внешние данные из устройства В/В в процессор с помощью шины. Порт выхода В/В переносит данные из процессора во внешнее устройство В/В.
Каждое устройство В/В имеет уникальный присвоенный адрес и имеет логическую схему декодера адреса, которая проверяет в шине этот адрес. Сначала посылается значение адреса, так чтобы схема декодера адреса имела стабильный действительный выход, прежде чем управляющие линии шины активируют схему.
Данные входа В/В обычно содержатся в регистре в устройстве В/В. Как видно на рисунке 2.6, когда оборудование интерфейса порта входа В/В декодирует свой адрес на шине, и происходит операция чтения шины В/В, оно помещает значение своих данных в шину, включая свои драйверы с тремя состояниями для управления шиной данных. Должны использоваться три состояния, так как несколько устройств могут совместно использовать и управлять шиной данных (только по очереди). Интегральные схемы, созданные для присоединения к шине, такие как расширители порта В/В, содержат драйверы трех состояний и регистры, необходимые для интерфейса с шиной данных. Некоторые шины (а именно, PCI) мультиплексируют по времени информацию адреса и данных, используя одну шину, и должны будут сохранять значения адреса в регистре.
(рис 2.6) Типичная операция оборудования порта входа В/В. Устройство включает свои драйверы с тремя состояниями, чтобы управлять шиной данных с данными входа устройства В/В, только когда оно декодирует свой адрес и происходит операция чтения шины. Процессор затем сохраняет значение шины данных в регистре
Некоторые шины все еще используют более старую альтернативу для выходов с тремя состояниями, используя специальные логические вентили с открытым стоком или открытыми коллекторными выходами. Мышь и клавиатура PS/2 являются одним из таких примеров. В шине такого типа специальный
Порт вывода В/В пересылает данные из процессора в устройство В/В с помощью шины. Как видно на рисунке 2.7, когда оборудование интерфейса порта вывода В/В декодирует его адрес на шине, и происходит операция записи В/В шины, он пересылает значение шины данных в регистр вывода В/В. Данные вывода должны сохраняться в регистре, так как на шине он присутствует только в течение нескольких циклов синхронизации.
(рис 2.7) Типичная операция оборудования порта В/В. Устройство загружает новые данные в регистр вывода порта В/В, только когда декодирует его адрес, и на шине происходит операция записи
Реальные логические схемы несколько сложнее, чем показанные в этих примерах, так как некоторые сигналы состояния могут быть активными в шине на нижнем уровне, и данные должны передаваться в регистр в конце сигнала записи В/В (а не в начале), когда данные гарантировано будут действительны для задания, и удерживаются на регистре ввода.
Чтобы минимизировать расфазировку синхронизации, вместо пропускания входа синхронизации с помощью вентиля AND, регистр с входом поддерживающим синхронизацию (или нагрузку) обеспечивает меньшую расфазировку синхронизации и минимизирует любые возможные проблемы метастабильности триггера (если возникает дополнительная проблема на выходе вентиля AND, то триггер может увидеть другой "фантомный" сигнал синхронизации в неподходящее время). При таком подходе команда записи В/В будет служить в качестве сигнала синхронизации, а выход декодера в качестве средства запуска. На
Некоторые встроенные устройства могут требовать своих собственных специальных аппаратных устройств В/В. Существует несколько доступных вариантов. Вместо вычерчивания схем на уровне вентиля, поставщики микросхем и разработчики встроенных систем обычно проектируют оборудование В/В с помощью средств CAD, используя язык описания оборудования (
В качестве примера конструкции устройства В/В на основе AEN=1 указывает на операцию DMA. В
-- Декодер адреса на основе VHDL для for 0x3E0
PORT_IO_DECODE <= '1' WHEN ADDRESS = X"3E0" AND
AEN='0' ELSE '0';
В
-- Порт ввода В/В на основе VHDL - используйте буферы
-- с тремя состояниями
DATA <= PORT_DATA_IN WHEN PORT_IO_DECODE = '1' AND
IOR = '0' ELSE "ZZZZZZZZ";
Для регистров в
-- Порт вывода В/В на основе VHDL – используйте регистр -- (с помощью DFF) PROCESS BEGIN -- синхронизация на положительном крае ISA IOW WAIT UNTIL IOW'EVENT AND IOW='1'; -- используйте выход декодера адреса для активации -- синхронизации DFF IF PORT_IO_DECODE = '1' THEN -- сохраните данные на шине данных ISA в регистре PORT_DATA_OUT <= DATA; END IF; END PROCESS;
Использование
Другие шины первого поколения микропроцессора аналогичны. Несколько других интерфейсов устройств, имеющихся в ПК, по-прежнему имеют сигналы, похожие на ISA, так как они были первоначально получены из нее. Отметим, что в примерах цикла
По мере того как процессоры и память становятся быстрее, полоса пропускания
Когда используется операционная система, низкоуровневый код драйвера устройства обычно взаимодействует с портами В/В, и приложения пользователей вызывают эти драйверы устройств с помощью API OC. Для разработки кода драйвера устройства большинство компиляторов C/C++ позволяют использовать встраиваемый язык ассемблера. К сожалению, использование языка ассемблера означает, что код не будет переноситься на другой процессор. Это также затрудняет понимание кода для других разработчиков.
На процессорах X86 должны использоваться две специальные машинные инструкции для передачи данных в порты В/В. Инструкция IN считывает данные из порта В/В, а инструкция OUT записывает данные в порт В/В. Для этих инструкций X86 16-битный _asm указывает на язык ассемблера.
//Процедура ввода В/В X86 // Процедура вывода В/В X86 I/
__asm{ __asm{
mov dx,IO_address mov dx,IO_address
in al, dx mov al,IO_data
mov IO_data,al out dx, al
} }
На многих процессорах эти инструкции В/В являются также привилегированными и могут перехватываться в оборудовании с помощью задания
Для разработки кода драйвера устройства большинство компиляторов C/C++ имеют специальные вызовы функций, которые могут читать и записывать в порты В/В. В Windows Embedded CE, использующей CE
Эти вызовы функций обычно находятся только в низкоуровневых драйверах устройств В/В. При таком подходе код будет легко переноситься на другие процессоры и будет легче для чтения и понимания (особенно для тех, кто не знает язык ассемблера процессора). C# не имеет таких функций, но может вызывать функции C/C++, которые определены в библиотеке *.dll, с помощью специального средства [DLLIMPORT] P/invoke.
Так как ограничения полосы пропускания и размера адресации памяти шин первого поколения, таких как ISA, стали очевидны, были предложены несколько новых стандартов шин. В начале 1990-х компания Intel представила шину PCI (Взаимосвязь Периферийных Компонентов). Эта шина стала наиболее широко используемым стандартом и сегодня развитием стандарта PCI занимается организация PCI
PCI использует 32-битную мультиплексную шину адреса и данных, AD[31:0]. В цикле шины PCI, во время первого такта линии AD содержат данные. Это сокращает число контактов, необходимых на разъемах и снижает стоимость. Это также означает, что целевые устройства должны иметь регистр для хранения адреса и значений команды шины для всего цикла шины и машины состояний, которая знает, какой происходит такт (в отличие от простого интерфейса шины для целей ISA, которым требуется только комбинационная логика (т.е., вентили)).
PCI поддерживает также пересылку пакетов данных. В пакете PCI начальный адрес посылается во время первого такта (фаза адреса), а данные пересылаются из последовательных адресов (фаза данных) при каждом новом такте.
Сигнал кадра PCI (FRAME) сообщает о новой фазе адреса. Посылается только один начальный адрес, поэтому оборудование целевого интерфейса должно увеличивать сохраненное значение адреса.
Данные пересылаются между инициатором и целью. Инициатор управляет сигналами активации команды/байта PCI (C/BE[3:0]) во время фазы адреса для сообщения о типе передачи (чтение памяти, запись памяти, чтение В/В, запись В/В, и т.д.) как показано в таблице 2.2. Во время фазы данных сигналы C/BE[3:0] служат в качестве активации байта для указания, какие байты данных являются действительными. Как инициатор, так и цель могут вставлять состояния ожидания (добавляют дополнительные такты для замедления) в передачу данных, снимая контроль сигналов PCI инициатор готов (IRDY) и цель готова (TRDY).
| Команда шины PCI | C/BE |
|---|---|
| подтверждение прерывания | 0000 |
| специальный цикл | 0001 |
| чтение В/В | 0010 |
| запись В/В | 0011 |
| зарезервировано | 0100 |
| зарезервировано | 0101 |
| чтение памяти | 0110 |
| запись памяти | 0111 |
| зарезервировано | 1000 |
| зарезервировано | 1001 |
| чтение конфигурации | 1010 |
| запись конфигурации | 1011 |
| многократное чтение записи | 1100 |
| цикл двойного адреса | 1101 |
| линия чтения памяти | 1110 |
| чтение памяти и аннулирование | 1111 |
(рис 2.8) Пример цикла шины PCI выполнения операции чтения пакета
| Такт | Описание операции чтения PCI |
|---|---|
| 0 | Шина простаивает |
| 1 | Инициатор задает FRAME низким, помещая адрес на линии адреса/данных (AD), и команду шины (чтение) на линии команды/активации байта (C/BE) (фаза адреса). |
| 2 | Инициатор определяет три состояния адреса и ожидает от цели возврата значения данных, активируя свои драйверы трех состояний. Низкое состояние Device Select (DEVSEL) указывает, что целевое устройство декодировало свой диапазон адресов и отвечает на команду. Цель переводит TRDY в высокое состояние, чтобы сообщить, что цели требуется еще один такт, чтобы переслать данные (фаза данных) |
| 3 | Цель пересылает значение данных и задает для готовности цели (TRDY) низкое состояние, чтобы сообщить, что данные действительны. Когда оба сигнала IRDY и TRDY имеют состояние низкое, происходит передача данных. |
| 4 | Цель задает для TRDY состояние высокое, чтобы сообщить, что ей требуется дополнительный такт для следующей передачи данных. |
| 5 | Происходит вторая передача данных, когда оба сигнала TRDY и IRDY находятся в низком состоянии. Инициатор сохраняет данные цели. |
| 6 | Цель направляет значение данных, а инициатор запрашивает дополнительный такт, задавая состояние сигнала IRDY высоким. |
| 7 | Инициатор задает сигнал низким, чтобы завершить третью передачу данных. Инициатор сохраняет значение данных цели. Инициатор направляет высокий сигнал FRAME в конце фазы данных. |
| 8 | Все сигналы шины прошли через три состояния или были направлены в неактивное состояние. |
(рис 2.9) Пример цикла шины PCI выполнения операции записи пакета
| Такт | Описание операции записи PCI |
|---|---|
| 0 | Шина простаивает |
| 1 | Инициатор задает сигнал FRAME низким, помещает адрес на линии адреса /данных (AD), и команду шины (запись) на линии команды /активации байта (C/BE) (фаза адреса). |
| 2 | Инициатор помещает данные на линии AD и активирует байт на линиях C/BE, низкий сигнал выбора устройства (DEVSEL) указывает, что целевое устройство декодировало свой диапазон адресов, и он отвечает команде. Когда оба сигнала IRDY и TRDY будут низкими, цель сохраняет данные (фаза данных). |
| 3 | Инициатор направляет новые данные и активирует байт. Когда оба сигнала IRDY и TRDY будут низкими, происходит передача данных и цель сохраняет данные. |
| 4 | Инициатор задает сигнал IRDY высоким, а цель задает TRDY запрашивающим дополнительный такт. |
| 5 | Инициатор направляет новые данные и активирует байт и задает сигнал IRDY низким. Инициатор задает сигнал FRAME высоким, указывая на окончание передачи данных. |
| 6 | Цель направляет значение данных, а инициатор запрашивает дополнительный такт для задания сигнала IRDY высоким. |
| 7 | Инициатор задает сигнал IRDY низким, чтобы завершить третью передачу данных. Цель сохраняет значение данных. |
| 8 | Все сигналы шины прошли через три состояния или были направлены в неактивное состояние. |
Синхронизация по времени шины PCI для пакетного цикла часто представляется в формате вида 3-2-2-2. Это означает, что первая передача данных занимает 3 такта (включая фазу адреса), а три следующие передачи данных занимают каждая по 2 такта. Шина PCI поддерживает также прерывания и контроллеры DMA (сигналы INTx, REQ, и GNT). Стандарт
В последнее время графические платы начали потреблять большую часть доступной полосы пропускания шины PCI, поэтому они были перенесены на новую шину Accelerated
Для поддержки автоматической конфигурации оборудования, каждое устройство PCI содержит область конфигурации, размером 256 байтов. При включении питания устройства PCI могут самостоятельно сообщать информацию о производителе и типе устройства, чтобы помочь операционной системе найти и загрузить правильные драйверы устройств. Устройства PCI, которые отображают в память и адресное пространство В/В, можно запрограммировать для ответа на различные базовые адреса и прерывания. Это позволяет программному обеспечению операционной системы загружать драйверы и присваивать адреса и прерывания автоматически во время включения питания. Перечисление является термином, который используется для описания этого процесса. Это исключает необходимость устанавливаемых вручную перемычек и переключателей. Операционная система обычно предоставляет драйвер, который обрабатывает перечисление, но драйверы устройств по прежнему нужны для каждого устройства PCI на шине.
Недавно была представлена шина
Существует ряд других стандартов высокоскоростных шин, включая
Согласование по времени, длина шины, нагрузка (число соединенных с шиной устройств), и окончание все являются критически важными на современных шинах микропроцессоров, и необходимо понимать и детально проверять требования при проектировании нового оборудования, и даже при прокладке трассировки печатной платы для шины. Многие шины требуют внешнего резистора на каждой сигнальной линии для правильного окончания. Полные спецификации стандартов шин могут занимать несколько сотен страниц и доступны для разработчиков оборудования из различных источников. Полностью совместимый интерфейс PCI требует более десяти тысяч
Современные компьютерные системы содержат иерархию шин. Каждая шина имеет различный набор компромиссов между шириной полосы пропускания и стоимостью. Шина процессора и памяти является шиной с самой широкой полосой пропускания и эти соединения могут иметь длину только в пару дюймов с некоторыми устройствами памяти. Мост шины используется для соединения сигналов одного типа шины с другим. Большинство систем имеют один или несколько мостов для преобразования сигналов из контактов процессора в шины, которые содержат устройства В/В.
Типичная аппаратная система совместимая с ПК, созданная для встроенных устройств с помощью Vortex86 System-on-a-chip (
(рис 2.10) Блочная диаграмма конструкции встроенного ПК на основе Vortex86
Традиционный северный мост соединяется с контактами процессора и предоставляет шину памяти для соединения с
Большинство устройств В/В на порядки величин медленнее процессора. Линии квитирования устройства В/В должны использоваться для синхронизации каждой передачи данных В/В. Каждое устройство В/В задает линию квитирования оборудования (т.е., ввод готов, вывод готов), когда будет готово к передаче данных. Перед каждой новой передачей данных в порт данных устройств В/В, процессор или другое оборудование должно проверить, что устройство В/В готово, считывая и проверяя линию квитирования устройства. Биты линии квитирования обычно соединяются с другим портом В/В, называемым портом статуса. Обычно порт статуса устройства имеет следующий адрес В/В после порта данных В/В (это также экономит оборудование декодера адреса, так как оно может совместно использоваться несколькими последовательными адресами). Имеется три основных подхода, используемых для передачи данных в устройства В/В. Это программируемый В/В (называемый также опросным или программно управляемым В/В), управляемый прерываниями В/В, и прямой доступ к памяти (DMA). Каждый имеет слегка различное множество аппаратных/программных компромиссов и требований.
В программируемом В/В процессор должен прочитать и сравнить биты готовности В/В с правильным значением перед любой передачей данных. Это требует чтения порта статуса, маскирования бита готовности с помощью побитовой операции AND ("" в C), проверки правильного значения бита готовности, и циклического повторения операций, пока устройство будет готово, как показано в примере 2.2.
// цикл пока готовность выхода =1
do {
status = read_IO_port(status_port_IO_address);
output_ready = status 0x01;
}
while (output_ready == 0);
// готово, поэтому выводим новое значение данных
write_IO_port(data_port_IO_address, data_value);
Когда устройство готово, процессор затем вводит или выводит значение данных на устройство В/В. Когда процессор считывает или записывает порт данных, линия квитирования обычно сбрасывается в ноль оборудованием.
Такой подход обычно ограничен простыми системами, имеющими только несколько устройств В/В, так как имеется значительная перегрузка процессора, который должен постоянно в программном обеспечении циклически проверять биты готовности всех устройств В/В. Во многих случаях это не позволяет также процессору переходить в режимы экономии энергии, что является важным фактором для работающих от батарей устройств. В мультизадачных ОС для В/В обычно используются другие методы, которые требуют меньшей нагрузки на процессор, и освобождают время процессора для выполнения других процессов.
Для управляемого прерываниями В/В сигналы готовности В/В используются для
(рис 2.11) Когда происходит прерывание, после окончания выполнения текущей инструкции, управление передается соответствующей процедуре обслуживания прерывания (ISR). ISR выполняет затем необходимые операции В/В, чтобы снять прерывание и переслать данные. ISR возвращает управление назад следующей инструкции в прерванном процессе, когда завершается. Чтобы сократить задержку прерывания, некоторые ISR могут запускать поток службы прерывания (IST) сразу перед возвратом, чтобы завершить некоторые задачи позже
Использование прерываний исключает циклы ожидания готовности В/В процессором, которые требуются в программном В/В. Процедура службы прерываний пересылает данные, снимает сигнал прерывания и возвращает управление. Процедуры прерываний должны вначале сохранить все регистры в стеке, обработать прерывание, восстановить значения регистров из стека, и затем вернуть управление в код, который был прерван, используя адрес возврата прерывания, хранящийся в стеке.
Таким образом
Специальное оборудование, называемое контроллером прерываний, используется для активации/деактивации и задания приоритетов нескольких сигналов прерываний. Многие процессоры имеют векторную систему прерываний. В случае
Некоторые критически важные разделы кода (называемые нереентерабельными) могут требовать, чтобы прерывания были отключены. Большинство процессоров имеют машинную инструкцию для включения и отключения прерываний. Время задержки прерывания задается самой длинной инструкцией или самым длинным блоком кода, который отключает прерывания.
Время выполнения
Оборудование контроллера прерываний необходимо для задания приоритетов прерываний и включения/отключения каждого сигнала прерывания. Для прерываний нужны также дополнительные сигналы шины. Для сигналов прерываний используют на
Большинство компиляторов C/C++ имеют специальные функции для настройки
Контроллер прямого доступа к памяти (DMA) является специальным оборудованием, которое передает блоки данных непосредственно в/из памяти и устройства В/В. Контроллер DMA требует машины состояний с указателем адреса и счетчиком. Контроллер DMA функционирует как мастер шины. Подобно процессору он может служить в качестве мастера шины и инициировать циклы шины. Оборудование контроллера DMA автоматически ведет обратный отсчет числа значений данных и настраивает свой указатель адреса, когда каждое новое значение данных передается по шине.
Процессор непосредственно не вовлечен в операцию передачи DMA, когда она начинается. Так как контроллер(ы) DMA и процессор должны совместно использовать шину, требуется арбитражное оборудование шины для управления доступом к шине (т.е., получит ли следующий цикл шины контроллер DMA или процессор). Контроллер DMA прерывает процессор, когда его передача блока завершается, и его счетчик достигает нуля. Процессор затем программирует
(рис 2.14) Во время цикла шины DMA, контроллер DMA служит в качестве контроллера шины, а процессор отсоединяется (три-состояния) от шины. Для DMA требуется арбитражное оборудование шины
Для поддержки DMA требуются дополнительные сигналы шины. Контроллеры DMA должны запрашивать цикл шины и ждать, пока он не будет предоставлен арбитражным оборудованием шины. На
В целях безопасности ОС должна контролировать все оборудование DMA. DMA наиболее эффективен, когда используется для высокоскоростных устройств блочной передачи, таких как дисковые устройства (диски пересылают секторы) и сетевых интерфейсов (пересылают пакеты). В идеальной системе несколько контроллеров DMA и процессор будут действовать параллельно, позволяя совмещать вычисления на процессоре с операциями пересылки В/В DMA. Когда один процесс занят, ожидая завершения своих операций В/В DMA, процессор может выполнять полезные вычисления на другом процессе.
В Windows Embedded CE библиотека CEDDK и ядро имеют несколько функций, которые используются для поддержки DMA.
Операционные системы предоставляют поддержку для нижележащего оборудования В/В. Многие устройства В/В могут поддерживаться в прикладных программах, используя вызовы API основной файловой системы. Одним из важных свойств операционной системы является поддержка, которую она предоставляет для В/В файловой системы. Это обеспечивает единообразное логическое представление хранения информации. Различные устройства памяти и множество устройств В/В (включая последовательные и параллельные порты) могут использовать единый интерфейс API для чтения и записи данных. Обычно вызовы API ОС поддерживают следующие пять базовых файловых операций:
Open (или Create ): Для операции чтения (read) на существующем файле операция open (открыть) находит файл, для операции записи ( write ) она ищет доступное пространство на устройстве памяти и обычно выделяет пространство буфера для обработки файловых пересылок. Имя файла передается при вызове open. Для операций В/В некоторых устройств, таких как последовательный порт, имя файла является именем устройства и допускается только одна операция Open в данный момент, так как устройство требует монопольного доступа.
Read: Следующий блок данных считывается из открытого файла. Аргументами являются идентификатор файла или
Write: Следующий блок данных записывается в открытый файл. Аргументами являются идентификатор файла или
Seek: Перемещение в определенную позицию файла. Аргумент обычно является номером записи для поиска. Поиск (seek) выполняется значительно быстрее, чем чтение несколько раз для перемещения к определенной записи в файле. Обычно операция поиска не поддерживается для всех типов файлов и устройств.
Close: Закрывает открытый файл. Для операции записи, операция close выталкивает все буферы записи и обновляет записи последнего каталога для нового файла. Освобождает также внутреннее буферное пространство файла. Операция close требуется в большинстве операционных систем. В некоторых, но не во всех операционных системах, при завершении процесса все открытые файлы процессов автоматически закрываются.
В большинстве случаев все эти функции возвращают коды ошибок, которые необходимо проверять в приложении. В Windows Embedded CE, эти файловые операции предоставляют функции CreateFile, , WriteFile, SetFilePointer и CloseHandle. Посмотрите в оперативной справке дополнительную информацию о параметрах этих функций.
Встроенные системы, созданные для международных рынков, которые требуют поддержки различных языков обычно используют 16-битный стандарт кодирования символов Unicode. Многие периферийные устройства В/В используют 8-битный код символов ASCII, показанный в таблице 2.3. Первые 128 символов Unicode совпадают с символами ASCII, но с дополнительным ведущим нулевым байтом перед ними. Таблицы преобразования можно найти по адресу www.unicode.org/charts/ . (Английский язык использует Basic Latin Script)
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F | |
| 0 | NUL | ENQ | ACK | BS | HT | LF | VT | FF | CR | SO | SI | |||||
| 1 | DLE | DC1 | DC2 | DC3 | DC4 | SYN | CAN | EM | SUB | ESC | FS | GS | RS | US | ||
| 2 | SP | ! | " | # | $ | % | ' | ( | ) | * | + | , | - | . | / | |
| 3 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | : | ; | < | = | > | ? |
| 4 | @ | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O |
| 5 | P | Q | R | S | T | U | V | W | X | Y | Z | [ | \ | ] | ^ | _ |
| 6 | ` | a | b | c | d | e | f | g | h | i | j | k | l | m | n | o |
| 7 | p | q | r | s | t | u | v | w | x | y | z | { | | | } | ~ | DEL |
Американский стандартный код обмена информацией (ASCII) является стандартным семибитным кодом для компьютерного оборудования, принятым в 1968 г. В таблице 2.3 найдите символ "A". Он находится на пересечении строки 4 и столбца 1, поэтому шестнадцатеричное значение для "A" будет 0x41. Восьмой бит иногда используется для контроля по четности в устройствах коммуникации. Коды меньше 0x20 называются управляющими кодами. Управляющие коды выполняют операции, отличные от печати символа. Некоторые из наиболее распространенных управляющих кодов описаны ниже:
LF (line feed) - Перемещает курсор вниз на следующую строку, но не влево. В C/C++ используется "\n".
CR (carriage return) - Перемещает курсор до конца влево, но не переходит на следующую строку. В C/C++ используется "\r". Для новой строки используются оба символа CR и LF.
SP (space) печатает пробел и курсор перемещается в следующую позицию символа.
FF (form feed) - Перемещает бумагу к началу следующей страницы на принтерах или очищает окно вывода текста на терминалах. В C/C++ используется "\f".
- Вызывает звуковой сигнал на терминалах и в программах эмуляции терминалов.
BS (backspace) - Смещает курсор в обратном направлении (влево) на одну позицию. В C/C++ используется "\b".
HT (horizontal tab) - Перемещает курсор вправо до следующей позиции табуляции. Интервал позиций табуляции зависит от устройства вывода, но часто равен 8 или 10.
VT (vertical tab) - В C/C++ используется "\v".
ESC (escape) – Иногда используется для завершения команд программы.
NUL (null) – Все нули, иногда используется для окончания строк.
Отметим, что символы десятичных цифр от "0" до "9" лежат в диапазоне от 0x30 до 0x39. Код задан так, что "A"<"B"<"C" … , поэтому цифровые значения можно использовать для алфавитного упорядочивания. Единственный бит в коде изменяет регистр символа (т.е., "A" и "a"), когда нажимается клавиша shift. Клавиша ctrl также изменяет один бит в коде. Расширенные коды ASCII используют восемь битов для вывода еще других 128 специальных графических символов. Существует несколько различных стандартов для этих новых графических символов, поэтому подробнее проверяйте руководство устройства. Первые 128 символов совпадают с 7-битным исходным стандартом кода ASCII. В Unicode первые 128 символов совпадают с символами ASCII с нулевым старшим байтом, чтобы поместить его в 16-битов.
Windows Embedded CE использует по умолчанию кодировку Unicode для всех символьных строк. В языке C встроенный тип char использует 8-битное кодирование ASCII, но тип TCHAR использует 16-битный Unicode. Можно использовать специальный вызов макро _T или _TEXT для инициализации строки Unicode из символьной строки C. В качестве примера, _T("hi") порождает 4-байтную строку Unicode со значением 0x00, 0x68, 0x00, и 0x69. Функции C\C++, WideCharToMultiByte и MultiByteToWideChar, можно использовать для преобразования символьных строк в/из ASCII и Unicode. Функция lstrlen возвращает символьную длину строки Unicode. Смотрите оперативную справочную систему для получения дополнительной информации о параметрах этих функций.
(рис 2.13) Логический анализатор Tektronix настроен для захвата и декодирования сигналов шины PCI. Этот логический анализатор является на самом деле встроенной системой, которая выполняет Windows XP. Специальная плата адаптера посредника PCI используется для быстрого соединения контактных датчиков со специальной программой ПЗУ логического анализатора. Изображения с разрешения Nexus Technology
Выше представлена часть фотошаблона печатной платы (PCB) для встроенной системы. Различные цвета линий соответствуют различным медным слоям на PCB. Светло-желтые прямоугольники являются шелкографией, которая помечает места, где припаивают устройства. Сероватые точки являются монтажными отверстиями. Фотография с разрешения Henrik Christophersen.
Чтобы понять, как оборудование ввода/вывода (В/В) соединяется с процессором, и как программное обеспечение общается с этими устройствами В/В, рассмотрим сейчас архитектуру В/В, которая аналогична тому, что можно найти в современных встроенных устройствах.
Процессоры должны пересылать данные в память и в устройства ввода/вывода (В/В) по шине, как показано на рисунке 2.1. Шина содержит адресную информацию, значение данных для пересылки, и информацию о статусе шины, которая указывает операцию, выполняемую шиной (т.е., чтение или запись).
Современные вычислительные системы являются более сложными, и они в действительности содержат иерархию шин различных типов. Каждая используемая шина имеет различную стоимость и полосу пропускания. Обычно, большая полоса пропускания является более дорогой. Некоторые шины часто требуются для поддержки унаследованных устройств.
Чтобы понять, как память и устройства В/В взаимодействуют с микросхемой процессора, и как программное обеспечение взаимодействует с оборудованием устройства В/В, необходимо понять основы того, как эти данные пересылаются по шинам компьютера. Мы кратко опишем работу двух обычных компьютерных шин, а затем рассмотрим пример архитектуры шины встроенной компьютерной системы.
(рис 2.1) Архитектура с одной шиной использовалась в первых компьютерах. Современные системы являются более сложными и содержат фактически иерархию различных шин
Чтобы понять, как шины действуют в компьютере, и как они используются в оборудовании В/В, мы начнем с рассмотрения шины микропроцессора первого поколения.
Устройство, которое инициирует передачу по шине называется мастером шины или инициатором.
Пример декодера 4-битного адреса, созданного с помощью вентиля AND, показан на рисунке 2.2. При использовании цифровых
(рис 2.2) Схема простого декодера адреса для 4-битного адреса = 0xA
Четыре основные линии состояния шины указывают на тип цикла передачи шины, чтение памяти (MEMR), запись в память (MEMW), чтение В/В (IOR), или запись В/В (
Большинство сигналов шины управляются с помощью логических устройств с тремя состояниями. Вспомните, что логика с тремя состояниями имеет третье состояние, которое является высоким импедансом или отсутствием соединения, как видно на рисунке 2.3. Буфер с тремя состояниями имеет дополнительную управляющую линию, которая заставляет его действовать в точности как обычный буфер или переходить в состояние высокому импедансу (Z используется для импеданса), т.е. отсоединяться. Это позволяет нескольким устройствам управлять шиной, но только по очереди. Только одно устройство в данный момент времени включает свое управление с тремя состояниями, чтобы заставить свои выводы задавать сигналы шины высокими или низкими. Это возможно, так как каждому устройству В/В задан свой собственный уникальный диапазон адресов В/В, на которых оно отвечает.
(рис 2.3) Буфер с тремя состояниями. Для управления большинством сигналов шины должны использоваться выходы логического вентиля с тремя состояниями
Таким образом выводы нескольких вентилей с тремя состояниями, связанные вместе, выполняют ту же логическую функцию, что и мультиплексор, они соединяют один из нескольких вводов с одним выходом. Входы поступают из различных устройств, а выходом в данном случае будет шина.
Два устройства, отвечающие на одном и том же адресе во время операции чтения, будут создавать конфликт шины, приводящий к неправильным значениям шины данных. Ошибка проектирования или дефект в управляющей логике с тремя состояниями устройства может закоротить шину данных и вызвать сбой компьютера. Некоторые более старые платы ISA имели переключатели или перемычки, которые использовались для задания адреса устройства, чтобы избежать конфликта адресации. Это часто требуется, когда в системе используется несколько устройств одного типа.
Первые ПК имели предварительно заданные диапазоны адресов В/В для обычных устройств В/В на
| Диапазон адресов в/в | Устройство в/в |
|---|---|
| 000h - 00Fh | контроллер DMA |
| 020h – 021h | контроллер прерываний |
| 040h- 043h | таймер |
| 060h- 063h | контроллер клавиатуры |
| 070h – 071h | часы реального времени |
| 080h – 083h | регистр страниц DMA |
| 0A0h – 0AFh | 2-ой контроллер прерываний |
| 0C0h – 0CFh | 2-ой контроллер DMA |
| 0E0h – 0FFh | зарезервировано |
| 200h – 207h | игровой адаптер |
| 278h - 27Fh | параллельный принтер (LPTx:) |
| 2E8h - 2EFh | последовательный порт 4 (COM4:) |
| 2F8h - 2FFh | последовательный порт 2 (COM2:) |
| 378h - 37Fh | параллельный принтер ( |
| 3B0h - 3BBh | адаптер |
| 3BCh - 3BFh | параллельный принтер (LPTx:) |
| 3C0h - 3CFh | адаптер VGA/ |
| 3D0h - 3DFh | адаптер |
| 3E8h - 3EFh | последовательный порт 3 (COM3:) |
| 3F0h - 3F7h | контроллер флоппи-диска |
| 3F8h - 3FFh | последовательный порт 1 (COM1:) |
Примечание: Первые ПК декодировали только нижние 10 битов адреса В/В.
(рис 2.4) Пример операции записи В/В шины ISA
Цикл записи ISA показан на рисунке 2.4. Сначала мастер шины (обычно процессор) посылает адрес памяти или В/В по линиям системного адреса (
Затем сигнал IOWR поддерживается высоким, а целевое устройство (обычно устройство В/В) сохраняет значение шины данных на положительной волне сигнала IOWR. Значение шины данных должно сохраняться в целевом устройстве с помощью регистра, так как оно присутствует только в течение нескольких циклов синхронизации, прежде чем в шине данных появится другое значение. Вспомните, что регистры можно создавать, используя по одному D-триггеру на бит и соединяя все входы.
Мастер-устройство затем освобождает адресную шину и шину данных, выключая свои драйверы с тремя состояниями, чтобы задать для следующего цикла шины. В конце цикла шины новое значение данных будет сохранено в регистре вывода данных целевого устройства для использования внешними устройствами В/В.
Цикл чтения ISA показан на рисунке 2.5. Сначала мастер шины (обычно процессор) посылает адрес памяти или В/В по линиям системного адреса (
(рис 2.5) Пример операции чтения В/В шины ISA
Прерывания и циклы DMA могут запрашиваться устройствами по
Интерфейсы устройств В/В обычно соединяются с шиной. Основным строительным блоком, используемым для интерфейса устройств В/В, является порт В/В (называемый также регистром В/В). Порт входа В/В пересылает внешние данные из устройства В/В в процессор с помощью шины. Порт выхода В/В переносит данные из процессора во внешнее устройство В/В.
Каждое устройство В/В имеет уникальный присвоенный адрес и имеет логическую схему декодера адреса, которая проверяет в шине этот адрес. Сначала посылается значение адреса, так чтобы схема декодера адреса имела стабильный действительный выход, прежде чем управляющие линии шины активируют схему.
Данные входа В/В обычно содержатся в регистре в устройстве В/В. Как видно на рисунке 2.6, когда оборудование интерфейса порта входа В/В декодирует свой адрес на шине, и происходит операция чтения шины В/В, оно помещает значение своих данных в шину, включая свои драйверы с тремя состояниями для управления шиной данных. Должны использоваться три состояния, так как несколько устройств могут совместно использовать и управлять шиной данных (только по очереди). Интегральные схемы, созданные для присоединения к шине, такие как расширители порта В/В, содержат драйверы трех состояний и регистры, необходимые для интерфейса с шиной данных. Некоторые шины (а именно, PCI) мультиплексируют по времени информацию адреса и данных, используя одну шину, и должны будут сохранять значения адреса в регистре.
(рис 2.6) Типичная операция оборудования порта входа В/В. Устройство включает свои драйверы с тремя состояниями, чтобы управлять шиной данных с данными входа устройства В/В, только когда оно декодирует свой адрес и происходит операция чтения шины. Процессор затем сохраняет значение шины данных в регистре
Некоторые шины все еще используют более старую альтернативу для выходов с тремя состояниями, используя специальные логические вентили с открытым стоком или открытыми коллекторными выходами. Мышь и клавиатура PS/2 являются одним из таких примеров. В шине такого типа специальный
Порт вывода В/В пересылает данные из процессора в устройство В/В с помощью шины. Как видно на рисунке 2.7, когда оборудование интерфейса порта вывода В/В декодирует его адрес на шине, и происходит операция записи В/В шины, он пересылает значение шины данных в регистр вывода В/В. Данные вывода должны сохраняться в регистре, так как на шине он присутствует только в течение нескольких циклов синхронизации.
(рис 2.7) Типичная операция оборудования порта В/В. Устройство загружает новые данные в регистр вывода порта В/В, только когда декодирует его адрес, и на шине происходит операция записи
Реальные логические схемы несколько сложнее, чем показанные в этих примерах, так как некоторые сигналы состояния могут быть активными в шине на нижнем уровне, и данные должны передаваться в регистр в конце сигнала записи В/В (а не в начале), когда данные гарантировано будут действительны для задания, и удерживаются на регистре ввода.
Чтобы минимизировать расфазировку синхронизации, вместо пропускания входа синхронизации с помощью вентиля AND, регистр с входом поддерживающим синхронизацию (или нагрузку) обеспечивает меньшую расфазировку синхронизации и минимизирует любые возможные проблемы метастабильности триггера (если возникает дополнительная проблема на выходе вентиля AND, то триггер может увидеть другой "фантомный" сигнал синхронизации в неподходящее время). При таком подходе команда записи В/В будет служить в качестве сигнала синхронизации, а выход декодера в качестве средства запуска. На
Некоторые встроенные устройства могут требовать своих собственных специальных аппаратных устройств В/В. Существует несколько доступных вариантов. Вместо вычерчивания схем на уровне вентиля, поставщики микросхем и разработчики встроенных систем обычно проектируют оборудование В/В с помощью средств CAD, используя язык описания оборудования (
В качестве примера конструкции устройства В/В на основе AEN=1 указывает на операцию DMA. В
-- Декодер адреса на основе VHDL для for 0x3E0
PORT_IO_DECODE <= '1' WHEN ADDRESS = X"3E0" AND
AEN='0' ELSE '0';
В
-- Порт ввода В/В на основе VHDL - используйте буферы
-- с тремя состояниями
DATA <= PORT_DATA_IN WHEN PORT_IO_DECODE = '1' AND
IOR = '0' ELSE "ZZZZZZZZ";
Для регистров в
-- Порт вывода В/В на основе VHDL – используйте регистр -- (с помощью DFF) PROCESS BEGIN -- синхронизация на положительном крае ISA IOW WAIT UNTIL IOW'EVENT AND IOW='1'; -- используйте выход декодера адреса для активации -- синхронизации DFF IF PORT_IO_DECODE = '1' THEN -- сохраните данные на шине данных ISA в регистре PORT_DATA_OUT <= DATA; END IF; END PROCESS;
Использование
Другие шины первого поколения микропроцессора аналогичны. Несколько других интерфейсов устройств, имеющихся в ПК, по-прежнему имеют сигналы, похожие на ISA, так как они были первоначально получены из нее. Отметим, что в примерах цикла
По мере того как процессоры и память становятся быстрее, полоса пропускания
Когда используется операционная система, низкоуровневый код драйвера устройства обычно взаимодействует с портами В/В, и приложения пользователей вызывают эти драйверы устройств с помощью API OC. Для разработки кода драйвера устройства большинство компиляторов C/C++ позволяют использовать встраиваемый язык ассемблера. К сожалению, использование языка ассемблера означает, что код не будет переноситься на другой процессор. Это также затрудняет понимание кода для других разработчиков.
На процессорах X86 должны использоваться две специальные машинные инструкции для передачи данных в порты В/В. Инструкция IN считывает данные из порта В/В, а инструкция OUT записывает данные в порт В/В. Для этих инструкций X86 16-битный _asm указывает на язык ассемблера.
//Процедура ввода В/В X86 // Процедура вывода В/В X86 I/
__asm{ __asm{
mov dx,IO_address mov dx,IO_address
in al, dx mov al,IO_data
mov IO_data,al out dx, al
} }
На многих процессорах эти инструкции В/В являются также привилегированными и могут перехватываться в оборудовании с помощью задания
Для разработки кода драйвера устройства большинство компиляторов C/C++ имеют специальные вызовы функций, которые могут читать и записывать в порты В/В. В Windows Embedded CE, использующей CE
Эти вызовы функций обычно находятся только в низкоуровневых драйверах устройств В/В. При таком подходе код будет легко переноситься на другие процессоры и будет легче для чтения и понимания (особенно для тех, кто не знает язык ассемблера процессора). C# не имеет таких функций, но может вызывать функции C/C++, которые определены в библиотеке *.dll, с помощью специального средства [DLLIMPORT] P/invoke.
Так как ограничения полосы пропускания и размера адресации памяти шин первого поколения, таких как ISA, стали очевидны, были предложены несколько новых стандартов шин. В начале 1990-х компания Intel представила шину PCI (Взаимосвязь Периферийных Компонентов). Эта шина стала наиболее широко используемым стандартом и сегодня развитием стандарта PCI занимается организация PCI
PCI использует 32-битную мультиплексную шину адреса и данных, AD[31:0]. В цикле шины PCI, во время первого такта линии AD содержат данные. Это сокращает число контактов, необходимых на разъемах и снижает стоимость. Это также означает, что целевые устройства должны иметь регистр для хранения адреса и значений команды шины для всего цикла шины и машины состояний, которая знает, какой происходит такт (в отличие от простого интерфейса шины для целей ISA, которым требуется только комбинационная логика (т.е., вентили)).
PCI поддерживает также пересылку пакетов данных. В пакете PCI начальный адрес посылается во время первого такта (фаза адреса), а данные пересылаются из последовательных адресов (фаза данных) при каждом новом такте.
Сигнал кадра PCI (FRAME) сообщает о новой фазе адреса. Посылается только один начальный адрес, поэтому оборудование целевого интерфейса должно увеличивать сохраненное значение адреса.
Данные пересылаются между инициатором и целью. Инициатор управляет сигналами активации команды/байта PCI (C/BE[3:0]) во время фазы адреса для сообщения о типе передачи (чтение памяти, запись памяти, чтение В/В, запись В/В, и т.д.) как показано в таблице 2.2. Во время фазы данных сигналы C/BE[3:0] служат в качестве активации байта для указания, какие байты данных являются действительными. Как инициатор, так и цель могут вставлять состояния ожидания (добавляют дополнительные такты для замедления) в передачу данных, снимая контроль сигналов PCI инициатор готов (IRDY) и цель готова (TRDY).
| Команда шины PCI | C/BE |
|---|---|
| подтверждение прерывания | 0000 |
| специальный цикл | 0001 |
| чтение В/В | 0010 |
| запись В/В | 0011 |
| зарезервировано | 0100 |
| зарезервировано | 0101 |
| чтение памяти | 0110 |
| запись памяти | 0111 |
| зарезервировано | 1000 |
| зарезервировано | 1001 |
| чтение конфигурации | 1010 |
| запись конфигурации | 1011 |
| многократное чтение записи | 1100 |
| цикл двойного адреса | 1101 |
| линия чтения памяти | 1110 |
| чтение памяти и аннулирование | 1111 |
(рис 2.8) Пример цикла шины PCI выполнения операции чтения пакета
| Такт | Описание операции чтения PCI |
|---|---|
| 0 | Шина простаивает |
| 1 | Инициатор задает FRAME низким, помещая адрес на линии адреса/данных (AD), и команду шины (чтение) на линии команды/активации байта (C/BE) (фаза адреса). |
| 2 | Инициатор определяет три состояния адреса и ожидает от цели возврата значения данных, активируя свои драйверы трех состояний. Низкое состояние Device Select (DEVSEL) указывает, что целевое устройство декодировало свой диапазон адресов и отвечает на команду. Цель переводит TRDY в высокое состояние, чтобы сообщить, что цели требуется еще один такт, чтобы переслать данные (фаза данных) |
| 3 | Цель пересылает значение данных и задает для готовности цели (TRDY) низкое состояние, чтобы сообщить, что данные действительны. Когда оба сигнала IRDY и TRDY имеют состояние низкое, происходит передача данных. |
| 4 | Цель задает для TRDY состояние высокое, чтобы сообщить, что ей требуется дополнительный такт для следующей передачи данных. |
| 5 | Происходит вторая передача данных, когда оба сигнала TRDY и IRDY находятся в низком состоянии. Инициатор сохраняет данные цели. |
| 6 | Цель направляет значение данных, а инициатор запрашивает дополнительный такт, задавая состояние сигнала IRDY высоким. |
| 7 | Инициатор задает сигнал низким, чтобы завершить третью передачу данных. Инициатор сохраняет значение данных цели. Инициатор направляет высокий сигнал FRAME в конце фазы данных. |
| 8 | Все сигналы шины прошли через три состояния или были направлены в неактивное состояние. |
(рис 2.9) Пример цикла шины PCI выполнения операции записи пакета
| Такт | Описание операции записи PCI |
|---|---|
| 0 | Шина простаивает |
| 1 | Инициатор задает сигнал FRAME низким, помещает адрес на линии адреса /данных (AD), и команду шины (запись) на линии команды /активации байта (C/BE) (фаза адреса). |
| 2 | Инициатор помещает данные на линии AD и активирует байт на линиях C/BE, низкий сигнал выбора устройства (DEVSEL) указывает, что целевое устройство декодировало свой диапазон адресов, и он отвечает команде. Когда оба сигнала IRDY и TRDY будут низкими, цель сохраняет данные (фаза данных). |
| 3 | Инициатор направляет новые данные и активирует байт. Когда оба сигнала IRDY и TRDY будут низкими, происходит передача данных и цель сохраняет данные. |
| 4 | Инициатор задает сигнал IRDY высоким, а цель задает TRDY запрашивающим дополнительный такт. |
| 5 | Инициатор направляет новые данные и активирует байт и задает сигнал IRDY низким. Инициатор задает сигнал FRAME высоким, указывая на окончание передачи данных. |
| 6 | Цель направляет значение данных, а инициатор запрашивает дополнительный такт для задания сигнала IRDY высоким. |
| 7 | Инициатор задает сигнал IRDY низким, чтобы завершить третью передачу данных. Цель сохраняет значение данных. |
| 8 | Все сигналы шины прошли через три состояния или были направлены в неактивное состояние. |
Синхронизация по времени шины PCI для пакетного цикла часто представляется в формате вида 3-2-2-2. Это означает, что первая передача данных занимает 3 такта (включая фазу адреса), а три следующие передачи данных занимают каждая по 2 такта. Шина PCI поддерживает также прерывания и контроллеры DMA (сигналы INTx, REQ, и GNT). Стандарт
В последнее время графические платы начали потреблять большую часть доступной полосы пропускания шины PCI, поэтому они были перенесены на новую шину Accelerated
Для поддержки автоматической конфигурации оборудования, каждое устройство PCI содержит область конфигурации, размером 256 байтов. При включении питания устройства PCI могут самостоятельно сообщать информацию о производителе и типе устройства, чтобы помочь операционной системе найти и загрузить правильные драйверы устройств. Устройства PCI, которые отображают в память и адресное пространство В/В, можно запрограммировать для ответа на различные базовые адреса и прерывания. Это позволяет программному обеспечению операционной системы загружать драйверы и присваивать адреса и прерывания автоматически во время включения питания. Перечисление является термином, который используется для описания этого процесса. Это исключает необходимость устанавливаемых вручную перемычек и переключателей. Операционная система обычно предоставляет драйвер, который обрабатывает перечисление, но драйверы устройств по прежнему нужны для каждого устройства PCI на шине.
Недавно была представлена шина
Существует ряд других стандартов высокоскоростных шин, включая
Согласование по времени, длина шины, нагрузка (число соединенных с шиной устройств), и окончание все являются критически важными на современных шинах микропроцессоров, и необходимо понимать и детально проверять требования при проектировании нового оборудования, и даже при прокладке трассировки печатной платы для шины. Многие шины требуют внешнего резистора на каждой сигнальной линии для правильного окончания. Полные спецификации стандартов шин могут занимать несколько сотен страниц и доступны для разработчиков оборудования из различных источников. Полностью совместимый интерфейс PCI требует более десяти тысяч
Современные компьютерные системы содержат иерархию шин. Каждая шина имеет различный набор компромиссов между шириной полосы пропускания и стоимостью. Шина процессора и памяти является шиной с самой широкой полосой пропускания и эти соединения могут иметь длину только в пару дюймов с некоторыми устройствами памяти. Мост шины используется для соединения сигналов одного типа шины с другим. Большинство систем имеют один или несколько мостов для преобразования сигналов из контактов процессора в шины, которые содержат устройства В/В.
Типичная аппаратная система совместимая с ПК, созданная для встроенных устройств с помощью Vortex86 System-on-a-chip (
(рис 2.10) Блочная диаграмма конструкции встроенного ПК на основе Vortex86
Традиционный северный мост соединяется с контактами процессора и предоставляет шину памяти для соединения с
Большинство устройств В/В на порядки величин медленнее процессора. Линии квитирования устройства В/В должны использоваться для синхронизации каждой передачи данных В/В. Каждое устройство В/В задает линию квитирования оборудования (т.е., ввод готов, вывод готов), когда будет готово к передаче данных. Перед каждой новой передачей данных в порт данных устройств В/В, процессор или другое оборудование должно проверить, что устройство В/В готово, считывая и проверяя линию квитирования устройства. Биты линии квитирования обычно соединяются с другим портом В/В, называемым портом статуса. Обычно порт статуса устройства имеет следующий адрес В/В после порта данных В/В (это также экономит оборудование декодера адреса, так как оно может совместно использоваться несколькими последовательными адресами). Имеется три основных подхода, используемых для передачи данных в устройства В/В. Это программируемый В/В (называемый также опросным или программно управляемым В/В), управляемый прерываниями В/В, и прямой доступ к памяти (DMA). Каждый имеет слегка различное множество аппаратных/программных компромиссов и требований.
В программируемом В/В процессор должен прочитать и сравнить биты готовности В/В с правильным значением перед любой передачей данных. Это требует чтения порта статуса, маскирования бита готовности с помощью побитовой операции AND ("" в C), проверки правильного значения бита готовности, и циклического повторения операций, пока устройство будет готово, как показано в примере 2.2.
// цикл пока готовность выхода =1
do {
status = read_IO_port(status_port_IO_address);
output_ready = status 0x01;
}
while (output_ready == 0);
// готово, поэтому выводим новое значение данных
write_IO_port(data_port_IO_address, data_value);
Когда устройство готово, процессор затем вводит или выводит значение данных на устройство В/В. Когда процессор считывает или записывает порт данных, линия квитирования обычно сбрасывается в ноль оборудованием.
Такой подход обычно ограничен простыми системами, имеющими только несколько устройств В/В, так как имеется значительная перегрузка процессора, который должен постоянно в программном обеспечении циклически проверять биты готовности всех устройств В/В. Во многих случаях это не позволяет также процессору переходить в режимы экономии энергии, что является важным фактором для работающих от батарей устройств. В мультизадачных ОС для В/В обычно используются другие методы, которые требуют меньшей нагрузки на процессор, и освобождают время процессора для выполнения других процессов.
Для управляемого прерываниями В/В сигналы готовности В/В используются для
(рис 2.11) Когда происходит прерывание, после окончания выполнения текущей инструкции, управление передается соответствующей процедуре обслуживания прерывания (ISR). ISR выполняет затем необходимые операции В/В, чтобы снять прерывание и переслать данные. ISR возвращает управление назад следующей инструкции в прерванном процессе, когда завершается. Чтобы сократить задержку прерывания, некоторые ISR могут запускать поток службы прерывания (IST) сразу перед возвратом, чтобы завершить некоторые задачи позже
Использование прерываний исключает циклы ожидания готовности В/В процессором, которые требуются в программном В/В. Процедура службы прерываний пересылает данные, снимает сигнал прерывания и возвращает управление. Процедуры прерываний должны вначале сохранить все регистры в стеке, обработать прерывание, восстановить значения регистров из стека, и затем вернуть управление в код, который был прерван, используя адрес возврата прерывания, хранящийся в стеке.
Таким образом
Специальное оборудование, называемое контроллером прерываний, используется для активации/деактивации и задания приоритетов нескольких сигналов прерываний. Многие процессоры имеют векторную систему прерываний. В случае
Некоторые критически важные разделы кода (называемые нереентерабельными) могут требовать, чтобы прерывания были отключены. Большинство процессоров имеют машинную инструкцию для включения и отключения прерываний. Время задержки прерывания задается самой длинной инструкцией или самым длинным блоком кода, который отключает прерывания.
Время выполнения
Оборудование контроллера прерываний необходимо для задания приоритетов прерываний и включения/отключения каждого сигнала прерывания. Для прерываний нужны также дополнительные сигналы шины. Для сигналов прерываний используют на
Большинство компиляторов C/C++ имеют специальные функции для настройки
Контроллер прямого доступа к памяти (DMA) является специальным оборудованием, которое передает блоки данных непосредственно в/из памяти и устройства В/В. Контроллер DMA требует машины состояний с указателем адреса и счетчиком. Контроллер DMA функционирует как мастер шины. Подобно процессору он может служить в качестве мастера шины и инициировать циклы шины. Оборудование контроллера DMA автоматически ведет обратный отсчет числа значений данных и настраивает свой указатель адреса, когда каждое новое значение данных передается по шине.
Процессор непосредственно не вовлечен в операцию передачи DMA, когда она начинается. Так как контроллер(ы) DMA и процессор должны совместно использовать шину, требуется арбитражное оборудование шины для управления доступом к шине (т.е., получит ли следующий цикл шины контроллер DMA или процессор). Контроллер DMA прерывает процессор, когда его передача блока завершается, и его счетчик достигает нуля. Процессор затем программирует
(рис 2.14) Во время цикла шины DMA, контроллер DMA служит в качестве контроллера шины, а процессор отсоединяется (три-состояния) от шины. Для DMA требуется арбитражное оборудование шины
Для поддержки DMA требуются дополнительные сигналы шины. Контроллеры DMA должны запрашивать цикл шины и ждать, пока он не будет предоставлен арбитражным оборудованием шины. На
В целях безопасности ОС должна контролировать все оборудование DMA. DMA наиболее эффективен, когда используется для высокоскоростных устройств блочной передачи, таких как дисковые устройства (диски пересылают секторы) и сетевых интерфейсов (пересылают пакеты). В идеальной системе несколько контроллеров DMA и процессор будут действовать параллельно, позволяя совмещать вычисления на процессоре с операциями пересылки В/В DMA. Когда один процесс занят, ожидая завершения своих операций В/В DMA, процессор может выполнять полезные вычисления на другом процессе.
В Windows Embedded CE библиотека CEDDK и ядро имеют несколько функций, которые используются для поддержки DMA.
Операционные системы предоставляют поддержку для нижележащего оборудования В/В. Многие устройства В/В могут поддерживаться в прикладных программах, используя вызовы API основной файловой системы. Одним из важных свойств операционной системы является поддержка, которую она предоставляет для В/В файловой системы. Это обеспечивает единообразное логическое представление хранения информации. Различные устройства памяти и множество устройств В/В (включая последовательные и параллельные порты) могут использовать единый интерфейс API для чтения и записи данных. Обычно вызовы API ОС поддерживают следующие пять базовых файловых операций:
Open (или Create ): Для операции чтения (read) на существующем файле операция open (открыть) находит файл, для операции записи ( write ) она ищет доступное пространство на устройстве памяти и обычно выделяет пространство буфера для обработки файловых пересылок. Имя файла передается при вызове open. Для операций В/В некоторых устройств, таких как последовательный порт, имя файла является именем устройства и допускается только одна операция Open в данный момент, так как устройство требует монопольного доступа.
Read: Следующий блок данных считывается из открытого файла. Аргументами являются идентификатор файла или
Write: Следующий блок данных записывается в открытый файл. Аргументами являются идентификатор файла или
Seek: Перемещение в определенную позицию файла. Аргумент обычно является номером записи для поиска. Поиск (seek) выполняется значительно быстрее, чем чтение несколько раз для перемещения к определенной записи в файле. Обычно операция поиска не поддерживается для всех типов файлов и устройств.
Close: Закрывает открытый файл. Для операции записи, операция close выталкивает все буферы записи и обновляет записи последнего каталога для нового файла. Освобождает также внутреннее буферное пространство файла. Операция close требуется в большинстве операционных систем. В некоторых, но не во всех операционных системах, при завершении процесса все открытые файлы процессов автоматически закрываются.
В большинстве случаев все эти функции возвращают коды ошибок, которые необходимо проверять в приложении. В Windows Embedded CE, эти файловые операции предоставляют функции CreateFile, , WriteFile, SetFilePointer и CloseHandle. Посмотрите в оперативной справке дополнительную информацию о параметрах этих функций.
Встроенные системы, созданные для международных рынков, которые требуют поддержки различных языков обычно используют 16-битный стандарт кодирования символов Unicode. Многие периферийные устройства В/В используют 8-битный код символов ASCII, показанный в таблице 2.3. Первые 128 символов Unicode совпадают с символами ASCII, но с дополнительным ведущим нулевым байтом перед ними. Таблицы преобразования можно найти по адресу www.unicode.org/charts/ . (Английский язык использует Basic Latin Script)
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F | |
| 0 | NUL | ENQ | ACK | BS | HT | LF | VT | FF | CR | SO | SI | |||||
| 1 | DLE | DC1 | DC2 | DC3 | DC4 | SYN | CAN | EM | SUB | ESC | FS | GS | RS | US | ||
| 2 | SP | ! | " | # | $ | % | ' | ( | ) | * | + | , | - | . | / | |
| 3 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | : | ; | < | = | > | ? |
| 4 | @ | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O |
| 5 | P | Q | R | S | T | U | V | W | X | Y | Z | [ | \ | ] | ^ | _ |
| 6 | ` | a | b | c | d | e | f | g | h | i | j | k | l | m | n | o |
| 7 | p | q | r | s | t | u | v | w | x | y | z | { | | | } | ~ | DEL |
Американский стандартный код обмена информацией (ASCII) является стандартным семибитным кодом для компьютерного оборудования, принятым в 1968 г. В таблице 2.3 найдите символ "A". Он находится на пересечении строки 4 и столбца 1, поэтому шестнадцатеричное значение для "A" будет 0x41. Восьмой бит иногда используется для контроля по четности в устройствах коммуникации. Коды меньше 0x20 называются управляющими кодами. Управляющие коды выполняют операции, отличные от печати символа. Некоторые из наиболее распространенных управляющих кодов описаны ниже:
LF (line feed) - Перемещает курсор вниз на следующую строку, но не влево. В C/C++ используется "\n".
CR (carriage return) - Перемещает курсор до конца влево, но не переходит на следующую строку. В C/C++ используется "\r". Для новой строки используются оба символа CR и LF.
SP (space) печатает пробел и курсор перемещается в следующую позицию символа.
FF (form feed) - Перемещает бумагу к началу следующей страницы на принтерах или очищает окно вывода текста на терминалах. В C/C++ используется "\f".
- Вызывает звуковой сигнал на терминалах и в программах эмуляции терминалов.
BS (backspace) - Смещает курсор в обратном направлении (влево) на одну позицию. В C/C++ используется "\b".
HT (horizontal tab) - Перемещает курсор вправо до следующей позиции табуляции. Интервал позиций табуляции зависит от устройства вывода, но часто равен 8 или 10.
VT (vertical tab) - В C/C++ используется "\v".
ESC (escape) – Иногда используется для завершения команд программы.
NUL (null) – Все нули, иногда используется для окончания строк.
Отметим, что символы десятичных цифр от "0" до "9" лежат в диапазоне от 0x30 до 0x39. Код задан так, что "A"<"B"<"C" … , поэтому цифровые значения можно использовать для алфавитного упорядочивания. Единственный бит в коде изменяет регистр символа (т.е., "A" и "a"), когда нажимается клавиша shift. Клавиша ctrl также изменяет один бит в коде. Расширенные коды ASCII используют восемь битов для вывода еще других 128 специальных графических символов. Существует несколько различных стандартов для этих новых графических символов, поэтому подробнее проверяйте руководство устройства. Первые 128 символов совпадают с 7-битным исходным стандартом кода ASCII. В Unicode первые 128 символов совпадают с символами ASCII с нулевым старшим байтом, чтобы поместить его в 16-битов.
Windows Embedded CE использует по умолчанию кодировку Unicode для всех символьных строк. В языке C встроенный тип char использует 8-битное кодирование ASCII, но тип TCHAR использует 16-битный Unicode. Можно использовать специальный вызов макро _T или _TEXT для инициализации строки Unicode из символьной строки C. В качестве примера, _T("hi") порождает 4-байтную строку Unicode со значением 0x00, 0x68, 0x00, и 0x69. Функции C\C++, WideCharToMultiByte и MultiByteToWideChar, можно использовать для преобразования символьных строк в/из ASCII и Unicode. Функция lstrlen возвращает символьную длину строки Unicode. Смотрите оперативную справочную систему для получения дополнительной информации о параметрах этих функций.
(рис 2.13) Логический анализатор Tektronix настроен для захвата и декодирования сигналов шины PCI. Этот логический анализатор является на самом деле встроенной системой, которая выполняет Windows XP. Специальная плата адаптера посредника PCI используется для быстрого соединения контактных датчиков со специальной программой ПЗУ логического анализатора. Изображения с разрешения Nexus Technology
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.