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

3385

.pdf
Скачиваний:
2
Добавлен:
15.11.2022
Размер:
4.73 Mб
Скачать

Рис. 1.20. Принципиальная эквивалентная схема подключения платы.

1.6. Программирование драйверов обмена информацией между внешней средой и ПК для виртуальных средств измерений

Описание функций библиотек IntProc.dll, Dma.dll. 16-ти разрядная версия. Существует аналогичная 32-х разрядная версия библиотек, но состав ее функций отличается от описываемой ниже.

1. Общее описание.

Библиотека IntProc.dll служит для обработки аппаратных прерываний IRQ8 - IRQ15. Обработка прерываний в WINDOWS возможна только в DLL, которые загружаются в память с фиксированными адресами. Эти DLL постоянно находятся в памяти и не выгружаются на диск. Во время аппаратного прерывания нельзя использовать большинство функций API WINDOWS, поэтому обычно обработчик помещает в очередь сообщений какое либо сообщение при помощи функции Post Message. Библиотека IntProc.dll скры вает от пользователя все действия необходимые для обработки прерывания и предоставляет набор функций доступный из любого 16-ти разрядного приложения. Библиотека Dma.dll и виртуальный драйвер DMAS.386 содержат набор функций необходимый для осуществления передачи DMA в WINDOWS 3.1 - 95 по шине ISA16. Имеются функции реализующие передачу DMA как по спецификации VDMAD, так и расширенный набор функций с использованием виртуального драйвера DMAS, который позволяет производить передачу DMA одновременно по трем (DRQ5, DRQ6, DRQ7) каналам как в режиме с автоинициализацией так и без нее. Кроме того DMAS осуществляет мониторинг использования каналов DMA и позволяет приложению монопольно захватывать канал(ы) DMA для осуществления передачи больших объемов данных. Кроме того программирование контроллера DMA через DMAS происходит несколько быстрее, поскольку производятся короткие по времени вызовы VDMAD.VxD для установки параметров передачи, а не непосредственное занесение значений в порты контроллера

DMA. Каждое обращение к порту контроллера DMA из приложения вызывает прерывание, переключение в ядро WINDOWS, вызов VDMAD.VxD и другие действия необходимые для виртуализации контроллера DMA. Функции, предоставляемые библиотекой Dma.dll, позволяют не разбираться в деталях программирования контроллера DMA и взаимодействия с VDMAD и с DMAS. Самый простой способ разобраться во всем этом барахле - это посмотреть примеры использования всех зтих функций в конце описания. При любых режимах порядок вызовов будет очень похож на тот, что используется в приведенных примерах.

2: Функции IntProc.dll.

 

2.1: int InitInterrupt(int irq, HWND h=0, int message=0);

 

Функция инициализирует вектор прерывания защищенного

режима,

разрешает прерывания уровня <irq> в контроллере прерываний. Инициализирует счетчик прерываний для уровня <irq> нулевым значением. Если параметр <h> является корректным оконным дескриптором то в процессе обработки прерывания сообщение <message> будет помещено в очередь сообщений для

этого окна. Возвращаемое значение равно (0) - если прерывание с номером <irq> уже используется, иначе (1).

2.2: int ExitInterrupt (int irq);

Функция запрещает прерывания уровня <irq> в контроллере прерываний и восстанавливает вектор прерывания защищенного режима. Возвращаемое значение равно (0) - если прерывание с номером <irq> не было разрешено, иначе возвращает значение счетчика прерываний для уровня <irq>.

2.3: int GetInterrupt(int irq);

Функция считывает значение счетчика прерываний для уровня <irq> и после этого сбрасывает счетчик в ноль. Возвращаемое значение равно (-1) - если прерывание с номером <irq> не было разрешено, иначе возвращает значение счетчика прерываний для уровня <irq> произошедших со времени вызова функции InitInterrupt или предыдущего вызова функцииии GetInterrupt.

3:Функции Dma.dll.

3.1Программирование контроллера DMA.

3.1.1void DMA2Init(int drq, long buff, unsigned int cnt, int mode);

Функция заносит параметры DMA передачи для канала <drq>.<buff> -

физический адрес начала передачи. Чтобы получить физический адрес нужно воспользоваться функциями Request DMABuffer или GetPointer. <cnt> - количе-

ство 16-ти разрядных слов для передачи (1 – одно слово, 10 - десять слов, 0 - 65536 слов). <mode> - режим передачи, может быть комбинацией значений определенных в файле <consth.h>. Для использования реально годятся только следующие значения:

DMASingleR - 0x44, чтение по каналу DMA в режиме одиночной передачи.

DMASingleW - 0x48, запись по каналу DMA в режиме одиночной передачи.

DMAAuto - 0x10, чтение или запись по каналу DMA в режиме с автоинициализацией.

