Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ЭВМ лекции

.pdf
Скачиваний:
85
Добавлен:
08.05.2015
Размер:
2.95 Mб
Скачать

USB на рынок портативных устройств. В результате в конце 2001 года было принято дополнение к стандарту USB 2.0 – спецификация USB OTG (On-The-Go), предназначенная для соединения периферийных USB-устройств друг с другом без необходимости подключения к хосту (например, цифровая камера и фотопринтер). Устройство, поддерживающее USB OTG, способно частично выполнять функции хоста и распознавать, когда оно подключено к полноценному хосту (на основе ПК), а когда к другому периферийному устройству.

Спецификация описывает также протокол согласования выбора роли хоста при соединении двух USB OTG-устройств.

Данные на шине передаются транзакциями, интервал между которыми составляет 1 мс. Предусмотрено четыре типа транзакций.

Управляющие передачи используются для конфигурации вновь подключенных устройств (например, присвоения им адреса USB) и их компонентов. Устройства с максимальной производительностью могут быть настроены на работу с конфигурационными сообщениями длиной 8, 16, 32 или 64 байта (по умолчанию - 8 байт). Устройства с низкой

производительностью в состоянии распознавать управляющие сообщения длиной не более 8 байт.

Групповая передача (bulk) используется для адресной пересылки данных большого объема (до 1023 байт). В качестве примера можно привести передачу данных на принтер или от сканера. Устройства с низкой производительностью не поддерживают этот режим.

Передача данных прерывания, например, введенных с клавиатуры данных или сведений о перемещении мыши. Эти данные должны быть переданы

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

Изохронные передачи (передачи в реальном масштабе времени).

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

321

допустимый интервал задержки). За один сеанс в таком режиме может быть передано до 1023 байт. Устройства с низкой производительностью не поддерживают этот режим.

Следует также отметить, что разными производителями предлагались спецификации, описывающие интерфейс различных аппаратных реализаций контроллера USB. Фирмой Intel была предложена спецификация UHCI (Universal Host Controller Interface), которая предусматривает чрезвычайно простую аппаратную реализацию контроллера USB. В рамках данной спецификации

основные функции контроля и арбитража шины возлагаются на программный драйвер. Альтернативная спецификация была предложена компаниями Compaq, Microsoft и National Semiconductor - OHCI (Open Host Controller Interface).

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

Интерфейс IEEE 1394 - FireWire

Группой компаний при активном участии Apple была разработана технология последовательной высокоскоростной шины, предназначенной для

обмена цифровой информацией между компьютером и другими электронными устройствами. В 1995 году эта технология была стандартизована IEEE (стандарт IEEE 1394-1995). Компания Apple продвигает этот стандарт под торговой маркой FireWire, а компания Sony - под торговой маркой i-Link.

Интерфейс IEEE 1394 представляет собой дуплексную, последовательную, общую шину для периферийных устройств. Она предназначена для подключения компьютеров к таким бытовым электронным приборам, как записывающая и воспроизводящая видео- и аудиоаппаратура, а также используется в качестве интерфейса дисковых накопителей.

Первоначальный стандарт (1394a) поддерживает скорости передачи данных 100 Мбит/с, 200 Мбит/с и 400 Мбит/с. Последующие усовершенствования стандарта (1394b) обеспечивают поддержку скорости передачи данных 800 и 1600

Мбит/с (FireWire-800, FireWire-1600).

322

Устройства, которые передают данные на разных скоростях, могут быть одновременно подключены к кабелю (поскольку пары обменивающихся данными устройств используют для этого одну и ту же скорость). Рекомендуемая максимальная длина кабеля между устройствами составляет 4,5 м. К кабелю общей длиной до 72 м может быть одновременно подключено до 63 устройств, называемых узлами (nodes). Для увеличения числа шин вплоть до максимального значения (1023) могут быть использованы мосты.

Каждое устройство обладает 64-разрядным адресом:

6 бит - идентификационный номер устройства на шине,

10 бит - идентификационный номер шины, 48 бит - используются для адресации памяти (каждое устройство может

адресовать до 256 Тбайт памяти).

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

