Введение во встроенные системы и Windows Embedded CE

Введение в архитектуру ввода/вывода встроенных систем

Разбить на страницы
Показывать лекцию целиком

Выше представлена часть фотошаблона печатной платы (PCB) для встроенной системы. Различные цвета линий соответствуют различным медным слоям на PCB. Светло-желтые прямоугольники являются шелкографией, которая помечает места, где припаивают устройства. Сероватые точки являются монтажными отверстиями. Фотография с разрешения Henrik Christophersen.

Введение в архитектуру ввода/вывода встроенных систем

Чтобы понять, как оборудование ввода/вывода (В/В) соединяется с процессором, и как программное обеспечение общается с этими устройствами В/В, рассмотрим сейчас архитектуру В/В, которая аналогична тому, что можно найти в современных встроенных устройствах.

Процессоры должны пересылать данные в память и в устройства ввода/вывода (В/В) по шине, как показано на рисунке 2.1. Шина содержит адресную информацию, значение данных для пересылки, и информацию о статусе шины, которая указывает операцию, выполняемую шиной (т.е., чтение или запись).

Современные вычислительные системы являются более сложными, и они в действительности содержат иерархию шин различных типов. Каждая используемая шина имеет различную стоимость и полосу пропускания. Обычно, большая полоса пропускания является более дорогой. Некоторые шины часто требуются для поддержки унаследованных устройств.

Чтобы понять, как память и устройства В/В взаимодействуют с микросхемой процессора, и как программное обеспечение взаимодействует с оборудованием устройства В/В, необходимо понять основы того, как эти данные пересылаются по шинам компьютера. Мы кратко опишем работу двух обычных компьютерных шин, а затем рассмотрим пример архитектуры шины встроенной компьютерной системы.

(рис 2.1) Архитектура с одной шиной использовалась в первых компьютерах. Современные системы являются более сложными и содержат фактически иерархию различных шин

Пример шины микропроцессора первого поколени

Чтобы понять, как шины действуют в компьютере, и как они используются в оборудовании В/В, мы начнем с рассмотрения шины микропроцессора первого поколения. Шина ISA (Industry Standard Architecture) была введена на первых ПК компании IBM в начале 1980-х. Шина ISA использовалась для соединения плат, вставляемых в ПК первого поколения. ISA поддерживает пересылку 8-битных и 16-битных данных. PC/104 является промышленной версией этой шины, которая позволяет платам располагаться стеком и взаимосвязываться, что еще используется в некоторых встроенных системах. Более поздние версии расширяют шину ISA до 32-битной шины, называемой Extended Industry Standard Architecture (EISA).

Устройство, которое инициирует передачу по шине называется мастером шины или инициатором. Шина ISA используется для передачи данных между памятью, устройствами В/В, и процессором. Сигнал синхронизации шины используется для привязки по времени для передачи по шине. Синхронизация шины ISA обычно находится в диапазоне от 4 до 8 Мгц. Синхронизация шины ISA независима от синхронизации процессора, они имеют разную частоту. Типичный цикл шины ISA требует от 5 до 6 синхроимпульсов шины. Шина ISA содержит адресную шину, шину данных, и несколько линий состояния шины. Адресная шина содержит адрес памяти или выбранного устройства В/В, а шина данных содержит значение для передачи. Каждое устройство В/В должно иметь уникальный адрес В/В. Схема декодирования адреса в каждом устройстве проверяет адресную шину и определяет, когда адрес устройства присутствует в шине.

Пример декодера 4-битного адреса, созданного с помощью вентиля AND, показан на рисунке 2.2. При использовании цифровых логических вентилей простой декодер адреса состоит из большого вентиля AND, который имеет все адресные линии в качестве входов, с инверторами, добавленными на адресных битах, которые заданы на нижнем уровне в двоичном значении адреса устройства. Логическая диаграмма простого декодера адреса для 4-битного адреса (A3..A0) показана ниже. Выход вентиля AND будет на верхнем уровне только когда во входах присутствует значение адреса 0xA. Схема реального декодера адреса должна будет проверять все биты адреса на шине адреса (если только некоторые адреса не являются алиасами). В реальном устройстве должно декодироваться более чем 4 линии шины адреса. Типичным является от 16 до 32 линий адреса и будет требоваться несколько уровней вентилей, так как большинство технологий логических вентилей могут поддерживать только от 4 до 5 входов на логический вентиль.

(рис 2.2) Схема простого декодера адреса для 4-битного адреса = 0xA

Четыре основные линии состояния шины указывают на тип цикла передачи шины, чтение памяти (MEMR), запись в память (MEMW), чтение В/В (IOR), или запись В/В (IOW). В шине ISA все эти линии состояния шины будут активными на нижнем уровне (т.е., низкий уровень сигнала указывает тип передачи). Только один из этих сигналов состояния будет обычно активным (т.е., низким) в любое заданное время. Шина ISA имеет ряд других сигнальных линий, но мы обсудим только основные.

Большинство сигналов шины управляются с помощью логических устройств с тремя состояниями. Вспомните, что логика с тремя состояниями имеет третье состояние, которое является высоким импедансом или отсутствием соединения, как видно на рисунке 2.3. Буфер с тремя состояниями имеет дополнительную управляющую линию, которая заставляет его действовать в точности как обычный буфер или переходить в состояние высокому импедансу (Z используется для импеданса), т.е. отсоединяться. Это позволяет нескольким устройствам управлять шиной, но только по очереди. Только одно устройство в данный момент времени включает свое управление с тремя состояниями, чтобы заставить свои выводы задавать сигналы шины высокими или низкими. Это возможно, так как каждому устройству В/В задан свой собственный уникальный диапазон адресов В/В, на которых оно отвечает.

(рис 2.3) Буфер с тремя состояниями. Для управления большинством сигналов шины должны использоваться выходы логического вентиля с тремя состояниями

Таким образом выводы нескольких вентилей с тремя состояниями, связанные вместе, выполняют ту же логическую функцию, что и мультиплексор, они соединяют один из нескольких вводов с одним выходом. Входы поступают из различных устройств, а выходом в данном случае будет шина.

Два устройства, отвечающие на одном и том же адресе во время операции чтения, будут создавать конфликт шины, приводящий к неправильным значениям шины данных. Ошибка проектирования или дефект в управляющей логике с тремя состояниями устройства может закоротить шину данных и вызвать сбой компьютера. Некоторые более старые платы ISA имели переключатели или перемычки, которые использовались для задания адреса устройства, чтобы избежать конфликта адресации. Это часто требуется, когда в системе используется несколько устройств одного типа.

Первые ПК имели предварительно заданные диапазоны адресов В/В для обычных устройств В/В на шине ISA, как показано в таблице 2.1. Чтобы сэкономить несколько вентилей и несколько микросхем в схемах декодирования адреса на платах В/В ISA, конструкторы первых ПК кодировали только нижние 10 битов адреса В/В. Для современных устройств VLSI несколько вентилей больше не являются существенной заботой конструктора, но это задание адресов продолжает использоваться в современных ПК, чтобы обеспечить обратную программную совместимость.

Стандартное задание адресов в/в ПК
Диапазон адресов в/в Устройство в/в
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 параллельный принтер (LPT1:)
3B0h - 3BBh адаптер MDA
3BCh - 3BFh параллельный принтер (LPTx:)
3C0h - 3CFh адаптер VGA/EGA
3D0h - 3DFh адаптер CGA
3E8h - 3EFh последовательный порт 3 (COM3:)
3F0h - 3F7h контроллер флоппи-диска
3F8h - 3FFh последовательный порт 1 (COM1:)

Примечание: Первые ПК декодировали только нижние 10 битов адреса В/В.

(рис 2.4) Пример операции записи В/В шины ISA

Цикл записи ISA показан на рисунке 2.4. Сначала мастер шины (обычно процессор) посылает адрес памяти или В/В по линиям системного адреса (SAx). После завершения одного полного цикла синхронизации шины для стабилизации схем декодирования адреса, мастер-устройство посылает данные по линиям системных данных (SDx) и задает уровень линии состояния записи В/В (IOWR) как низкий. Все линии остаются стабильными в течение нескольких циклов синхронизации шины, чтобы обеспечить распространение сигнала и настройку.

Затем сигнал IOWR поддерживается высоким, а целевое устройство (обычно устройство В/В) сохраняет значение шины данных на положительной волне сигнала IOWR. Значение шины данных должно сохраняться в целевом устройстве с помощью регистра, так как оно присутствует только в течение нескольких циклов синхронизации, прежде чем в шине данных появится другое значение. Вспомните, что регистры можно создавать, используя по одному D-триггеру на бит и соединяя все входы.

Мастер-устройство затем освобождает адресную шину и шину данных, выключая свои драйверы с тремя состояниями, чтобы задать для следующего цикла шины. В конце цикла шины новое значение данных будет сохранено в регистре вывода данных целевого устройства для использования внешними устройствами В/В.

Цикл чтения ISA показан на рисунке 2.5. Сначала мастер шины (обычно процессор) посылает адрес памяти или В/В по линиям системного адреса (SAx). После завершения одного полного цикла синхронизации шины для стабилизации схем декодирования адреса, мастер-устройство задает сигнал линии состояния чтения В/В (IOR) как низкий. Целевое устройство воспринимает свой уникальный адрес в шине адреса (используя схему декодера адреса для проверки своего адреса), и воспринимая сигнал состояния IOR, указывающий на цикл чтения В/В, он включает свои драйверы шины данных с тремя состояниями и посылает данные по линиям системных данных (SDx). Все линии остаются стабильными в течение нескольких циклов синхронизации шины, чтобы обеспечить распространение сигнала и настройку. IOR затем поддерживается высоким, и мастер-устройство сохраняет значение шины данных. Мастер-устройство затем освобождает адресную шину, а целевое устройство освобождает шину данных, выключая свои драйверы с тремя состояниями, чтобы задать для следующего цикла шины.

(рис 2.5) Пример операции чтения В/В шины ISA

Прерывания и циклы DMA могут запрашиваться устройствами по шине ISA с помощью линий Interrupt Request IRQx и линий запроса DMA DRQx. Сигнал сброса (RESET DRV) можно использовать для инициализации устройств при включении питания.

Создание оборудования интерфейса В/В, которое соединяется с шиной

Интерфейсы устройств В/В обычно соединяются с шиной. Основным строительным блоком, используемым для интерфейса устройств В/В, является порт В/В (называемый также регистром В/В). Порт входа В/В пересылает внешние данные из устройства В/В в процессор с помощью шины. Порт выхода В/В переносит данные из процессора во внешнее устройство В/В.

Каждое устройство В/В имеет уникальный присвоенный адрес и имеет логическую схему декодера адреса, которая проверяет в шине этот адрес. Сначала посылается значение адреса, так чтобы схема декодера адреса имела стабильный действительный выход, прежде чем управляющие линии шины активируют схему.

