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

ЭВМ лекции

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

Если dwEvtMask равно нулю, то отслеживание событий запрещается.

Получить текущую маску отслеживаемых событий можно с помощью функции

BOOL GetCommMask(HANDLE hFile, LPDWORD lpEvtMask);

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

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

EV_EVENT1 Устройство-зависимое событие

EV_EVENT2 Устройство-зависимое событие EV_PERR Ошибка принтера

EV_RX80FULL Приемный буфер заполнен на 80 процентов

Эти дополнительные события используются внутри драйвера. Вы не должны переустанавливать состояние их отслеживания.

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

BOOL WaitCommEvent(

HANDLE hFile,

LPDWORD lpEvtMask,

LPOVERLAPPED lpOverlapped);

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

Адрес структуры OVERLAPPED требуется для асинхронного ожидания. Связанное со структурой OVERLAPPED событие (объект создаваемый функцией CreateEvent, а не событие порта) должно быть с ручным сбросом. Вообще,

поведение функции с ненулевым указателем на структуру OVERLAPPED аналогично поведению функций чтения и записи. Вот как выглядит эта структура:

typedef struct _OVERLAPPED { DWORD Internal;

DWORD InternalHigh; DWORD Offset;

DWORD OffsetHigh; HANDLE hEvent;

341

} OVERLAPPED, *LPOVERLAPPED;

Для наших целей, за исключением hEvent, можно просто обнулить все поля этой структуры. Для WaitCommEvent поле hEvent должно содержать корректный описатель объекта "событие". Чтобы все стало понятно, надо разобраться с таким обязательным атрибутом параллельной работы как синхронизация.

Синхронизация нужна для упорядочения доступа к совместно используемым объектам. Для синхронизации используются различные методы: семафоры, блокировки, события, критические секции и т.п. События являются простейшими синхронизирующими объектами. Они могут находиться только в двух состояниях: установленом (событие произошло или наступило) и сброшеном (собитие не произошло или не наступило). События создаются функцией CreateEvent и разрушаются функцией CloseHandle. Установить событие можно функцией SetEvent, а сбросить ResetEvent.

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

выполняется функцией

BOOL GetOverlappedResult(

HANDLE hFile,

LPOVERLAPPED lpOverlapped,

LPDWORD lpcbTransfer,

BOOL fWait);

hFile дескриптор опрашиваемого файла, lpOverlapped адрес структуры OVERLPPED.

lpcbTransfer адрес переменной, куда будет помещено количество считанных или записанных байт. Соответсвующий параметр функций ReadFile и WriteFile, хоть и ДОЛЖЕН БЫТЬ ЗАДАН НЕ НУЛЕВЫМ, не позволяет получить количество переданных байт, так как на момент возврата управления из функций чтения/записи не передано ни одного байта.

342

fWait означает, должна ли функция GetOverlappedResult ждать завершения операции ввода/вывода. Если этот параметр равет FALSE, то функция немедленно вернет управление. При этом код возврата будет TRUE, если операция завершена, или FALSE, если операция не завершена. Если функция GetOverlappedResult завершилась с кодом возврата FALSE, и кодом ошибки, отличным от ERROR_IO_INCOMPLETE, то ошибка произошла именно при вызове самой функции. Если параметр fWait равен TRUE, то функция будет дожидаться завершения операции ввода-вывода.

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

DWORD WaitForSingleObject(

DWORD WaitForMultipleObjects(

HANDLE hObject,

DWORD cObjects,

DWORD dwTimeout);

LPHANDLE lpHandles,

 

BOOL bWaitAll,

 

DWORD dwTimeout);

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

Функция WaitForSingleObject ожидает один объект, задаваемый первым параметром. Вторым параметром задается максимальное время ожидания наступления события в миллисекундах. Если вместо времени указана величина

INFINITE, то событие будет ожидаться вечно.

Функция WaitForMultipleObjects ждет несколько событий. Первый параметр указывает, сколько именно, а второй задает массив дескрипторов этих событий. Один и тот же дескриптор нельзя указывать в этом массиве более одного раза. Третий параметр задает тип ожидания. Если он равен TRUE, то ожидается наступление всех событий. Если FALSE, то наступления любого одного из указанных. Последний параметр задает максимальное время ожидания.

Если событие наступило, то функции возвращают значения от

WAIT_OBJECT_0 до WAIT_OBJECT_0+cObject-1. Естественно, что

343

WaitForSingleObject может вернуть WAIT_OBJECT_0, если не произошло ошибки. Если произошла ошибка, то будет возвращено WAIT_FAILED. При превышении максимального времени ожидания функции вернут WAIT_TIMEOUT.

Функции ReadFile и WriteFile в асинхронном режиме первым делом сбрасывают (переводят в занятое состояние) как дескриптор файла, так и дескриптор объекта event задананный в структуре OVERLAPPED. Когда операция

чтения или записи завершается система устанавливает эти дескрипторы в свободное состояние. Функции WaitForSingleObject и