Как правило, устройства имеют по 1-3 порта, причем одно устройство может быть включено в любое другое (с учетом ограничений на то, что между любыми двумя устройствами может быть не более 16 пролетов и они не могут быть соединены петлей). Допускается подключение в "горячем" режиме, поэтому устройства могут подключаться и отключаться в любой момент. При подключении устройств адреса назначаются автоматически, поэтому присваивать их вручную не придется.

IEEE 1394 поддерживает два режима передачи данных.

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

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

323

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

Пакеты данных пересылаются порциям, которые имеют размер, кратный 32 битам, и называются квадлетами (guadlets). При этом пакеты начинаются, по меньшей мере, с двух квадлетов заголовка, после чего следует переменное число квадлетов полезной информации. Для заголовка и полезных данных контрольные суммы (CRC) указываются отдельно. Длина заголовков асинхронных пакетов составляет, как минимум, 4 квадлета. У изохронных пакетов может быть заголовок длиной 2 квадлета, поскольку единственным необходимым при этом адресом является номер канала.

IEEE 1394 выделяет следующие функции устройств:

Хозяин цикла (cycle master) – выполняется корневым узлом, имеет наивысший приоритет доступа к шине, обеспечивает общую синхронизацию остальных устройств на шине, а также изохронных сеансов передачи данных.

Диспетчер шины (bus manager) управляет питанием шины и выполняет некоторые функции оптимизации.

Диспетчер изохронных ресурсов (isochronous resource manager)

распределяет временные интервалы среди узлов, собирающихся стать передатчиками (talkers).

Все функции диспетчеризации могут выполняться одним и тем же либо различными устройствами. Хозяин цикла посылает синхронизирующее сообщение о начале цикла через каждые 125 мкс (как правило). Теоретически 80% цикла (100 мкс) резервируется для изохронного трафика, а остальная часть становится доступной для асинхронного трафика. Сначала узлы с изохронными данными для пересылки, а также те узлы, которым был назначен номер канала, пытаются получить доступ к шине на время передачи (сразу же после каждого сообщения о начале цикла), и узел, который ближе всего находится к корневому узлу, первым получит разрешение на передачу данных. Каждый последующий

узел с назначенным номером канала и изохронным трафиком для пересылки

324

последовательно получает разрешение на передачу данных. Затем пытаются получить доступ к шине и узлы с асинхронным трафиком.

Для подключения к данному интерфейсу применяется 6-контактный соединитель. Используемый при этом кабель имеет круглую форму и содержит:

экранированную витую пару А (ТРА), в которой используется симметричное, разностное напряжение (для обеспечения требуемой помехоустойчивости), а данные передаются в обоих направлениях с помощью схемы кодирования NRZ1). Фактически напряжение составляет

172-265 мВ;

экранированную витую пару В (ТРВ), пересылающую стробирующий сигнал, который изменяет состояние всякий раз, когда два последовательных разряда данных (на другой паре) одинаковы (т.н. кодирование данных со стробированием data-strobe encoding), и

гарантирует изменение состояния в паре для передачи данных либо стробирующих сигналов по фронту каждого разряда;

провода, обеспечивающие питание небольших устройств. При этом по проводу VP подается напряжение 8-40 В, обеспечивающее нагрузку до 1,5А, а провод VG заземлен. Впрочем, существуют варианты соединения, в котором провода питания отсутствуют;

общий экран, который изолирован от экранов пар и прикреплен к корпусам соединителей.

ВIEEE 1394b допускается применять также простые UTP-кабели 5-й категории, но только на скоростях до 100 Мбит/с. Для достижения максимальных

скоростей на максимальных расстояниях предусмотрено использование оптоволокна (пластмассового для длины до 50 метров, и стеклянного - для длины до 100 метров).

325

Программирование COM-порта