Данные входа В/В обычно содержатся в регистре в устройстве В/В. Как видно на рисунке 2.6, когда оборудование интерфейса порта входа В/В декодирует свой адрес на шине, и происходит операция чтения шины В/В, оно помещает значение своих данных в шину, включая свои драйверы с тремя состояниями для управления шиной данных. Должны использоваться три состояния, так как несколько устройств могут совместно использовать и управлять шиной данных (только по очереди). Интегральные схемы, созданные для присоединения к шине, такие как расширители порта В/В, содержат драйверы трех состояний и регистры, необходимые для интерфейса с шиной данных. Некоторые шины (а именно, PCI) мультиплексируют по времени информацию адреса и данных, используя одну шину, и должны будут сохранять значения адреса в регистре.

(рис 2.6) Типичная операция оборудования порта входа В/В. Устройство включает свои драйверы с тремя состояниями, чтобы управлять шиной данных с данными входа устройства В/В, только когда оно декодирует свой адрес и происходит операция чтения шины. Процессор затем сохраняет значение шины данных в регистре

Некоторые шины все еще используют более старую альтернативу для выходов с тремя состояниями, используя специальные логические вентили с открытым стоком или открытыми коллекторными выходами. Мышь и клавиатура PS/2 являются одним из таких примеров. В шине такого типа специальный логический вентиль выхода может управлять только низким сигналом данных, и единственный внешний резистор слабо (и несколько медленно по современным стандартам логики) переводит его в высокое состояние. Такой тип соединения шины называется иногда соединением монтажное-И или монтажное-ИЛИ. При таком типе вывода нет потенциального конфликта шины, когда два устройства могут попытаться направить сигнал в различные логические состояния. Два стандартный драйвера вывода в конфликте (т.е. один высокий и один низкий), соединенные с общей сигнальной линией, будут вызывать условие короткого замыкания уровня промежуточной логики и высокого сигнала тока.

Порт вывода В/В пересылает данные из процессора в устройство В/В с помощью шины. Как видно на рисунке 2.7, когда оборудование интерфейса порта вывода В/В декодирует его адрес на шине, и происходит операция записи В/В шины, он пересылает значение шины данных в регистр вывода В/В. Данные вывода должны сохраняться в регистре, так как на шине он присутствует только в течение нескольких циклов синхронизации.

(рис 2.7) Типичная операция оборудования порта В/В. Устройство загружает новые данные в регистр вывода порта В/В, только когда декодирует его адрес, и на шине происходит операция записи

Реальные логические схемы несколько сложнее, чем показанные в этих примерах, так как некоторые сигналы состояния могут быть активными в шине на нижнем уровне, и данные должны передаваться в регистр в конце сигнала записи В/В (а не в начале), когда данные гарантировано будут действительны для задания, и удерживаются на регистре ввода.

Чтобы минимизировать расфазировку синхронизации, вместо пропускания входа синхронизации с помощью вентиля AND, регистр с входом поддерживающим синхронизацию (или нагрузку) обеспечивает меньшую расфазировку синхронизации и минимизирует любые возможные проблемы метастабильности триггера (если возникает дополнительная проблема на выходе вентиля AND, то триггер может увидеть другой "фантомный" сигнал синхронизации в неподходящее время). При таком подходе команда записи В/В будет служить в качестве сигнала синхронизации, а выход декодера в качестве средства запуска. На шине ISA логика должна также проверять сигнал шины AEN на 0, чтобы гарантировать, что устройство не отвечает по ошибке на циклы DMA (DMA активирует одновременно более одного сигнала состояния шины ISA).

Некоторые встроенные устройства могут требовать своих собственных специальных аппаратных устройств В/В. Существует несколько доступных вариантов. Вместо вычерчивания схем на уровне вентиля, поставщики микросхем и разработчики встроенных систем обычно проектируют оборудование В/В с помощью средств CAD, используя язык описания оборудования (HDL), такой как VHDL или Verilog. VHDL имеет синтаксис аналогичный Pascal или ADA, а Verilog похож на C. Затем синтезируется модель HDL для создания списка соединений. Список соединений является текстовым описанием схемы. Автоматизированные инструменты CAD затем могут использовать список соединений для размещения конструкции оборудования в специальном устройстве VLSI, Application Specific Integrated Circuit (ASIC), или Field Programmable Logic Array (FPGA). Стоимость начальной настройки и маски для специальных конструкций VLSI и ASIC является очень высокой, и требуются большие объемы продаж, чтобы покрыть высокие расходы разработки. FPGA являются более подходящими для производства в меньших объемах, но они также потребляют больше энергии и работают медленнее.

В качестве примера конструкции устройства В/В на основе HDL мы преобразуем предыдущие конструкции устройств порта ввода и вывода ISA, показанные на рисунках 2.3, 2.6, и 2.7 в VHDL. Декодер адреса, описанный ранее, требует просто проверки на равенство в VHDL. На шине ISA AEN=1 указывает на операцию DMA. В VHDL число битов, которое требуется для каждой переменной, определяется, когда они объявляются в начале программы. Следующий код генерирует декодер адреса для портов:

-- Декодер адреса на основе VHDL для for 0x3E0
PORT_IO_DECODE <= '1' WHEN ADDRESS = X"3E0" AND
                                      AEN='0'   ELSE '0';

В VHDL присваивание значения "Z" выходу указывает на выход с тремя состояниями. Буферы с тремя состояниями для присоединения к 8-битной шине данных и их соответствующая управляющая логика для 8-битного порта ввода, как видно на рисунке 2.6, можно сгенерировать с помощью:

-- Порт ввода В/В на основе  VHDL - используйте буферы
-- с тремя состояниями
DATA <= PORT_DATA_IN WHEN PORT_IO_DECODE = '1' AND
                IOR = '0' ELSE "ZZZZZZZZ";

Для регистров в VHDL требуется процесс для восприятия перехода сигнала синхронизации. Регистры будут созданы с помощью D-триггеров. Следующий код генерирует 8-битный порт вывода, как показано на рисунке 2.7:

-- Порт вывода В/В на основе 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;

Использование HDL, такого как VHDL, с инструментами синтеза логики, делает конструкторов устройств более продуктивными, также как использование высокоуровневого языка делает более продуктивными разработчиков программного обеспечения. Порты В/В используют обычно 8, 16 или 32 бита. Большинство устройств имеют один порт В/В для передачи данных и второй порт В/В со смежным адресом В/В, который используется для битов статуса устройства, линий квотирования, и управляющих сигналов. Многие платы встроенных компьютеров предоставляют дополнительные порты В/В, называемые В/В общего назначения (GPIO) или иногда называемые параллельным портом для использования пользователями, когда они добавляют свое собственное специальное оборудование В/В.

Другие шины первого поколения микропроцессора аналогичны. Несколько других интерфейсов устройств, имеющихся в ПК, по-прежнему имеют сигналы, похожие на ISA, так как они были первоначально получены из нее. Отметим, что в примерах цикла шины ISA, требуется минимум от 5 до 6 циклов шины ISA для передачи одного значения данных.

По мере того как процессоры и память становятся быстрее, полоса пропускания шины ISA стала ограничивающим фактором. Сначала память была перенесена на более быструю выделенную шину процессора/памяти. Но высокоскоростные сетевые интерфейсы и графические платы все же требовали большей полосы пропускания шины, чем было доступно на шине ISA. Это привело к новому более быстрому второму поколению шин, как для ПК, так и для встроенных систем.

Программное обеспечения передачи данных в порты В/В

Когда используется операционная система, низкоуровневый код драйвера устройства обычно взаимодействует с портами В/В, и приложения пользователей вызывают эти драйверы устройств с помощью API OC. Для разработки кода драйвера устройства большинство компиляторов C/C++ позволяют использовать встраиваемый язык ассемблера. К сожалению, использование языка ассемблера означает, что код не будет переноситься на другой процессор. Это также затрудняет понимание кода для других разработчиков.

На процессорах X86 должны использоваться две специальные машинные инструкции для передачи данных в порты В/В. Инструкция IN считывает данные из порта В/В, а инструкция OUT записывает данные в порт В/В. Для этих инструкций X86 16-битный регистр адреса В/В (DX) является одним из операндов, а 8-битный регистр (AL), который содержит значение данных является другим операндом. Это единственные две инструкции, которые будут генерировать циклы шины для чтения и записи В/В. Пример встроенного в C/C++ кода языка ассемблера X86 показан в примере 2.1. Ключевое слово _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
      }				       			}

На многих процессорах эти инструкции В/В являются также привилегированными и могут перехватываться в оборудовании с помощью задания бита режима процессора, чтобы запретить пользователям непосредственно выполнять В/В вместо использования вызовов API ОС для выполнения В/В. Традиционные настольные операционные системы Windows используют этот бит режима, чтобы сделать инструкции В/В привилегированными, но многие встроенные операционные системы, включая Windows Embedded CE этого не делают. Некоторые RISC-процессоры резервируют специальный диапазон адресов в памяти для устройств В/В (отображенный в память В/В) и затем используют обычные инструкции Load и Store для переноса данных в устройства В/В. Кэширование данных порта В/В отображенной памяти должно быть отключено. C# не допускает встраивание языка ассемблера непосредственно, но может вызывать процедуры C/C++ в динамически подключаемой библиотеке (DLL), используя процедуру, называемую P/invoke.

Для разработки кода драйвера устройства большинство компиляторов C/C++ имеют специальные вызовы функций, которые могут читать и записывать в порты В/В. В Windows Embedded CE, использующей CE Device Driver Kit (CEDDK), две такие функции C предоставлены для 8-битных портов В/В. Функция WRITE_PORT_UCHAR(адрес В/В, данные) записывает значение данных в порт В/В. Функция READ_PORT_UCHAR(адрес В/В) возвращает значение данных, прочитанное из порта В/В. В файле исходного кода требуется заголовочный файл CEDDK.h и код должен быть скомпонован с библиотекой CEDDK.lib.

Эти вызовы функций обычно находятся только в низкоуровневых драйверах устройств В/В. При таком подходе код будет легко переноситься на другие процессоры и будет легче для чтения и понимания (особенно для тех, кто не знает язык ассемблера процессора). C# не имеет таких функций, но может вызывать функции C/C++, которые определены в библиотеке *.dll, с помощью специального средства [DLLIMPORT] P/invoke.

Пример шины микропроцессора второго поколения

Так как ограничения полосы пропускания и размера адресации памяти шин первого поколения, таких как ISA, стали очевидны, были предложены несколько новых стандартов шин. В начале 1990-х компания Intel представила шину PCI (Взаимосвязь Периферийных Компонентов). Эта шина стала наиболее широко используемым стандартом и сегодня развитием стандарта PCI занимается организация PCI Special Interest Group. PCI является синхронной шиной, вся передача данных по которой происходит согласно частоте шины PCI. В начале частота шины PCI была 33 Mhz. Более новые системы PCI-X могут иметь частоту 66, 133, 266 и 533 MHz. Длину, нагрузку и импеданс сигнальных линий шины PCI необходимо тщательно контролировать, чтобы поддерживать эти высокие частоты. К одной шине PCI может быть присоединено только несколько устройств. Сигналы PCI являются даже слишком быстрыми, чтобы правильно функционировать при подключении устройств на студенческой панели для прототипов с длинными соединительными проводами. PCI поддерживает уровни логики 5V и 3.3V. PC/104-Plus является версией платы 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 во время фазы адреса
Команда шины 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). Стандарт CardBus для небольших подключаемых модулей получен из сигналов шины PCI.