3.1.2 void DMA2Mask(int drq);

Функция маскирует канал <drq>, тем самым запрещая передачу DMA.

3.1.3 void DMA2UnMask(int drq);

Функция размаскирует канал <drq>, тем самым разрешая передачу

DMA.

3.1.4 int TestDMA2(int drq);

Функция позволяет определить окончание передачи DMA по каналу <drq>. Возвращаемое значение равно (0) - если передача не закончилась, иначе возвращает (1).

3.2Запросы и управление VDMAD.

3.2.1void EnableVDMAD(int drq);

Функция разрешает трансляцию адресов VDMAD для канала <drq>.

3.2.2 void DisableVDMAD(int drq);

Функция запрещает трансляцию адресов VDMAD для канала <drq>. Если для передачи DMA известен физический адрес передачи то нужно вызывать эту функцию для запрещения изменения этого адреса. Для восстановления действий, произведенных фукцией DisableVDMAD, следует использовать функцию

EnableVDMAD.

 

3.2.3 struct DDS

{

 

long

size; // размер выделенного буфера

long

offset;

short

seg;

short

id;

long

addr; // физический адрес передачи

};

Структура DDS описывает блок параметров для выделения буфера VDMAD. Используется в основном поле <addr>, которое определяет физиче

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

3.2.4 int RequestDMABuffer(DDS far *d, void far *buff, long size, int f);

Функция захватывает буфер для передачи DMA используя вызов VDMAD. <d> - адрес структуры DDS для сохранения параметров выделенного буфера. Буфер гарантированно подходит для DMA передачи. <buff> - адрес пользовательского блока памяти откуда/куда будут скопированы данные для передачи. <size> - количество байтов для передачи DMA. <f> - (1) если данные из блока памяти <buff> нужно скопировать в буфер перед началом передачи. Возвращаемое значение равно (-1) - если неверно заданы параметры, (0) - если произошла ошибка выделения буфера или он уже выделен для другой задачи или его размер не достаточен для передачи, (1) - все хороше и поле <addr> структуры DDS содержит физический адрес передачи.

3.2.5 int ReleaseDMABuffer(DDS far *d, int f);

Функция освобождает буфер для передачи DMA используя вызов VDMAD. <d> - адрес структуры DDS, содержащий значения занесенные предшествующим вызовом RequestDMABufer. <f> - (1) если данные из буфера DMA нужно скопировать в блок памяти <seg:offset> перед освобождением буфера. Возвращаемое значение равно (-1) - если неверно заданы параметры, (0) - если произошла ошибка освобождения буфера или структура DDS содержит неверные значения, (1) – все хороше.

3.3Запросы и управление DMAS.

3.3.1long GetVXDVersion(void);

Функция возвращает версию драйвера DMAS. На практике это значение не нужно использовать, поскольку соответствие версии Dma.dll и DMAS.386 проверяется при загрузке библиотеки Dma.dll. Возвращаемое значение равно (-

1)- если DMAS не загружен, (0) - если произошла ошибка.

3.3.1long GetPointer(int drq);

Функция возвращает физический адрес буфера для DMA передачи по каналу <drq>. Буфер гарантированно подходит для DMA передачи. Возвращаемое значение равно (-1) - если DMAS не загружен, (0) - если произошла ошибка.

3.3.1 int AllocChannel(int drq, unsigned int cnt, int mode);

Функция захватывает канал <drq> DMA для индивидуального использования и устанавливает параметры передачи для этого канала. <cnt> - количество 16-ти разрядных слов для передачи DMA - 1. Например (0) - 1 слово, (0xFFFF) - 65536 слов. <mode> - режим передачи, может быть комбинацией значений

определенных в файле <consth.h>. Для использования реально годятся только следующие значения:DMASingleR - 0x44, чтение по каналу DMA в режиме

одиночной передачи.

DMASingleW - 0x48, запись по каналу DMA в режиме одиночной передачи.

DMAAuto - 0x10, чтение или запись по каналу DMA в режиме с автоинициализацией.

Возвращаемое значение равно (-1) - если DMAS не загружен, (0) - если произошла ошибка, иначе возвращает (1).

3.3.1 int FreeChannel(int drq);

Функция освобождает канал <drq> DMA захваченный функцией AllocChannel. Внутри функции происходит маскирование канала если оно необходимо. Возвращаемое значение равно (-1) - если DMAS не загружен, (0) - если произошла ошибка, иначе возвращает (1).

3.3.1 int MaskChannel(int drq);

Функция маскирует канал <drq>, тем самым запрещая передачу DMA. Возвращаемое значение равно (-1) - если DMAS не загружен, (0) - если произошла ошибка, иначе возвращает (1).

3.3.1 int UnMaskChannel(int drq);