WaitForMultipleObjects для событий с автоматическим сбросом так же выполняют их перевод в занятое состояние при вызове. Для событий с ручным сбросом этого не происходит.

Теперь небольшой пример.

#include <windows.h>

. . .

HANDLE hCOM; char* buffer; OVERLAPPED ovr; DCB dcb;

char str[]=”MSV?1;”;

int numbytes_ok, numbytes;

. . .

hCOM=CreateFile("\\\\.\\COM2",GENERIC_READ,0,NULL,OPEN_EXISTING, FILE_FLAG_OVERLAPPED,NULL);

//Настройка порта

CommTimeOuts.ReadIntervalTimeout= 10000000; CommTimeOuts.ReadTotalTimeoutMultiplier = 1; CommTimeOuts.ReadTotalTimeoutConstant = 200;

//используется в данном случае как время ожидания посылки

CommTimeOuts.WriteTotalTimeoutMultiplier = 0; CommTimeOuts.WriteTotalTimeoutConstant = 0; SetCommTimeouts(hCOM, &CommTimeOuts); GetCommState(hCOM,&dcb);

dcb.BaudRate = CBR_9600; dcb.ByteSize = 8; dcb.Parity = EVENPARITY; dcb.StopBits = ONESTOPBIT; SetCommState(hCOM, &dcb);

SetCommMask(hCOM,EV_TXEMPTY);

PurgeComm(hCOM, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);

ClearCommBreak(hCOM);

memset(&ovr,0,sizeof(ovr)); // обнуление структуры OVERLAPPED ovr.hEvent=CreateEvent(NULL,FALSE,FALSE,NULL);

WriteFile(hCOM, str, 6, &numbytes_ok, &ovr);

344

if(WaitForSingleObject(ovr.hEvent,100)==WAIT_OBJECT_0)

{

GetOverlappedResult(hCOM,&ovr,&numbytes,FALSE); if((int)numbytes != 6)

{

return;

}

}

ReadFile(hCOM,buffer,10,&numbytes_ok,&ovr); /* Выполняем некую полезную работу */

if(WaitForSingleObject(Overlap.hEvent,100)==WAIT_OBJECT_0)

{

GetOverlappedResult(hCOM,&Overlap,&numbytes_ok,FALSE);

}

CloseHandle(hCOM);

CloseHandle(ovr.hEvent);

345

Программируемые логические интегральные схемы (ПЛИС)

Программируемая логическая интегральная схема (ПЛИС, англ. programmable logic device, PLD) — электронный компонент, используемый для создания цифровых интегральных схем. В отличие от обычных цифровых микросхем, логика работы ПЛИС не определяется при изготовлении, а задаётся посредством программирования (проектирования). Для программирования используются отладочные среды, позволяющие задать желаемую структуру

цифрового устройства в виде принципиальной электрической схемы или программы на специальных языках Verilog, VHDL. Альтернативой ПЛИС являются заказные БИС, которые существенно дороже и компьютеры (микроконтроллеры), которые из-за программного способа реализации алгоритмов медленнее ПЛИС.

Применение ПЛИС имеет ряд преимуществ по сравнению с «жесткой логикой»:

o высокое быстродействие;

o возможность перепрограммирования непосредственно в системе;

o высокая степень интеграции, позволяющая разместить цифровое устройство в

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

o сокращение времени цикла разработки и производства устройства;

o наличие мощных инструментов САПР, позволяющих устранить возможные ошибки в процессе проектирования устройства;

o сравнительно низкая стоимость (в пересчете на один логический вентиль);

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

Основными современными типами ПЛИС являются

o CPLD (англ. complex programmable logic device — сложные программируемые логические устройства) содержат относительно крупные программируемые логические блоки макроячейки (англ. macrocells), соединённые с внешними выводами и внутренними шинами. Функциональность CPLD кодируется в

346

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

o FPGA (англ. field-programmable gate array) содержат блоки умножения-

суммирования (DSP), которые широко применяются при обработке сигналов, а также логические вентили и их блоки коммутации. FPGA обычно используются для обработки сигналов, имеют больше логических элементов и более гибкую архитектуру, чем CPLD. Программа для FPGA хранится в распределённой памяти, которая может быть выполнена как на основе энергозависимых ячеек статического ОЗУ в этом случае программа не сохраняется при исчезновении электропитания микросхемы, так и на основе энергонезависимых ячеек Flash- памяти или перемычек в этих случаях программа сохраняется при исчезновении электропитания. Если программа хранится в энергозависимой памяти, то при

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

Рассмотрим продукцию ведущих мировых производителей ПЛИС, имеющих российских дилеров.

Фирма Altera Corporation (www.altera.com) была основана в июне 1983 г. Altera выпускает CPLD семейств MAX3000, MAX7000, MAX9000, FPGA