В последнее время графические платы начали потреблять большую часть доступной полосы пропускания шины PCI, поэтому они были перенесены на новую шину Accelerated Graphics Port (AGP). AGP основывается на сигналах шины PCI. Так как AGP соединяется только с одним устройством, графической платой, то технически она является портом, а не шиной. AGP 2X, 4X, и 8X содержат дополнительные сигналы и фазы синхронизации, которые увеличивают эффективную частоту работы.

Программное обеспечение для устройств PCI

Для поддержки автоматической конфигурации оборудования, каждое устройство PCI содержит область конфигурации, размером 256 байтов. При включении питания устройства PCI могут самостоятельно сообщать информацию о производителе и типе устройства, чтобы помочь операционной системе найти и загрузить правильные драйверы устройств. Устройства PCI, которые отображают в память и адресное пространство В/В, можно запрограммировать для ответа на различные базовые адреса и прерывания. Это позволяет программному обеспечению операционной системы загружать драйверы и присваивать адреса и прерывания автоматически во время включения питания. Перечисление является термином, который используется для описания этого процесса. Это исключает необходимость устанавливаемых вручную перемычек и переключателей. Операционная система обычно предоставляет драйвер, который обрабатывает перечисление, но драйверы устройств по прежнему нужны для каждого устройства PCI на шине.

Пример шины микропроцессора третьего поколения

Недавно была представлена шина PCI Express, которая предоставляет еще большую полосу пропускания, чем PCI. Увеличение полосы пропускания выше уровней PCI, за счет создания большого числа плотно упакованных высокоскоростных параллельных линий соединения шины на современных монтажных платах было больше невозможно, но это можно было сделать с помощью нового поколения высокоскоростных драйверов, когда используется меньшее количество линий, и длина, нагрузка, перекрестные помехи, и окончание каждой линии тщательно контролируется. В PCI Express используется небольшое число высокоскоростных последовательных линий для передачи сигналов шины PCI. Скорость передачи данных высокоскоростных последовательных линий PCI Express лежат в диапазоне от 2.5 до 10 Гбайт/сек. Для большей полосы пропускания несколько высокоскоростных последовательных линий можно объединять в группу для соединения с устройством (называемую lane (тропинка) в PCI Express). Регистры смещения в интерфейсе PCI каждого устройства преобразуют сигналы из последовательного в параллельный. Так как PCI Express пересылает те же самые сигналы PCI, работа программного обеспечения PCI не изменяется. Новый стандарт ExpressCard для небольших подключаемых модулей основывается на PCI Express. PCI может поддерживать уровни логики 5V и 3.3V. Примерно в это же время стандарт PCI также был обновлен для поддержки более высокой частоты шины.

Существует ряд других стандартов высокоскоростных шин, включая HyperTransport компании AMD, RapidIO компании Freescale, и FlexIO компании Rambus. Многие используют теперь низковольтные дифференциальные сигналы на сигналах шины.

Согласование по времени, длина шины, нагрузка (число соединенных с шиной устройств), и окончание все являются критически важными на современных шинах микропроцессоров, и необходимо понимать и детально проверять требования при проектировании нового оборудования, и даже при прокладке трассировки печатной платы для шины. Многие шины требуют внешнего резистора на каждой сигнальной линии для правильного окончания. Полные спецификации стандартов шин могут занимать несколько сотен страниц и доступны для разработчиков оборудования из различных источников. Полностью совместимый интерфейс PCI требует более десяти тысяч логических вентилей. Базовый дизайн интеллектуальной собственности PCI также доступен у ряда поставщиков для разработчиков оборудования для использования в новых конструкциях.

Пример встроенной системы X86

Современные компьютерные системы содержат иерархию шин. Каждая шина имеет различный набор компромиссов между шириной полосы пропускания и стоимостью. Шина процессора и памяти является шиной с самой широкой полосой пропускания и эти соединения могут иметь длину только в пару дюймов с некоторыми устройствами памяти. Мост шины используется для соединения сигналов одного типа шины с другим. Большинство систем имеют один или несколько мостов для преобразования сигналов из контактов процессора в шины, которые содержат устройства В/В.

Типичная аппаратная система совместимая с ПК, созданная для встроенных устройств с помощью Vortex86 System-on-a-chip (SoC) показана на рисунке 2.10. Устройство eBox 2300, которое будет использоваться в качестве целевого устройства для лабораторных проектов, использует Vortex86 SoC и содержит подмножество этого оборудования. Отметим, что единственная микросхема Vortex86 SoC содержит процессор X86 вместе с двумя микросхемами моста (северный мост и южный мост), которые имеются в ПК, который имеет как шину PCI, так и шину ISA.

(рис 2.10) Блочная диаграмма конструкции встроенного ПК на основе Vortex86

Традиционный северный мост соединяется с контактами процессора и предоставляет шину памяти для соединения с SDRAM и шиной PCI. Микросхемы контроллера сети Ethernet соединяются с шиной PCI. Традиционный южный мост также соединяется с шиной PCI и предоставляет шину Low Pin Count (LPC), интерфейс BIOS ROM, и несколько других интерфейсов ПК для В/В. Шина только для материнских плат Low Pin Count (LPC), сгенерированная южным мостом, требует меньше контактов микросхемы, чем ISA, и использует частоту 33Mhz, но действует аналогично ISA в программном обеспечении. Более медленные унаследованные устройства соединяются с микросхемой южного моста. Микросхема SuperIO предоставляет совместимый с ПК интерфейс флоппи-диска, принтера и последовательного порта. Микросхема моста ISA предоставляет сигналы шины ISA для коннектора PC/104.

Методы передачи В/В

Большинство устройств В/В на порядки величин медленнее процессора. Линии квитирования устройства В/В должны использоваться для синхронизации каждой передачи данных В/В. Каждое устройство В/В задает линию квитирования оборудования (т.е., ввод готов, вывод готов), когда будет готово к передаче данных. Перед каждой новой передачей данных в порт данных устройств В/В, процессор или другое оборудование должно проверить, что устройство В/В готово, считывая и проверяя линию квитирования устройства. Биты линии квитирования обычно соединяются с другим портом В/В, называемым портом статуса. Обычно порт статуса устройства имеет следующий адрес В/В после порта данных В/В (это также экономит оборудование декодера адреса, так как оно может совместно использоваться несколькими последовательными адресами). Имеется три основных подхода, используемых для передачи данных в устройства В/В. Это программируемый В/В (называемый также опросным или программно управляемым В/В), управляемый прерываниями В/В, и прямой доступ к памяти (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);

Когда устройство готово, процессор затем вводит или выводит значение данных на устройство В/В. Когда процессор считывает или записывает порт данных, линия квитирования обычно сбрасывается в ноль оборудованием.

Такой подход обычно ограничен простыми системами, имеющими только несколько устройств В/В, так как имеется значительная перегрузка процессора, который должен постоянно в программном обеспечении циклически проверять биты готовности всех устройств В/В. Во многих случаях это не позволяет также процессору переходить в режимы экономии энергии, что является важным фактором для работающих от батарей устройств. В мультизадачных ОС для В/В обычно используются другие методы, которые требуют меньшей нагрузки на процессор, и освобождают время процессора для выполнения других процессов.

Передачи В/В управляемого прерываниями

Для управляемого прерываниями В/В сигналы готовности В/В используются для генерации сигнала прерывания оборудования. Сигнал прерывания обычно останавливает процессор на следующий инструкции (при условии, что прерывания активированы), и процессор вызывает процедуру обслуживания прерывания (ISR). Эта процедура затем обрабатывает прерывание и возвращает управление, как показано на рисунке 2.11.

(рис 2.11) Когда происходит прерывание, после окончания выполнения текущей инструкции, управление передается соответствующей процедуре обслуживания прерывания (ISR). ISR выполняет затем необходимые операции В/В, чтобы снять прерывание и переслать данные. ISR возвращает управление назад следующей инструкции в прерванном процессе, когда завершается. Чтобы сократить задержку прерывания, некоторые ISR могут запускать поток службы прерывания (IST) сразу перед возвратом, чтобы завершить некоторые задачи позже

Использование прерываний исключает циклы ожидания готовности В/В процессором, которые требуются в программном В/В. Процедура службы прерываний пересылает данные, снимает сигнал прерывания и возвращает управление. Процедуры прерываний должны вначале сохранить все регистры в стеке, обработать прерывание, восстановить значения регистров из стека, и затем вернуть управление в код, который был прерван, используя адрес возврата прерывания, хранящийся в стеке.

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

Специальное оборудование, называемое контроллером прерываний, используется для активации/деактивации и задания приоритетов нескольких сигналов прерываний. Многие процессоры имеют векторную систему прерываний. В случае векторных прерываний каждая отдельная линия сигнала аппаратного прерывания соединяется с различным адресом ISR. Когда происходит прерывание, процессоры X86 выполняют поиск в таблице адресов ISR в нижней области памяти и затем напрямую переходят к ISR. Меньшие номера прерываний обычно имеют более высокий приоритет (они могут даже прервать ISR прерывания с большим номеров). Присваивая более быстрые устройства прерываниям с меньшими номерами, можно задать приоритет более быстрым устройствам В/В. Сигналы прерываний можно использовать для более чем одного устройства, но в этом случае ISR должна будет проверять бит статуса, чтобы определить, какое устройство В/В необходимо обслужить.

Некоторые критически важные разделы кода (называемые нереентерабельными) могут требовать, чтобы прерывания были отключены. Большинство процессоров имеют машинную инструкцию для включения и отключения прерываний. Время задержки прерывания задается самой длинной инструкцией или самым длинным блоком кода, который отключает прерывания. RTOS создано для минимизации этого времени. Длительность времени выполнения ISR также критически важно. Во многих случаях ISR сохраняет данные, сбрасывает в ноль сигнал запроса прерывания, и возвращает управление сразу после запуска потока обслуживания прерывания (IST), который выполняется позже для завершения операции.

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

Оборудование контроллера прерываний необходимо для задания приоритетов прерываний и включения/отключения каждого сигнала прерывания. Для прерываний нужны также дополнительные сигналы шины. Для сигналов прерываний используют на шине ISA линии IRQx, а на шине PCI линии INTx. По соображениям безопасности ОС должна контролировать все оборудование прерываний, таблицу вектора прерываний, и ISR. Многие драйверы устройств В/В управляются прерываниями.