Функция размаскирует канал <drq>, тем самым разрешая передачу DMA. Возвращаемое значение равно (-1) - если DMAS не загружен, (0) - если произошла ошибка, иначе возвращает (1).

3.3.1 int CopyToBuffer(int ch, unsigned int cnt, void far *buff, long off);

Функция копирует <cnt>+1 слов из блока памяти пользователя <buff>

в буфер DMA. <buff> - адрес пользовательского блока памяти откуда будут скопированы данные для передачи. <cnt> - количество слов для передачи DMA минус 1. <off> - смещение в пользовательском буфере до начала области копирывания. Возвращаемое значение равно (-1) - если DMAS не загружен или неверные значения параметра <buff>, (0) - если произошла ошибка, иначе возвращает (1).

3.3.1 int CopyFromBuffer(int ch, unsigned int cnt, void far *buff, long off);

Функция копирует <cnt>+1 слов из буфера DMA в блок памяти пользователя <buff> в буфер DMA. <buff> - адрес пользовательского блока памяти куда будут скопированы данные для передачи. <cnt> - количество слов для передачи DMA минус 1. <off> - смещение в пользовательском буфере до начала области копирывания. Возвращаемое значение равно (-1) - если DMAS не загружен или неверные значения параметра <buff>, (0) - если произошла ошибка, иначе возвращает (1).

1.7. Драйвер обмена для виртуального средства измерений

 

Пример чтения данных из устройства с помощью функций

 

IntProc.dll и Dma.dll.

#include

"dma.h"

#include

"consth.h"

#include

"intproc.h"

/*###################################################################

###*/

int

DEVInitR(long mode) { return(1); }

/*----------------------------------------------------------------------

*/

void

DEVStart(void) { }

/*----------------------------------------------------------------------

*/

void

DEVStop(void) { }

/*----------------------------------------------------------------------

*/

int

DEVBreak(void) { return(1); }

/*###################################################################

###*/

int

ADCRead(void far *buff, long size, long mode)

{

 

 

 

if(size < 1) size = 1; else if(size > DMASIZE) size = DMASIZE;

//........................................................................

 

 

//

int ret = ReadVDMAD

(buff, size, mode);

//

int ret = ReadVDMADI

(buff, size, mode);

//int ret = ReadVDMAD_DMAS(buff, size, mode);

int ret = ReadDMAS (buff, size, mode); //........................................................................

return(ret);

}

/*###################################################################

###*/

int ReadVDMAD(void far *buff, long size, long mode)

{

DDS d;

int ret = -1;

if(RequestDMABuffer(&d, buff, size, 0))

{

if(d.addr)

{

if(DEVInitR(mode))

{

DisableVDMAD(DRQ);

DMA2Init(DRQ, d.addr, WORD(size>>1), DMASingleR);

 

DEVStart();

 

ret = 1;

 

while(TestDMA2(DRQ))

 

if(DEVBreak()) { ret = -10; break; }

 

DEVStop();

 

DMA2Mask(DRQ);

 

EnableVDMAD(DRQ);

 

}

 

else { DEVStop(); ret = -2; }

 

}

 

if(!ReleaseDMABuffer(&d, (ret > 0) ? 1 : 0)) ret = -3;

 

}

 

return(ret);

}

 

/*----------------------------------------------------------------------

*/

int

ReadVDMADI(void far *buff, long size, long mode)

{

 

 

DDS d;

 

int ret = -1;

 

if(RequestDMABuffer(&d, buff, size, 0))

 

{

 

if(d.addr)

 

{

 

if(DEVInitR(mode))

{

 

 

DisableVDMAD(DRQ);

 

DMA2Init(DRQ, d.addr, WORD(size>>1), DMASingleR);

 

if(InitInterrupt(IRQ))

 

{

 

DEVStart();

 

ret = 1;

 

while(!GetInterrupt(IRQ))

if(DEVBreak()) { ret = -10; break; }

}

DEVStop();

DMA2Mask(DRQ);

EnableVDMAD(DRQ);

ExitInterrupt(IRQ);

}

else { DEVStop(); ret = -2; }

}

if(!ReleaseDMABuffer(&d, (ret > 0) ? 1 : 0)) ret = -3;

}

return(ret);

}

 

/*----------------------------------------------------------------------

*/

int

ReadVDMAD_DMAS(void far *buff, long size, long mode)

{

 

 

int ret = -1;

 

long padr = GetPointer(DRQ);

 

if(padr)

 

{

if(DEVInitR(mode))

{

WORD cnt = WORD(size>>1); DisableVDMAD(DRQ);

DMA2Init(DRQ, padr, cnt, DMASingleR); if(InitInterrupt(IRQ))

{

 

DEVStart();

 

ret = 1;

 

while(!GetInterrupt(IRQ))

 

if(DEVBreak()) { ret = -10; break; }

 

}

 

DEVStop();

 

DMA2Mask(DRQ);

 

ExitInterrupt(IRQ);

 

EnableVDMAD(DRQ);

 

CopyFromBuffer(DRQ, cnt-1, buff, 0);

 

}

 

else { DEVStop(); ret = -2; }

 

}

 

return(ret);

}

 