В ОС MS-DOS управление COM-портом осуществлялось непосредственно через регистры ввода-вывода с использованием прерываний. С платформой Win32 напрямую работать с регистрами портов нельзя, Windows этого не позволяет, но можно не обращать внимания на тонкости различных реализаций и не возиться с обработкой прерываний. Windows требует точного соблюдения аппаратного протока обмена с внешними устройствами. Другими словами, у Вас не получится управлять, например, светодиодом подключенным к одному из выводов параллельного порта. Просто потому, что система будет требовать отработки и сигналов STROBE и ACK. Если Вас это не устраивает, то выход один

писать собственный драйвер.

Споследовательными и параллельными портами в Win32 работают как с файлами. Следовательно, начинать надо с открытия порта как файла. Для этого необходимо воспользоваться функцией CreateFile. Эта функция предоставляется Win32 API. Ее прототип выглядит так:

HANDLE CreateFile( LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode,

LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDistribution,

DWORD dwFlagsAndAttributes, HANDLE hTemplateFile

);

lpFileName указатель на строку с именем открываемого или создаваемого файла. В частности можно указывать сетевые имена для доступа к файлам на других компьютерах. Можно открывать логические разделы или физические диски и работать в обход файловой системы. Последовательные порты имеют имена \\\\.\\COM1, \\\\.\\COM2 и т.д. Если к порту подключено какое-то используемое оборудование (мышь, принтер), Windows не даст открыть этот порт.

dwDesiredAccess задает тип доступа к файлу. Возможно использование следующих значений:

0 – опрос атрибутов устройства без получения доступа к нему.

GENERIC_READ файл будет считываться.

326

GENERIC_WRITE файл будет записываться. GENERIC_READ|GENERIC_WRITE файл будет и считываться и записываться.

dwShareMode задает параметры совместного доступа к файлу. Коммуникационные порты нельзя делать разделяемыми, поэтому данный параметр должен быть равен 0.

lpSecurityAttributes задает атрибуты защиты файла. Поддерживается только в Windows NT. Однако при работе с портами должен в любом случае равняться NULL.

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

dwFlagsAndAttributes задает атрибуты создаваемого файла. Так же управляет различными режимами обработки. Для наших целей этот параметр должен быть или равным 0, или FILE_FLAG_OVERLAPPED. Нулевое значение используется при синхронной работе с портом, а FILE_FLAG_OVERLAPPED при асинхронной, или другими словами, при фоновой обработке ввода/вывода.

TemplateFile задает описатель файла-шаблона. При работе с портами всегда должен быть равен NULL.

При успешном открытии файла, в нашем случае порта, функция возвращает описатель, дескриптор (HANDLE) файла. При ошибке INVALID_HANDLE_VALUE. Код ошибки можно получитить вызвав функцию GetLastError.

Открытый порт должен быть закрыт перед завершением работы программы.

В Win32 закрытие объекта по его описателю выполняет функция CloseHandle:

BOOL CloseHandle(HANDLE hObject);

Функция имеет единственный параметр описатель закрываемого объекта. При успешном завершении функция возвращает не нулевое значение, при ошибке нуль.

Пример:

#include <windows.h>

. . .

HANDLE port;

. . .

327

port=CreateFile("COM2",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTI NG,0,NULL);

if(port==INVALID_HANDLE_VALUE) {

MsgBox(NULL,"Невозможно открыть порт COM2","Error",MB_OK); ExitProcess(1);

}

. . .

CloseHandle(port);

. . .

В данном примере открывается порт СОМ2 для чтения и записи, используется синхронный режим обмена. Проверяется успешность открытия порта, при ошибке выводится сообщение и программа завершается. Если порт открыт успешно, то он закрывается.

Открыв порт, программа получает его в монопольное распоряжение. Однако прежде чем начать ввод/вывод, необходимо настроить порт. Это касается только последовательных портов, для которых задаются скорость обмена, параметры четности, формат данных и др. Кроме того существует несколько специфичных для Windows параметров. Речь идет о тайм-аутах, которые позволяют контролировать как интервал между принимаемыми байтами, так и общее время приема сообщения.

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

