Введение в архитектуру ввода/вывода встроенных систем
Передачи В/В на основе прямого доступа к памяти (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) является стандартным семибитным кодом для компьютерного оборудования, принятым в 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/