Большинство компиляторов C/C++ имеют специальные функции для настройки ISR в ОС. Они автоматически сохраняют все регистры и правильно возвращают управление, используя адрес возврата прерывания в конце ISR. Обычно доступна еще одна функция для регистрации ISR в системе и настройки таблицы адресов ISR, необходимой для обслуживания прерывания и перехода к ISR. Процедуры ISR могут обычно использовать только небольшое ограниченное подмножество вызовов API ОС. Обычно предоставляются вызовы функций C для включения и отключения прерываний.

Передачи В/В на основе прямого доступа к памяти (DMA)

Контроллер прямого доступа к памяти (DMA) является специальным оборудованием, которое передает блоки данных непосредственно в/из памяти и устройства В/В. Контроллер DMA требует машины состояний с указателем адреса и счетчиком. Контроллер DMA функционирует как мастер шины. Подобно процессору он может служить в качестве мастера шины и инициировать циклы шины. Оборудование контроллера DMA автоматически ведет обратный отсчет числа значений данных и настраивает свой указатель адреса, когда каждое новое значение данных передается по шине.

Процессор непосредственно не вовлечен в операцию передачи DMA, когда она начинается. Так как контроллер(ы) DMA и процессор должны совместно использовать шину, требуется арбитражное оборудование шины для управления доступом к шине (т.е., получит ли следующий цикл шины контроллер DMA или процессор). Контроллер DMA прерывает процессор, когда его передача блока завершается, и его счетчик достигает нуля. Процессор затем программирует регистр адреса контроллера DMA и счетчик для начала новой передачи DMA. Для каждого контроллера DMA требуется специальное оборудование и для поддержки DMA требуется система прерываний. Большинство современных процессоров имеют кэш-память, которая помогает освободить полосу пропускания шины для использования контроллерами DMA.

(рис 2.14) Во время цикла шины DMA, контроллер DMA служит в качестве контроллера шины, а процессор отсоединяется (три-состояния) от шины. Для DMA требуется арбитражное оборудование шины

Для поддержки DMA требуются дополнительные сигналы шины. Контроллеры DMA должны запрашивать цикл шины и ждать, пока он не будет предоставлен арбитражным оборудованием шины. На шине ISA для DMA используются сигналы DRQx и DACKx, а шина PCI использует для DMA сигналы REQx и GNTx.

В целях безопасности ОС должна контролировать все оборудование DMA. DMA наиболее эффективен, когда используется для высокоскоростных устройств блочной передачи, таких как дисковые устройства (диски пересылают секторы) и сетевых интерфейсов (пересылают пакеты). В идеальной системе несколько контроллеров DMA и процессор будут действовать параллельно, позволяя совмещать вычисления на процессоре с операциями пересылки В/В DMA. Когда один процесс занят, ожидая завершения своих операций В/В DMA, процессор может выполнять полезные вычисления на другом процессе.

В Windows Embedded CE библиотека CEDDK и ядро имеют несколько функций, которые используются для поддержки DMA.

Поддержка в ОС независимого от устройств В/В и файлов

Операционные системы предоставляют поддержку для нижележащего оборудования В/В. Многие устройства В/В могут поддерживаться в прикладных программах, используя вызовы API основной файловой системы. Одним из важных свойств операционной системы является поддержка, которую она предоставляет для В/В файловой системы. Это обеспечивает единообразное логическое представление хранения информации. Различные устройства памяти и множество устройств В/В (включая последовательные и параллельные порты) могут использовать единый интерфейс API для чтения и записи данных. Обычно вызовы API ОС поддерживают следующие пять базовых файловых операций:

Open (или Create ): Для операции чтения (read) на существующем файле операция open (открыть) находит файл, для операции записи ( write ) она ищет доступное пространство на устройстве памяти и обычно выделяет пространство буфера для обработки файловых пересылок. Имя файла передается при вызове open. Для операций В/В некоторых устройств, таких как последовательный порт, имя файла является именем устройства и допускается только одна операция Open в данный момент, так как устройство требует монопольного доступа. Аргумент операции open обычно определяет, будет ли файл использоваться для чтения или записи. Могут возникать ошибки, если файл не будет найден для операции чтения или нет доступного пространства на устройстве памяти для операции записи.

Read: Следующий блок данных считывается из открытого файла. Аргументами являются идентификатор файла или описатель файла и указатель на область буфера, в которую возвращаются прочитанные данные.

Write: Следующий блок данных записывается в открытый файл. Аргументами являются идентификатор файла или описатель файла и указатель на область буфера, из которой копируются данные для записи. Может возникать ошибка, когда нет доступного пространства на устройстве хранения.

Seek: Перемещение в определенную позицию файла. Аргумент обычно является номером записи для поиска. Поиск (seek) выполняется значительно быстрее, чем чтение несколько раз для перемещения к определенной записи в файле. Обычно операция поиска не поддерживается для всех типов файлов и устройств.

Close: Закрывает открытый файл. Для операции записи, операция close выталкивает все буферы записи и обновляет записи последнего каталога для нового файла. Освобождает также внутреннее буферное пространство файла. Операция close требуется в большинстве операционных систем. В некоторых, но не во всех операционных системах, при завершении процесса все открытые файлы процессов автоматически закрываются.

В большинстве случаев все эти функции возвращают коды ошибок, которые необходимо проверять в приложении. В Windows Embedded CE, эти файловые операции предоставляют функции CreateFile, ReadFile, WriteFile, SetFilePointer и CloseHandle. Посмотрите в оперативной справке дополнительную информацию о параметрах этих функций.

Кодирование символов Unicode и ASCII

Встроенные системы, созданные для международных рынков, которые требуют поддержки различных языков обычно используют 16-битный стандарт кодирования символов Unicode. Многие периферийные устройства В/В используют 8-битный код символов ASCII, показанный в таблице 2.3. Первые 128 символов Unicode совпадают с символами ASCII, но с дополнительным ведущим нулевым байтом перед ними. Таблицы преобразования можно найти по адресу www.unicode.org/charts/ . (Английский язык использует Basic Latin Script)

Таблица преобразования символов ASCII в шестнадцатеричное представление
0 1 2 3 4 5 6 7 8 9 A B C D E F
0NUL SOH STX ETX EOT ENQ ACK BEL BS HT LF VT FF CR SO SI
1DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US
2SP ! " # $ % ' ( ) * + , - . /
30 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
5P 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
7p 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".

BEL (bell) - Вызывает звуковой сигнал на терминалах и в программах эмуляции терминалов.

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. Смотрите оперативную справочную систему для получения дополнительной информации о параметрах этих функций.