typedef struct _DCB {

DWORD DCBlength; // sizeof(DCB) DWORD BaudRate; // current baud rate

DWORD fBinary:1; // binary mode, no EOF check DWORD fParity:1; // enable parity checking DWORD fOutxCtsFlow:1; // CTS output flow control DWORD fOutxDsrFlow:1; // DSR output flow control DWORD fDtrControl:2; // DTR flow control type DWORD fDsrSensitivity:1; // DSR sensitivity DWORD fTXContinueOnXoff:1; // XOFF continues Tx DWORD fOutX:1; // XON/XOFF out flow control DWORD fInX:1; // XON/XOFF in flow control

DWORD fErrorChar:1; // enable error replacement DWORD fNull:1; // enable null stripping

DWORD fRtsControl:2; // RTS flow control

DWORD fAbortOnError:1; // abort reads/writes on error DWORD fDummy2:17; // reserved

328

WORD wReserved; // not currently used WORD XonLim; // transmit XON threshold WORD XoffLim; // transmit XOFF threshold BYTE ByteSize; // number of bits/byte, 4-8 BYTE Parity; // 0-4=no,odd,even,mark,space BYTE StopBits; // 0,1,2 = 1, 1.5, 2

char XonChar; // Tx and Rx XON character char XoffChar; // Tx and Rx XOFF character

char ErrorChar; // error replacement character char EofChar; // end of input character

char EvtChar; // received event character WORD wReserved1; // reserved; do not use } DCB;

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

DCBlength задает длину, в байтах, структуры DCB. Используется для

контроля корректности структуры при передаче ее адреса в функции настройки порта.

BaudRate скорость передачи данных. Возможно указание следующих

констант: CBR_110, CBR_300, CBR_600, CBR_1200, CBR_2400, CBR_4800,

CBR_9600, CBR_14400, CBR_19200, CBR_38400, CBR_56000, CBR_57600,

CBR_115200, CBR_128000, CBR_256000. Эти константы соответствуют всем стандартным скоростям обмена. На самом деле, это поле содержит числовое значение скорости передачи, а константы просто являются символическими именами. Поэтому можно указывать, например, и CBR_9600, и просто 9600. Однако рекомендуется указывать символические константы.

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

fParity включает режим контроля четности. Если это поле равно TRUE, то выполняется проверка четности, при ошибке в вызывающую программу выдается соответсвующий код завершения.

fOutxCtsFlow включает режим слежения за сигналом CTS. Если это поле равно TRUE, и сигнал CTS сброшен, передача данных приостанавливается до

329

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

fOutxDsrFlow включает режим слежения за сигналом DSR. Если это поле равно TRUE и сигнал DSR сброшен, передача данных прекращается до установки сигнала DSR.

fDtrControl задает режим управления обменом для сигнала DTR. Это поле может принимать следующие значения:

DTR_CONTROL_DISABLE запрещает использование линии DTR

DTR_CONTROL_ENABLE разрешает использование линии DTR DTR_CONTROL_HANDSHAKE разрешает использование рукопожатия для выхода из ошибочных ситуаций. Этот режим используется, в частности, модемами при восстановленни в ситуации потери связи.

fDsrSensitivity задает чувствительсть коммуникационного драйвера к состоянию линии DSR. Если это поле равно TRUE, то все принимаемые данные игнорируются драйвером (коммуникационный драйвер расположен в операционной системе), за исключением тех, которые принимаются при установленом сигнале DSR.

fTXContinueOnXoff задает, прекращается ли передача при переполнении приемного буфера и передаче драйвером символа XoffChar. Если это поле равно TRUE, то передача продолжается, несмотря на то, что приемный буфер содержит более XoffLim символов и близок к переполнению, а драйвер передал символ XoffChar для приостановления потока принимаемых данных. Если поле равно FALSE, то передача не будет продолжена до тех пор, пока в приемном буфере не останется меньше XonLim символов и драйвер не передаст символ XonChar для возобновления потока принимаемых данных. Таким образом, это поле вводит

некую зависимость между управлением входным и выходным потоками информации.

fOutX задает использование XON/XOFF управления потоком при передаче. Если это поле равно TRUE, то передача останавливается при приеме символа XoffChar, и возобновляется при приеме символа XonChar.

330