/*----------------------------------------------------------------------

*/

int

ReadDMAS(void far *buff, long size, long mode)

{

 

 

int ret = -1;

 

if(DEVInitR(mode))

 

{

 

WORD cnt = WORD(size>>1);

 

if(AllocChannel(DRQ, cnt, DMASingleR))

 

{

 

UnMaskChannel(DRQ);

 

if(InitInterrupt(IRQ))

 

{

 

DEVStart();

 

ret = 1;

while(!GetInterrupt(IRQ)) if(DEVBreak()) { ret = -10; break; }

}

DEVStop();

ExitInterrupt(IRQ); CopyFromBuffer(DRQ, cnt-1, buff, 0);

}

FreeChannel(DRQ);

}

else { DEVStop(); ret = -2; } return(ret);

}

/*###################################################################

###*/

2.ЗАРУБЕЖНЫЕ ВИРТУАЛЬНЫЕ СРЕДСТВА ИЗМЕРЕНИЙ

Разработкой виртуальных средств измерений занимаются многие зарубежные фирмы. Наиболее известна среди них фирма HEWLETT PACKARD (HP). Именно еѐ специалисты ведут интенсивные разработки во всех направлениях практической метрологии: разработка и изготовление реальных средств измерений; аппаратных и программных средств для проектирования виртуальных средств измерений. В этом разделе особое внимание будет уделено ВСИ фирмы НР. Рассмотрим состав известных продуктов этой фирмы «НР BENCH LINK » Хьюлетт-Паккард предлагает программное обеспечение для решения широкого круга контрольно-измерительных задач - от простого копирования изображений с экрана приборов до создания на персональном компьютере автоматизированной системы сбора данных и управления. Эта программа обеспечивает работу с серийными приборами: осциллографами («НР BENCH LINK Sсоре‖), генераторами (НР BENCH LINK ARB), мультиметрами и частотамера-

ми (НР BENCH LINK METER), анализаторы спектра (НР BENCH LINK SPECTRUM ANALYSER), системы сбора данных и коммутации (НР BENCH LINK LOGGER). Более подробно об этих программах сказано в табл. 2.1.

Кроме этой программы фирмой НР разработаны более универсальные программы типа НР VEE, известные, как язык графического программирования. Требования, предъявляемые этой программой к системе и аппаратному составу ЭВМ, представлены в табл. 2.2.

 

2.1.Программные средства ВСИ фирмы НР

 

 

 

Таблица 2.1

 

 

Типы

Модели

 

ПРОГРАММЫ

приборов

приборов

Основные функции

 

НР BENCH LINK Осцилло-

Серия HP Копирование изображений с экрана осцилло-

SCOPE

 

графы

54600

графа на PC в графическом или табличном

 

 

 

виде

 

 

 

 

HP BenchLink Arb Генератор HP 33120A Создание сигналов стандартных или произвольных форм

HP BenchLink

Мультиметр

HP 34401A

Создание автоматизированной однока-

Счетчик-

Meter

Серия HP

нальной системы сбора данных

частотомер

53100

 

 

 

HP BenchLink

Анализа-

Серия HP

Копирование изображения с экрана анализато-

Spectrum Analyzer

торы спек8560, HP 8590, ра спектра на PC в графическом или таблич-

тра

HP ESA-

ном виде

 

 

 

L1500A

 

HP BenchLink

Data Logger

Система сбо-

 

Создание автоматизированной системы сбора,

ра данных и

HP 34970A

регистрации данных, коммутации сигналов,

коммутации

управления

 

2.2. Язык графического программирования HP VEE

Вотличие от текстовых языков программирования типа C/C++, Pascal, Basic

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

Данный подход позволяет существенно сократить время разработки и редактирования программ, предназначенных для решения контрольно-измерительных задач. HP VEE используется во всем мире как неотъемлемая часть интегрированных программно-аппаратных контрольно-измерительных систем. В табл.2.2 системные

иаппаратные представлены требования к ПК.

 

 

Таблица 2.2

Прогамма

ОС

Минимальные требования к ресурсам системы

HP VEE 5.0

Windows®

80486/66, ОЗУ 16/32Мб (Win'95/NT), НЖМД 25Мб,

 

95/NT

800х600, CD-ROM

HP VEE 4.0

Windows®

80486/66, ОЗУ 16/24Мб (Win'95/NT), НЖМД 20Мб,

 

95/NT

640х480, CD-ROM или 3.5''-НГМД

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