семейств FLEX10K, FLEX8000, FLEX6000. Дополнительным фактором при выборе ПЛИС фирмы Altera является наличие достаточно развитых бесплатных версий САПР. В качестве бесплатной САПР фирмой предлагается пакет Max+Plus II Baseline. Альтернативой является платная среда проектирования QUARTUS II. Кроме того, ПЛИС фирмы Altera выпускаются с возможностью программирования в системе непосредственно на плате. Для программирования и

загрузки конфигурации устройств опубликована схема загрузочного кабеля ByteBlaster и ByteBlasteMV. Следует отметить, что новые конфигурационные ПЗУ EPC2 допускают программирование с помощью этого устройства, тем самым отпадает нужда в программаторе, что, естественно, снижает стоимость владения технологией.

Компания Actel Corporation (www.actel.com) была основана в 1985 г.

Особенностью ПЛИС Actel является применение так называемой Antifuse

347

технологии, представляющей собой создание металлизированной перемычки при программировании. Данная технология обеспечивает высокую надежность и гибкие ресурсы трассировки, при этом не требуется конфигурационное ПЗУ. По данной технологии выпускаются семейства ACT1, ACT2, 1200XL, 54SX, А40МХ и А42МХ (со встроенными модулями памяти), имеющие хорошие показатели цена логическая емкость” (ПЛИС, заменяющая 300–350 корпусов логических микросхем, стоит $10 и способна работать на частоте более 250 МГц).

Для проектирования устройств на ПЛИС фирмой Actel распространяется бесплатный пакет Actel DeskTOP, содержащий средства ввода проекта, моделирования, генерации тестов разработки VeriBest и средства синтеза разработки Synplicity. К сожалению, микросхемы Actel, выпускаемые по Antifuse технологии, требуют применения специального программатора, стоимость которого пока еще весьма высока. Однако их отличает высокая надежность, поэтому они являются весьма перспективной базой для специальных применений.

Компания Xilinx, Inc. (www.xilinx.com) была основана в феврале 1984 г. Xilinx выпускает ПЛИС FPGA семейств Virtex, XC3000A, XC4000E, Spartan, XC5200, а также CPLD XC9500 и малопотребляющую серию CoolRunner.

Существует бесплатная версия САПР – WebPACK ISE, поддерживающая ряд серий выпускаемых микросхем CPLD XC9500 и CoolPLD, ввод описания алгоритма с помощью языка описания аппаратуры VHDL.

Рассмотрим архитектуру ПЛИС типа CPLD на примере семейства XC9500 (Xilinx).

Каждая МС семейства XC9500 представляет собой подсистему, состоящую из множества функциональных блоков (ФБ) и блоков ввода-вывода (БВВ), соединенных переключающей матрицей (ПМ). БВВ обеспечивают буферизацию всех входов и выходов МС. Каждый ФБ содержит 18 макроячеек со структурой 36V1 и позволяет получить 18 логических функций практически от любой комбинации из 36 переменных.

ПМ обеспечивает подачу любых выходных сигналов ФБ и входных сигналов на входы ФБ. От 12 до 18 выходных сигналов каждого ФБ (в зависимости от

348

количества выводов в корпусе) и соответствующие сигналы разрешения выхода поступают непосредственно на блоки ввода-вывода.

Рис. 22. 3 Архитектура МС семейства XC9500

Все выводы ПЛИС семейства XC9500 можно подразделить на 3 группы:

1.Выводы JTAG-порта, через которые производится периферийное

сканирование и программирование

2.Логические выводы, которые могут выполнять функцию входа, выхода или совмещенного входа-выхода (I/O)

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

Также имеются выводы земли и питания.

Функциональный блок (Рис. 2) состоит из 18-ти независимых макроячеек (МЯ), каждая из которых обеспечивает выполнение комбинаторной и/или

регистровой функции. Кроме этого, на ФБ приходят сигналы разрешения выхода,

349

установки/сброса и глобальной синхронизации. Каждый ФБ формирует 18 выходных сигналов, которые поступают на ПМ, а также передаются в БВВ.

Логика внутри ФБ представляет собой матрицу логических произведений (термов). Тридцать шесть входов обеспечивают использование 72 прямых и инверсных сигналов в матрице логических произведений для формирования до 90 термов. Любое подмножество этих термов может быть доступно каждой МЯ через схему распределения термов.

Каждый ФБ имеет внутренние цепи обратной связи, что позволяет любому

количеству выходных сигналов ФБ поступать в свою собственную программируемую матрицу элементов И, не выходя за пределы ФБ.

Рис. 22. 4 Схема функционального блока МС семейства XC9500

Любая макроячейка в МС семейства XC9500 может выполнять как логическую комбинаторную, так и регистровую функции. Структура макроячейки совместно с программируемой матрицей логических произведений (элементов И, или «термов»), принадлежащим всему ФБ, представлена на рис. 22.3.

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

Из матрицы логических произведений пять термов поступают на основные входы макроячейки и могут использоваться либо для выполнения комбинаторных

350

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]