Дополнительная информация

  • ISA EISA Theory and Operation, Edward Solari. (RTCbooks) (ISBN 0-929392-15-9)
  • ISA System Architecture, Don Anderson и Tom Shanley (ISBN 0-929392-15-9) (MindShare) (ISBN 0-201-40996-8)
  • PCI Hardware Software Architecture and Design, Edward Solari George Willse (RTCbooks) (ISBN 0-929392-59-0)
  • PCI System Architecture, Tom Shanley (MindShare) (ISBN 0-201-40993-3)
  • Специальная группа по интересам PCI www.pcisig.org продает полную спецификацию PCI
  • PCMCIA (Personal Computer Memory Card International Association) www.pcmcia.org имеет спецификации доступные на модулях PC Card и Express card.
  • Спецификация PCI 104 доступна по адресу http://www.pc104.org/
  • Лабораторные упражнения

  • Вычислите пиковую полосу пропускания В/В 16-битной шины ISA, которая использует шесть 8Mhz тактов на передачу, и сравните с 32-битной шиной PCI с частотой 66Mhz, выполняющей пакетную передачу PCI четырех значений данных с распределением тактов по времени 2-1-1-1 на пакет.
  • Если вы использовали ранее в предыдущих курсовых работах инструменты синтеза и моделирования VHDL или Verilog, разработайте синтетическую модель порта В/В ISA и промоделируйте операции В/В чтения и записи в порт В/В. НЕ забудьте протестировать те случаи, где порт В/В не должен отвечать, такие как другой адрес В/В или циклы шины, отличные от чтения и записи В/В. Бесплатные инструменты VHDL и Verilog доступны также студентам от основных поставщиков FPGA, включая Altera и Xilinx
  • Повторите предыдущую задачу для шину PCI со следующими предположениями для упрощения синтетической модели HDL и моделирования:
  • Необходимо реализовать и промоделировать сигналы шины PCI, показанные на чертеже тайминга PCI в учебнике. Можно проигнорировать IRDY и TRDY и предположить, что оба устройства всегда готовы к работе.
  • Не нужно реализовывать отдельные активации байтов на 32-битном порте вывода и предполагать, что он недоступен в пакетной передаче PCI (т.е., предполагаем, что за цикл шины PCI передается только 1 значение данных).
  • Используйте начальный сигнал сброса для очистки всех регистров во время моделирования.
  • Частота шины PCI равна 33Mhz, а шина адрес/данные имеет ширину 32-бита.
  • Сохраняйте любые значения, необходимые из шины, на поднимающемся ребре генератора шины PCI, используя положительное ребро, запускаемое DFF или регистром.
  • Чтобы обнаружить начало цикла шины, сохраните предыдущее значение сигнала Frame в 1-битном регистре. Когда старое (сохраненное) значение равно "1", а текущее значение равно "0", предполагаем, что это указывает на первый такт генератора нового цикла шины, который содержит адрес и информацию о команде (а не данные).
  • На первом такте сохраните адрес (A/D) и информацию о команде шины (C/BE) в регистре. Затем проверьте значения на выходе регистров, чтобы декодировать адрес, и проверьте (C/BE) на тип операции шины, чтобы решить, какую выполнять операцию на втором такте цикла шины. Понадобиться автоматическая очистка обоих значений этих регистров в конце цикла шины PCI.
  • Поищите в Web другие стандарты шин, используемые для семейства процессоров ARM, и сделайте сводку основных сигналов шины.
  • Существуют специальные платы PCI для соединения Logic Analyzers с шиной PCI вместе со специальным программным обеспечением, которое декодирует циклы шины PCI, как показано на рис 2.13 (рис 2.13) Логический анализатор Tektronix настроен для захвата и декодирования сигналов шины PCI. Этот логический анализатор является на самом деле встроенной системой, которая выполняет Windows XP. Специальная плата адаптера посредника PCI используется для быстрого соединения контактных датчиков со специальной программой ПЗУ логического анализатора. Изображения с разрешения Nexus Technology
  • Многие процессоры имеют специальные встроенные контакты отладки оборудования или другие средства для трассировки выполнения инструкций процессора, используя специальное оборудование тестирования, аналогичное логическому анализатору. На некоторых простых процессорах можно также следовать за выполнением инструкций, соединяя логический анализатор с линиями адреса памяти и данных процессоров. Пример показан на рис 2.14(рис 2.14) Логический анализатор Tektronix с дополнительной настройкой программного обеспечения для захвата и дизассемблирования последовательности выполнения инструкций процессора ARM. Этот логический анализатор является на самом деле встроенной системой, которая выполняет Windows XP. Изображения с разрешения Nexus Technology
  • Страницы:

    Выше представлена часть фотошаблона печатной платы (PCB) для встроенной системы. Различные цвета линий соответствуют различным медным слоям на PCB. Светло-желтые прямоугольники являются шелкографией, которая помечает места, где припаивают устройства. Сероватые точки являются монтажными отверстиями. Фотография с разрешения Henrik Christophersen.

    Введение в архитектуру ввода/вывода встроенных систем

    Чтобы понять, как оборудование ввода/вывода (В/В) соединяется с процессором, и как программное обеспечение общается с этими устройствами В/В, рассмотрим сейчас архитектуру В/В, которая аналогична тому, что можно найти в современных встроенных устройствах.

    Процессоры должны пересылать данные в память и в устройства ввода/вывода (В/В) по шине, как показано на рисунке 2.1. Шина содержит адресную информацию, значение данных для пересылки, и информацию о статусе шины, которая указывает операцию, выполняемую шиной (т.е., чтение или запись).

    Современные вычислительные системы являются более сложными, и они в действительности содержат иерархию шин различных типов. Каждая используемая шина имеет различную стоимость и полосу пропускания. Обычно, большая полоса пропускания является более дорогой. Некоторые шины часто требуются для поддержки унаследованных устройств.

    Чтобы понять, как память и устройства В/В взаимодействуют с микросхемой процессора, и как программное обеспечение взаимодействует с оборудованием устройства В/В, необходимо понять основы того, как эти данные пересылаются по шинам компьютера. Мы кратко опишем работу двух обычных компьютерных шин, а затем рассмотрим пример архитектуры шины встроенной компьютерной системы.

    (рис 2.1) Архитектура с одной шиной использовалась в первых компьютерах. Современные системы являются более сложными и содержат фактически иерархию различных шин

    Пример шины микропроцессора первого поколени

    Чтобы понять, как шины действуют в компьютере, и как они используются в оборудовании В/В, мы начнем с рассмотрения шины микропроцессора первого поколения. Шина ISA (Industry Standard Architecture) была введена на первых ПК компании IBM в начале 1980-х. Шина ISA использовалась для соединения плат, вставляемых в ПК первого поколения. ISA поддерживает пересылку 8-битных и 16-битных данных. PC/104 является промышленной версией этой шины, которая позволяет платам располагаться стеком и взаимосвязываться, что еще используется в некоторых встроенных системах. Более поздние версии расширяют шину ISA до 32-битной шины, называемой Extended Industry Standard Architecture (EISA).

    Устройство, которое инициирует передачу по шине называется мастером шины или инициатором. Шина ISA используется для передачи данных между памятью, устройствами В/В, и процессором. Сигнал синхронизации шины используется для привязки по времени для передачи по шине. Синхронизация шины ISA обычно находится в диапазоне от 4 до 8 Мгц. Синхронизация шины ISA независима от синхронизации процессора, они имеют разную частоту. Типичный цикл шины ISA требует от 5 до 6 синхроимпульсов шины. Шина ISA содержит адресную шину, шину данных, и несколько линий состояния шины. Адресная шина содержит адрес памяти или выбранного устройства В/В, а шина данных содержит значение для передачи. Каждое устройство В/В должно иметь уникальный адрес В/В. Схема декодирования адреса в каждом устройстве проверяет адресную шину и определяет, когда адрес устройства присутствует в шине.

    Пример декодера 4-битного адреса, созданного с помощью вентиля AND, показан на рисунке 2.2. При использовании цифровых логических вентилей простой декодер адреса состоит из большого вентиля AND, который имеет все адресные линии в качестве входов, с инверторами, добавленными на адресных битах, которые заданы на нижнем уровне в двоичном значении адреса устройства. Логическая диаграмма простого декодера адреса для 4-битного адреса (A3..A0) показана ниже. Выход вентиля AND будет на верхнем уровне только когда во входах присутствует значение адреса 0xA. Схема реального декодера адреса должна будет проверять все биты адреса на шине адреса (если только некоторые адреса не являются алиасами). В реальном устройстве должно декодироваться более чем 4 линии шины адреса. Типичным является от 16 до 32 линий адреса и будет требоваться несколько уровней вентилей, так как большинство технологий логических вентилей могут поддерживать только от 4 до 5 входов на логический вентиль.

    (рис 2.2) Схема простого декодера адреса для 4-битного адреса = 0xA

    Четыре основные линии состояния шины указывают на тип цикла передачи шины, чтение памяти (MEMR), запись в память (MEMW), чтение В/В (IOR), или запись В/В (IOW). В шине ISA все эти линии состояния шины будут активными на нижнем уровне (т.е., низкий уровень сигнала указывает тип передачи). Только один из этих сигналов состояния будет обычно активным (т.е., низким) в любое заданное время. Шина ISA имеет ряд других сигнальных линий, но мы обсудим только основные.

    Большинство сигналов шины управляются с помощью логических устройств с тремя состояниями. Вспомните, что логика с тремя состояниями имеет третье состояние, которое является высоким импедансом или отсутствием соединения, как видно на рисунке 2.3. Буфер с тремя состояниями имеет дополнительную управляющую линию, которая заставляет его действовать в точности как обычный буфер или переходить в состояние высокому импедансу (Z используется для импеданса), т.е. отсоединяться. Это позволяет нескольким устройствам управлять шиной, но только по очереди. Только одно устройство в данный момент времени включает свое управление с тремя состояниями, чтобы заставить свои выводы задавать сигналы шины высокими или низкими. Это возможно, так как каждому устройству В/В задан свой собственный уникальный диапазон адресов В/В, на которых оно отвечает.

    (рис 2.3) Буфер с тремя состояниями. Для управления большинством сигналов шины должны использоваться выходы логического вентиля с тремя состояниями

    Таким образом выводы нескольких вентилей с тремя состояниями, связанные вместе, выполняют ту же логическую функцию, что и мультиплексор, они соединяют один из нескольких вводов с одним выходом. Входы поступают из различных устройств, а выходом в данном случае будет шина.

    Два устройства, отвечающие на одном и том же адресе во время операции чтения, будут создавать конфликт шины, приводящий к неправильным значениям шины данных. Ошибка проектирования или дефект в управляющей логике с тремя состояниями устройства может закоротить шину данных и вызвать сбой компьютера. Некоторые более старые платы ISA имели переключатели или перемычки, которые использовались для задания адреса устройства, чтобы избежать конфликта адресации. Это часто требуется, когда в системе используется несколько устройств одного типа.

    Первые ПК имели предварительно заданные диапазоны адресов В/В для обычных устройств В/В на шине ISA, как показано в таблице 2.1. Чтобы сэкономить несколько вентилей и несколько микросхем в схемах декодирования адреса на платах В/В ISA, конструкторы первых ПК кодировали только нижние 10 битов адреса В/В. Для современных устройств VLSI несколько вентилей больше не являются существенной заботой конструктора, но это задание адресов продолжает использоваться в современных ПК, чтобы обеспечить обратную программную совместимость.

    Стандартное задание адресов в/в ПК
    Диапазон адресов в/в Устройство в/в
    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 параллельный принтер (LPT1:)
    3B0h - 3BBh адаптер MDA
    3BCh - 3BFh параллельный принтер (LPTx:)
    3C0h - 3CFh адаптер VGA/EGA
    3D0h - 3DFh адаптер CGA
    3E8h - 3EFh последовательный порт 3 (COM3:)
    3F0h - 3F7h контроллер флоппи-диска
    3F8h - 3FFh последовательный порт 1 (COM1:)

    Примечание: Первые ПК декодировали только нижние 10 битов адреса В/В.

    (рис 2.4) Пример операции записи В/В шины ISA

    Цикл записи ISA показан на рисунке 2.4. Сначала мастер шины (обычно процессор) посылает адрес памяти или В/В по линиям системного адреса (SAx). После завершения одного полного цикла синхронизации шины для стабилизации схем декодирования адреса, мастер-устройство посылает данные по линиям системных данных (SDx) и задает уровень линии состояния записи В/В (IOWR) как низкий. Все линии остаются стабильными в течение нескольких циклов синхронизации шины, чтобы обеспечить распространение сигнала и настройку.

    Затем сигнал IOWR поддерживается высоким, а целевое устройство (обычно устройство В/В) сохраняет значение шины данных на положительной волне сигнала IOWR. Значение шины данных должно сохраняться в целевом устройстве с помощью регистра, так как оно присутствует только в течение нескольких циклов синхронизации, прежде чем в шине данных появится другое значение. Вспомните, что регистры можно создавать, используя по одному D-триггеру на бит и соединяя все входы.

    Мастер-устройство затем освобождает адресную шину и шину данных, выключая свои драйверы с тремя состояниями, чтобы задать для следующего цикла шины. В конце цикла шины новое значение данных будет сохранено в регистре вывода данных целевого устройства для использования внешними устройствами В/В.

    Цикл чтения ISA показан на рисунке 2.5. Сначала мастер шины (обычно процессор) посылает адрес памяти или В/В по линиям системного адреса (SAx). После завершения одного полного цикла синхронизации шины для стабилизации схем декодирования адреса, мастер-устройство задает сигнал линии состояния чтения В/В (IOR) как низкий. Целевое устройство воспринимает свой уникальный адрес в шине адреса (используя схему декодера адреса для проверки своего адреса), и воспринимая сигнал состояния IOR, указывающий на цикл чтения В/В, он включает свои драйверы шины данных с тремя состояниями и посылает данные по линиям системных данных (SDx). Все линии остаются стабильными в течение нескольких циклов синхронизации шины, чтобы обеспечить распространение сигнала и настройку. IOR затем поддерживается высоким, и мастер-устройство сохраняет значение шины данных. Мастер-устройство затем освобождает адресную шину, а целевое устройство освобождает шину данных, выключая свои драйверы с тремя состояниями, чтобы задать для следующего цикла шины.

    (рис 2.5) Пример операции чтения В/В шины ISA

    Прерывания и циклы DMA могут запрашиваться устройствами по шине ISA с помощью линий Interrupt Request IRQx и линий запроса DMA DRQx. Сигнал сброса (RESET DRV) можно использовать для инициализации устройств при включении питания.

    Создание оборудования интерфейса В/В, которое соединяется с шиной

    Интерфейсы устройств В/В обычно соединяются с шиной. Основным строительным блоком, используемым для интерфейса устройств В/В, является порт В/В (называемый также регистром В/В). Порт входа В/В пересылает внешние данные из устройства В/В в процессор с помощью шины. Порт выхода В/В переносит данные из процессора во внешнее устройство В/В.

    Каждое устройство В/В имеет уникальный присвоенный адрес и имеет логическую схему декодера адреса, которая проверяет в шине этот адрес. Сначала посылается значение адреса, так чтобы схема декодера адреса имела стабильный действительный выход, прежде чем управляющие линии шины активируют схему.

    Данные входа В/В обычно содержатся в регистре в устройстве В/В. Как видно на рисунке 2.6, когда оборудование интерфейса порта входа В/В декодирует свой адрес на шине, и происходит операция чтения шины В/В, оно помещает значение своих данных в шину, включая свои драйверы с тремя состояниями для управления шиной данных. Должны использоваться три состояния, так как несколько устройств могут совместно использовать и управлять шиной данных (только по очереди). Интегральные схемы, созданные для присоединения к шине, такие как расширители порта В/В, содержат драйверы трех состояний и регистры, необходимые для интерфейса с шиной данных. Некоторые шины (а именно, PCI) мультиплексируют по времени информацию адреса и данных, используя одну шину, и должны будут сохранять значения адреса в регистре.

    (рис 2.6) Типичная операция оборудования порта входа В/В. Устройство включает свои драйверы с тремя состояниями, чтобы управлять шиной данных с данными входа устройства В/В, только когда оно декодирует свой адрес и происходит операция чтения шины. Процессор затем сохраняет значение шины данных в регистре

    Некоторые шины все еще используют более старую альтернативу для выходов с тремя состояниями, используя специальные логические вентили с открытым стоком или открытыми коллекторными выходами. Мышь и клавиатура PS/2 являются одним из таких примеров. В шине такого типа специальный логический вентиль выхода может управлять только низким сигналом данных, и единственный внешний резистор слабо (и несколько медленно по современным стандартам логики) переводит его в высокое состояние. Такой тип соединения шины называется иногда соединением монтажное-И или монтажное-ИЛИ. При таком типе вывода нет потенциального конфликта шины, когда два устройства могут попытаться направить сигнал в различные логические состояния. Два стандартный драйвера вывода в конфликте (т.е. один высокий и один низкий), соединенные с общей сигнальной линией, будут вызывать условие короткого замыкания уровня промежуточной логики и высокого сигнала тока.

    Порт вывода В/В пересылает данные из процессора в устройство В/В с помощью шины. Как видно на рисунке 2.7, когда оборудование интерфейса порта вывода В/В декодирует его адрес на шине, и происходит операция записи В/В шины, он пересылает значение шины данных в регистр вывода В/В. Данные вывода должны сохраняться в регистре, так как на шине он присутствует только в течение нескольких циклов синхронизации.

    (рис 2.7) Типичная операция оборудования порта В/В. Устройство загружает новые данные в регистр вывода порта В/В, только когда декодирует его адрес, и на шине происходит операция записи

    Реальные логические схемы несколько сложнее, чем показанные в этих примерах, так как некоторые сигналы состояния могут быть активными в шине на нижнем уровне, и данные должны передаваться в регистр в конце сигнала записи В/В (а не в начале), когда данные гарантировано будут действительны для задания, и удерживаются на регистре ввода.

    Чтобы минимизировать расфазировку синхронизации, вместо пропускания входа синхронизации с помощью вентиля AND, регистр с входом поддерживающим синхронизацию (или нагрузку) обеспечивает меньшую расфазировку синхронизации и минимизирует любые возможные проблемы метастабильности триггера (если возникает дополнительная проблема на выходе вентиля AND, то триггер может увидеть другой "фантомный" сигнал синхронизации в неподходящее время). При таком подходе команда записи В/В будет служить в качестве сигнала синхронизации, а выход декодера в качестве средства запуска. На шине ISA логика должна также проверять сигнал шины AEN на 0, чтобы гарантировать, что устройство не отвечает по ошибке на циклы DMA (DMA активирует одновременно более одного сигнала состояния шины ISA).

    Некоторые встроенные устройства могут требовать своих собственных специальных аппаратных устройств В/В. Существует несколько доступных вариантов. Вместо вычерчивания схем на уровне вентиля, поставщики микросхем и разработчики встроенных систем обычно проектируют оборудование В/В с помощью средств CAD, используя язык описания оборудования (HDL), такой как VHDL или Verilog. VHDL имеет синтаксис аналогичный Pascal или ADA, а Verilog похож на C. Затем синтезируется модель HDL для создания списка соединений. Список соединений является текстовым описанием схемы. Автоматизированные инструменты CAD затем могут использовать список соединений для размещения конструкции оборудования в специальном устройстве VLSI, Application Specific Integrated Circuit (ASIC), или Field Programmable Logic Array (FPGA). Стоимость начальной настройки и маски для специальных конструкций VLSI и ASIC является очень высокой, и требуются большие объемы продаж, чтобы покрыть высокие расходы разработки. FPGA являются более подходящими для производства в меньших объемах, но они также потребляют больше энергии и работают медленнее.

    В качестве примера конструкции устройства В/В на основе HDL мы преобразуем предыдущие конструкции устройств порта ввода и вывода ISA, показанные на рисунках 2.3, 2.6, и 2.7 в VHDL. Декодер адреса, описанный ранее, требует просто проверки на равенство в VHDL. На шине ISA AEN=1 указывает на операцию DMA. В VHDL число битов, которое требуется для каждой переменной, определяется, когда они объявляются в начале программы. Следующий код генерирует декодер адреса для портов:

    -- Декодер адреса на основе VHDL для for 0x3E0
    PORT_IO_DECODE <= '1' WHEN ADDRESS = X"3E0" AND
                                          AEN='0'   ELSE '0';

    В VHDL присваивание значения "Z" выходу указывает на выход с тремя состояниями. Буферы с тремя состояниями для присоединения к 8-битной шине данных и их соответствующая управляющая логика для 8-битного порта ввода, как видно на рисунке 2.6, можно сгенерировать с помощью:

    -- Порт ввода В/В на основе  VHDL - используйте буферы
    -- с тремя состояниями
    DATA <= PORT_DATA_IN WHEN PORT_IO_DECODE = '1' AND
                    IOR = '0' ELSE "ZZZZZZZZ";

    Для регистров в VHDL требуется процесс для восприятия перехода сигнала синхронизации. Регистры будут созданы с помощью D-триггеров. Следующий код генерирует 8-битный порт вывода, как показано на рисунке 2.7:

    -- Порт вывода В/В на основе 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;

    Использование HDL, такого как VHDL, с инструментами синтеза логики, делает конструкторов устройств более продуктивными, также как использование высокоуровневого языка делает более продуктивными разработчиков программного обеспечения. Порты В/В используют обычно 8, 16 или 32 бита. Большинство устройств имеют один порт В/В для передачи данных и второй порт В/В со смежным адресом В/В, который используется для битов статуса устройства, линий квотирования, и управляющих сигналов. Многие платы встроенных компьютеров предоставляют дополнительные порты В/В, называемые В/В общего назначения (GPIO) или иногда называемые параллельным портом для использования пользователями, когда они добавляют свое собственное специальное оборудование В/В.

    Другие шины первого поколения микропроцессора аналогичны. Несколько других интерфейсов устройств, имеющихся в ПК, по-прежнему имеют сигналы, похожие на ISA, так как они были первоначально получены из нее. Отметим, что в примерах цикла шины ISA, требуется минимум от 5 до 6 циклов шины ISA для передачи одного значения данных.

    По мере того как процессоры и память становятся быстрее, полоса пропускания шины ISA стала ограничивающим фактором. Сначала память была перенесена на более быструю выделенную шину процессора/памяти. Но высокоскоростные сетевые интерфейсы и графические платы все же требовали большей полосы пропускания шины, чем было доступно на шине ISA. Это привело к новому более быстрому второму поколению шин, как для ПК, так и для встроенных систем.

    Программное обеспечения передачи данных в порты В/В

    Когда используется операционная система, низкоуровневый код драйвера устройства обычно взаимодействует с портами В/В, и приложения пользователей вызывают эти драйверы устройств с помощью API OC. Для разработки кода драйвера устройства большинство компиляторов C/C++ позволяют использовать встраиваемый язык ассемблера. К сожалению, использование языка ассемблера означает, что код не будет переноситься на другой процессор. Это также затрудняет понимание кода для других разработчиков.

    На процессорах X86 должны использоваться две специальные машинные инструкции для передачи данных в порты В/В. Инструкция IN считывает данные из порта В/В, а инструкция OUT записывает данные в порт В/В. Для этих инструкций X86 16-битный регистр адреса В/В (DX) является одним из операндов, а 8-битный регистр (AL), который содержит значение данных является другим операндом. Это единственные две инструкции, которые будут генерировать циклы шины для чтения и записи В/В. Пример встроенного в C/C++ кода языка ассемблера X86 показан в примере 2.1. Ключевое слово _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
          }				       			}

    На многих процессорах эти инструкции В/В являются также привилегированными и могут перехватываться в оборудовании с помощью задания бита режима процессора, чтобы запретить пользователям непосредственно выполнять В/В вместо использования вызовов API ОС для выполнения В/В. Традиционные настольные операционные системы Windows используют этот бит режима, чтобы сделать инструкции В/В привилегированными, но многие встроенные операционные системы, включая Windows Embedded CE этого не делают. Некоторые RISC-процессоры резервируют специальный диапазон адресов в памяти для устройств В/В (отображенный в память В/В) и затем используют обычные инструкции Load и Store для переноса данных в устройства В/В. Кэширование данных порта В/В отображенной памяти должно быть отключено. C# не допускает встраивание языка ассемблера непосредственно, но может вызывать процедуры C/C++ в динамически подключаемой библиотеке (DLL), используя процедуру, называемую P/invoke.

    Для разработки кода драйвера устройства большинство компиляторов C/C++ имеют специальные вызовы функций, которые могут читать и записывать в порты В/В. В Windows Embedded CE, использующей CE Device Driver Kit (CEDDK), две такие функции C предоставлены для 8-битных портов В/В. Функция WRITE_PORT_UCHAR(адрес В/В, данные) записывает значение данных в порт В/В. Функция READ_PORT_UCHAR(адрес В/В) возвращает значение данных, прочитанное из порта В/В. В файле исходного кода требуется заголовочный файл CEDDK.h и код должен быть скомпонован с библиотекой CEDDK.lib.

    Эти вызовы функций обычно находятся только в низкоуровневых драйверах устройств В/В. При таком подходе код будет легко переноситься на другие процессоры и будет легче для чтения и понимания (особенно для тех, кто не знает язык ассемблера процессора). C# не имеет таких функций, но может вызывать функции C/C++, которые определены в библиотеке *.dll, с помощью специального средства [DLLIMPORT] P/invoke.

    Пример шины микропроцессора второго поколения

    Так как ограничения полосы пропускания и размера адресации памяти шин первого поколения, таких как ISA, стали очевидны, были предложены несколько новых стандартов шин. В начале 1990-х компания Intel представила шину PCI (Взаимосвязь Периферийных Компонентов). Эта шина стала наиболее широко используемым стандартом и сегодня развитием стандарта PCI занимается организация PCI Special Interest Group. PCI является синхронной шиной, вся передача данных по которой происходит согласно частоте шины PCI. В начале частота шины PCI была 33 Mhz. Более новые системы PCI-X могут иметь частоту 66, 133, 266 и 533 MHz. Длину, нагрузку и импеданс сигнальных линий шины PCI необходимо тщательно контролировать, чтобы поддерживать эти высокие частоты. К одной шине PCI может быть присоединено только несколько устройств. Сигналы PCI являются даже слишком быстрыми, чтобы правильно функционировать при подключении устройств на студенческой панели для прототипов с длинными соединительными проводами. PCI поддерживает уровни логики 5V и 3.3V. PC/104-Plus является версией платы 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 во время фазы адреса
    Команда шины 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). Стандарт CardBus для небольших подключаемых модулей получен из сигналов шины PCI.

    В последнее время графические платы начали потреблять большую часть доступной полосы пропускания шины PCI, поэтому они были перенесены на новую шину Accelerated Graphics Port (AGP). AGP основывается на сигналах шины PCI. Так как AGP соединяется только с одним устройством, графической платой, то технически она является портом, а не шиной. AGP 2X, 4X, и 8X содержат дополнительные сигналы и фазы синхронизации, которые увеличивают эффективную частоту работы.

    Программное обеспечение для устройств PCI

    Для поддержки автоматической конфигурации оборудования, каждое устройство PCI содержит область конфигурации, размером 256 байтов. При включении питания устройства PCI могут самостоятельно сообщать информацию о производителе и типе устройства, чтобы помочь операционной системе найти и загрузить правильные драйверы устройств. Устройства PCI, которые отображают в память и адресное пространство В/В, можно запрограммировать для ответа на различные базовые адреса и прерывания. Это позволяет программному обеспечению операционной системы загружать драйверы и присваивать адреса и прерывания автоматически во время включения питания. Перечисление является термином, который используется для описания этого процесса. Это исключает необходимость устанавливаемых вручную перемычек и переключателей. Операционная система обычно предоставляет драйвер, который обрабатывает перечисление, но драйверы устройств по прежнему нужны для каждого устройства PCI на шине.

    Пример шины микропроцессора третьего поколения

    Недавно была представлена шина PCI Express, которая предоставляет еще большую полосу пропускания, чем PCI. Увеличение полосы пропускания выше уровней PCI, за счет создания большого числа плотно упакованных высокоскоростных параллельных линий соединения шины на современных монтажных платах было больше невозможно, но это можно было сделать с помощью нового поколения высокоскоростных драйверов, когда используется меньшее количество линий, и длина, нагрузка, перекрестные помехи, и окончание каждой линии тщательно контролируется. В PCI Express используется небольшое число высокоскоростных последовательных линий для передачи сигналов шины PCI. Скорость передачи данных высокоскоростных последовательных линий PCI Express лежат в диапазоне от 2.5 до 10 Гбайт/сек. Для большей полосы пропускания несколько высокоскоростных последовательных линий можно объединять в группу для соединения с устройством (называемую lane (тропинка) в PCI Express). Регистры смещения в интерфейсе PCI каждого устройства преобразуют сигналы из последовательного в параллельный. Так как PCI Express пересылает те же самые сигналы PCI, работа программного обеспечения PCI не изменяется. Новый стандарт ExpressCard для небольших подключаемых модулей основывается на PCI Express. PCI может поддерживать уровни логики 5V и 3.3V. Примерно в это же время стандарт PCI также был обновлен для поддержки более высокой частоты шины.

    Существует ряд других стандартов высокоскоростных шин, включая HyperTransport компании AMD, RapidIO компании Freescale, и FlexIO компании Rambus. Многие используют теперь низковольтные дифференциальные сигналы на сигналах шины.

    Согласование по времени, длина шины, нагрузка (число соединенных с шиной устройств), и окончание все являются критически важными на современных шинах микропроцессоров, и необходимо понимать и детально проверять требования при проектировании нового оборудования, и даже при прокладке трассировки печатной платы для шины. Многие шины требуют внешнего резистора на каждой сигнальной линии для правильного окончания. Полные спецификации стандартов шин могут занимать несколько сотен страниц и доступны для разработчиков оборудования из различных источников. Полностью совместимый интерфейс PCI требует более десяти тысяч логических вентилей. Базовый дизайн интеллектуальной собственности PCI также доступен у ряда поставщиков для разработчиков оборудования для использования в новых конструкциях.

    Пример встроенной системы X86

    Современные компьютерные системы содержат иерархию шин. Каждая шина имеет различный набор компромиссов между шириной полосы пропускания и стоимостью. Шина процессора и памяти является шиной с самой широкой полосой пропускания и эти соединения могут иметь длину только в пару дюймов с некоторыми устройствами памяти. Мост шины используется для соединения сигналов одного типа шины с другим. Большинство систем имеют один или несколько мостов для преобразования сигналов из контактов процессора в шины, которые содержат устройства В/В.

    Типичная аппаратная система совместимая с ПК, созданная для встроенных устройств с помощью Vortex86 System-on-a-chip (SoC) показана на рисунке 2.10. Устройство eBox 2300, которое будет использоваться в качестве целевого устройства для лабораторных проектов, использует Vortex86 SoC и содержит подмножество этого оборудования. Отметим, что единственная микросхема Vortex86 SoC содержит процессор X86 вместе с двумя микросхемами моста (северный мост и южный мост), которые имеются в ПК, который имеет как шину PCI, так и шину ISA.

    (рис 2.10) Блочная диаграмма конструкции встроенного ПК на основе Vortex86

    Традиционный северный мост соединяется с контактами процессора и предоставляет шину памяти для соединения с SDRAM и шиной PCI. Микросхемы контроллера сети Ethernet соединяются с шиной PCI. Традиционный южный мост также соединяется с шиной PCI и предоставляет шину Low Pin Count (LPC), интерфейс BIOS ROM, и несколько других интерфейсов ПК для В/В. Шина только для материнских плат Low Pin Count (LPC), сгенерированная южным мостом, требует меньше контактов микросхемы, чем ISA, и использует частоту 33Mhz, но действует аналогично ISA в программном обеспечении. Более медленные унаследованные устройства соединяются с микросхемой южного моста. Микросхема SuperIO предоставляет совместимый с ПК интерфейс флоппи-диска, принтера и последовательного порта. Микросхема моста ISA предоставляет сигналы шины ISA для коннектора PC/104.

    Методы передачи В/В

    Большинство устройств В/В на порядки величин медленнее процессора. Линии квитирования устройства В/В должны использоваться для синхронизации каждой передачи данных В/В. Каждое устройство В/В задает линию квитирования оборудования (т.е., ввод готов, вывод готов), когда будет готово к передаче данных. Перед каждой новой передачей данных в порт данных устройств В/В, процессор или другое оборудование должно проверить, что устройство В/В готово, считывая и проверяя линию квитирования устройства. Биты линии квитирования обычно соединяются с другим портом В/В, называемым портом статуса. Обычно порт статуса устройства имеет следующий адрес В/В после порта данных В/В (это также экономит оборудование декодера адреса, так как оно может совместно использоваться несколькими последовательными адресами). Имеется три основных подхода, используемых для передачи данных в устройства В/В. Это программируемый В/В (называемый также опросным или программно управляемым В/В), управляемый прерываниями В/В, и прямой доступ к памяти (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);

    Когда устройство готово, процессор затем вводит или выводит значение данных на устройство В/В. Когда процессор считывает или записывает порт данных, линия квитирования обычно сбрасывается в ноль оборудованием.

    Такой подход обычно ограничен простыми системами, имеющими только несколько устройств В/В, так как имеется значительная перегрузка процессора, который должен постоянно в программном обеспечении циклически проверять биты готовности всех устройств В/В. Во многих случаях это не позволяет также процессору переходить в режимы экономии энергии, что является важным фактором для работающих от батарей устройств. В мультизадачных ОС для В/В обычно используются другие методы, которые требуют меньшей нагрузки на процессор, и освобождают время процессора для выполнения других процессов.

    Передачи В/В управляемого прерываниями

    Для управляемого прерываниями В/В сигналы готовности В/В используются для генерации сигнала прерывания оборудования. Сигнал прерывания обычно останавливает процессор на следующий инструкции (при условии, что прерывания активированы), и процессор вызывает процедуру обслуживания прерывания (ISR). Эта процедура затем обрабатывает прерывание и возвращает управление, как показано на рисунке 2.11.

    (рис 2.11) Когда происходит прерывание, после окончания выполнения текущей инструкции, управление передается соответствующей процедуре обслуживания прерывания (ISR). ISR выполняет затем необходимые операции В/В, чтобы снять прерывание и переслать данные. ISR возвращает управление назад следующей инструкции в прерванном процессе, когда завершается. Чтобы сократить задержку прерывания, некоторые ISR могут запускать поток службы прерывания (IST) сразу перед возвратом, чтобы завершить некоторые задачи позже

    Использование прерываний исключает циклы ожидания готовности В/В процессором, которые требуются в программном В/В. Процедура службы прерываний пересылает данные, снимает сигнал прерывания и возвращает управление. Процедуры прерываний должны вначале сохранить все регистры в стеке, обработать прерывание, восстановить значения регистров из стека, и затем вернуть управление в код, который был прерван, используя адрес возврата прерывания, хранящийся в стеке.

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

    Специальное оборудование, называемое контроллером прерываний, используется для активации/деактивации и задания приоритетов нескольких сигналов прерываний. Многие процессоры имеют векторную систему прерываний. В случае векторных прерываний каждая отдельная линия сигнала аппаратного прерывания соединяется с различным адресом ISR. Когда происходит прерывание, процессоры X86 выполняют поиск в таблице адресов ISR в нижней области памяти и затем напрямую переходят к ISR. Меньшие номера прерываний обычно имеют более высокий приоритет (они могут даже прервать ISR прерывания с большим номеров). Присваивая более быстрые устройства прерываниям с меньшими номерами, можно задать приоритет более быстрым устройствам В/В. Сигналы прерываний можно использовать для более чем одного устройства, но в этом случае ISR должна будет проверять бит статуса, чтобы определить, какое устройство В/В необходимо обслужить.

    Некоторые критически важные разделы кода (называемые нереентерабельными) могут требовать, чтобы прерывания были отключены. Большинство процессоров имеют машинную инструкцию для включения и отключения прерываний. Время задержки прерывания задается самой длинной инструкцией или самым длинным блоком кода, который отключает прерывания. RTOS создано для минимизации этого времени. Длительность времени выполнения ISR также критически важно. Во многих случаях ISR сохраняет данные, сбрасывает в ноль сигнал запроса прерывания, и возвращает управление сразу после запуска потока обслуживания прерывания (IST), который выполняется позже для завершения операции.

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

    Оборудование контроллера прерываний необходимо для задания приоритетов прерываний и включения/отключения каждого сигнала прерывания. Для прерываний нужны также дополнительные сигналы шины. Для сигналов прерываний используют на шине ISA линии IRQx, а на шине PCI линии INTx. По соображениям безопасности ОС должна контролировать все оборудование прерываний, таблицу вектора прерываний, и ISR. Многие драйверы устройств В/В управляются прерываниями.

    Большинство компиляторов C/C++ имеют специальные функции для настройки ISR в ОС. Они автоматически сохраняют все регистры и правильно возвращают управление, используя адрес возврата прерывания в конце ISR. Обычно доступна еще одна функция для регистрации ISR в системе и настройки таблицы адресов ISR, необходимой для обслуживания прерывания и перехода к ISR. Процедуры ISR могут обычно использовать только небольшое ограниченное подмножество вызовов API ОС. Обычно предоставляются вызовы функций C для включения и отключения прерываний.

    Передачи В/В на основе прямого доступа к памяти (DMA)

    Контроллер прямого доступа к памяти (DMA) является специальным оборудованием, которое передает блоки данных непосредственно в/из памяти и устройства В/В. Контроллер DMA требует машины состояний с указателем адреса и счетчиком. Контроллер DMA функционирует как мастер шины. Подобно процессору он может служить в качестве мастера шины и инициировать циклы шины. Оборудование контроллера DMA автоматически ведет обратный отсчет числа значений данных и настраивает свой указатель адреса, когда каждое новое значение данных передается по шине.

    Процессор непосредственно не вовлечен в операцию передачи DMA, когда она начинается. Так как контроллер(ы) DMA и процессор должны совместно использовать шину, требуется арбитражное оборудование шины для управления доступом к шине (т.е., получит ли следующий цикл шины контроллер DMA или процессор). Контроллер DMA прерывает процессор, когда его передача блока завершается, и его счетчик достигает нуля. Процессор затем программирует регистр адреса контроллера DMA и счетчик для начала новой передачи DMA. Для каждого контроллера DMA требуется специальное оборудование и для поддержки DMA требуется система прерываний. Большинство современных процессоров имеют кэш-память, которая помогает освободить полосу пропускания шины для использования контроллерами DMA.

    (рис 2.14) Во время цикла шины DMA, контроллер DMA служит в качестве контроллера шины, а процессор отсоединяется (три-состояния) от шины. Для DMA требуется арбитражное оборудование шины

    Для поддержки DMA требуются дополнительные сигналы шины. Контроллеры DMA должны запрашивать цикл шины и ждать, пока он не будет предоставлен арбитражным оборудованием шины. На шине ISA для DMA используются сигналы DRQx и DACKx, а шина PCI использует для DMA сигналы REQx и GNTx.

    В целях безопасности ОС должна контролировать все оборудование DMA. DMA наиболее эффективен, когда используется для высокоскоростных устройств блочной передачи, таких как дисковые устройства (диски пересылают секторы) и сетевых интерфейсов (пересылают пакеты). В идеальной системе несколько контроллеров DMA и процессор будут действовать параллельно, позволяя совмещать вычисления на процессоре с операциями пересылки В/В DMA. Когда один процесс занят, ожидая завершения своих операций В/В DMA, процессор может выполнять полезные вычисления на другом процессе.

    В Windows Embedded CE библиотека CEDDK и ядро имеют несколько функций, которые используются для поддержки DMA.

    Поддержка в ОС независимого от устройств В/В и файлов

    Операционные системы предоставляют поддержку для нижележащего оборудования В/В. Многие устройства В/В могут поддерживаться в прикладных программах, используя вызовы API основной файловой системы. Одним из важных свойств операционной системы является поддержка, которую она предоставляет для В/В файловой системы. Это обеспечивает единообразное логическое представление хранения информации. Различные устройства памяти и множество устройств В/В (включая последовательные и параллельные порты) могут использовать единый интерфейс API для чтения и записи данных. Обычно вызовы API ОС поддерживают следующие пять базовых файловых операций:

    Open (или Create ): Для операции чтения (read) на существующем файле операция open (открыть) находит файл, для операции записи ( write ) она ищет доступное пространство на устройстве памяти и обычно выделяет пространство буфера для обработки файловых пересылок. Имя файла передается при вызове open. Для операций В/В некоторых устройств, таких как последовательный порт, имя файла является именем устройства и допускается только одна операция Open в данный момент, так как устройство требует монопольного доступа. Аргумент операции open обычно определяет, будет ли файл использоваться для чтения или записи. Могут возникать ошибки, если файл не будет найден для операции чтения или нет доступного пространства на устройстве памяти для операции записи.

    Read: Следующий блок данных считывается из открытого файла. Аргументами являются идентификатор файла или описатель файла и указатель на область буфера, в которую возвращаются прочитанные данные.

    Write: Следующий блок данных записывается в открытый файл. Аргументами являются идентификатор файла или описатель файла и указатель на область буфера, из которой копируются данные для записи. Может возникать ошибка, когда нет доступного пространства на устройстве хранения.

    Seek: Перемещение в определенную позицию файла. Аргумент обычно является номером записи для поиска. Поиск (seek) выполняется значительно быстрее, чем чтение несколько раз для перемещения к определенной записи в файле. Обычно операция поиска не поддерживается для всех типов файлов и устройств.

    Close: Закрывает открытый файл. Для операции записи, операция close выталкивает все буферы записи и обновляет записи последнего каталога для нового файла. Освобождает также внутреннее буферное пространство файла. Операция close требуется в большинстве операционных систем. В некоторых, но не во всех операционных системах, при завершении процесса все открытые файлы процессов автоматически закрываются.

    В большинстве случаев все эти функции возвращают коды ошибок, которые необходимо проверять в приложении. В Windows Embedded CE, эти файловые операции предоставляют функции CreateFile, ReadFile, WriteFile, SetFilePointer и CloseHandle. Посмотрите в оперативной справке дополнительную информацию о параметрах этих функций.

    Кодирование символов Unicode и ASCII

    Встроенные системы, созданные для международных рынков, которые требуют поддержки различных языков обычно используют 16-битный стандарт кодирования символов Unicode. Многие периферийные устройства В/В используют 8-битный код символов ASCII, показанный в таблице 2.3. Первые 128 символов Unicode совпадают с символами ASCII, но с дополнительным ведущим нулевым байтом перед ними. Таблицы преобразования можно найти по адресу www.unicode.org/charts/ . (Английский язык использует Basic Latin Script)

    Таблица преобразования символов ASCII в шестнадцатеричное представление
    0 1 2 3 4 5 6 7 8 9 A B C D E F
    0NUL SOH STX ETX EOT ENQ ACK BEL BS HT LF VT FF CR SO SI
    1DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US
    2SP ! " # $ % ' ( ) * + , - . /
    30 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
    5P 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
    7p 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".

    BEL (bell) - Вызывает звуковой сигнал на терминалах и в программах эмуляции терминалов.

    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. Смотрите оперативную справочную систему для получения дополнительной информации о параметрах этих функций.

    Дополнительная информация

  • ISA EISA Theory and Operation, Edward Solari. (RTCbooks) (ISBN 0-929392-15-9)
  • ISA System Architecture, Don Anderson и Tom Shanley (ISBN 0-929392-15-9) (MindShare) (ISBN 0-201-40996-8)
  • PCI Hardware Software Architecture and Design, Edward Solari George Willse (RTCbooks) (ISBN 0-929392-59-0)
  • PCI System Architecture, Tom Shanley (MindShare) (ISBN 0-201-40993-3)
  • Специальная группа по интересам PCI www.pcisig.org продает полную спецификацию PCI
  • PCMCIA (Personal Computer Memory Card International Association) www.pcmcia.org имеет спецификации доступные на модулях PC Card и Express card.
  • Спецификация PCI 104 доступна по адресу http://www.pc104.org/
  • Лабораторные упражнения

  • Вычислите пиковую полосу пропускания В/В 16-битной шины ISA, которая использует шесть 8Mhz тактов на передачу, и сравните с 32-битной шиной PCI с частотой 66Mhz, выполняющей пакетную передачу PCI четырех значений данных с распределением тактов по времени 2-1-1-1 на пакет.
  • Если вы использовали ранее в предыдущих курсовых работах инструменты синтеза и моделирования VHDL или Verilog, разработайте синтетическую модель порта В/В ISA и промоделируйте операции В/В чтения и записи в порт В/В. НЕ забудьте протестировать те случаи, где порт В/В не должен отвечать, такие как другой адрес В/В или циклы шины, отличные от чтения и записи В/В. Бесплатные инструменты VHDL и Verilog доступны также студентам от основных поставщиков FPGA, включая Altera и Xilinx
  • Повторите предыдущую задачу для шину PCI со следующими предположениями для упрощения синтетической модели HDL и моделирования:
  • Необходимо реализовать и промоделировать сигналы шины PCI, показанные на чертеже тайминга PCI в учебнике. Можно проигнорировать IRDY и TRDY и предположить, что оба устройства всегда готовы к работе.
  • Не нужно реализовывать отдельные активации байтов на 32-битном порте вывода и предполагать, что он недоступен в пакетной передаче PCI (т.е., предполагаем, что за цикл шины PCI передается только 1 значение данных).
  • Используйте начальный сигнал сброса для очистки всех регистров во время моделирования.
  • Частота шины PCI равна 33Mhz, а шина адрес/данные имеет ширину 32-бита.
  • Сохраняйте любые значения, необходимые из шины, на поднимающемся ребре генератора шины PCI, используя положительное ребро, запускаемое DFF или регистром.
  • Чтобы обнаружить начало цикла шины, сохраните предыдущее значение сигнала Frame в 1-битном регистре. Когда старое (сохраненное) значение равно "1", а текущее значение равно "0", предполагаем, что это указывает на первый такт генератора нового цикла шины, который содержит адрес и информацию о команде (а не данные).
  • На первом такте сохраните адрес (A/D) и информацию о команде шины (C/BE) в регистре. Затем проверьте значения на выходе регистров, чтобы декодировать адрес, и проверьте (C/BE) на тип операции шины, чтобы решить, какую выполнять операцию на втором такте цикла шины. Понадобиться автоматическая очистка обоих значений этих регистров в конце цикла шины PCI.
  • Поищите в Web другие стандарты шин, используемые для семейства процессоров ARM, и сделайте сводку основных сигналов шины.
  • Существуют специальные платы PCI для соединения Logic Analyzers с шиной PCI вместе со специальным программным обеспечением, которое декодирует циклы шины PCI, как показано на рис 2.13 (рис 2.13) Логический анализатор Tektronix настроен для захвата и декодирования сигналов шины PCI. Этот логический анализатор является на самом деле встроенной системой, которая выполняет Windows XP. Специальная плата адаптера посредника PCI используется для быстрого соединения контактных датчиков со специальной программой ПЗУ логического анализатора. Изображения с разрешения Nexus Technology
  • Многие процессоры имеют специальные встроенные контакты отладки оборудования или другие средства для трассировки выполнения инструкций процессора, используя специальное оборудование тестирования, аналогичное логическому анализатору. На некоторых простых процессорах можно также следовать за выполнением инструкций, соединяя логический анализатор с линиями адреса памяти и данных процессоров. Пример показан на рис 2.14(рис 2.14) Логический анализатор Tektronix с дополнительной настройкой программного обеспечения для захвата и дизассемблирования последовательности выполнения инструкций процессора ARM. Этот логический анализатор является на самом деле встроенной системой, которая выполняет Windows XP. Изображения с разрешения Nexus Technology
  • Вернуться к учебному плану