PCIe via Call Library Function Node

VISA, TCP/IP, USB, CAN, GPIB и подобные протоколы
Аватара пользователя
Eugen Graf

Activity Professionalism Silver Black
guru
guru
Сообщения: 6502
Зарегистрирован: 13 ноя 2007, 02:20
Награды: 4
Версия LabVIEW: 2009
Откуда: Saarbrücken
Контактная информация:

Re: PCIe via Call Library Function Node

Сообщение Eugen Graf »

Для использовния Call Library Node не нужно писать врэпперы, DLL или в твоём случае So можно вызывать напрямую, без врэппера.
На счёт MoveBlock помочь не могу. Хотя если выложишь наработки можно попробовать разобраться. Хотя без харда протестить ничего неполучится.

Кстати внеси версию LabVIEW в свой профиль, если не трудно.
arcades
beginner
beginner
Сообщения: 16
Зарегистрирован: 26 мар 2008, 16:15
Версия LabVIEW: 7.1
Откуда: Рига / Латвия
Контактная информация:

Re: PCIe via Call Library Function Node

Сообщение arcades »

eg писал(а):Для использовния Call Library Node не нужно писать врэпперы, DLL или в твоём случае So можно вызывать напрямую, без врэппера.
На счёт MoveBlock помочь не могу. Хотя если выложишь наработки можно попробовать разобраться. Хотя без харда протестить ничего неполучится.
хорошо а как ты вызовешь без врапера функцию например такую:

pci_read_word(struct pci_dev, int pos);
???
насчет int pos это понятно просто типа инт параметра подать на вход.
а как насчет struct pci_dev?
Аватара пользователя
Eugen Graf

Activity Professionalism Silver Black
guru
guru
Сообщения: 6502
Зарегистрирован: 13 ноя 2007, 02:20
Награды: 4
Версия LabVIEW: 2009
Откуда: Saarbrücken
Контактная информация:

Re: PCIe via Call Library Function Node

Сообщение Eugen Graf »

arcades писал(а):
eg писал(а):Для использовния Call Library Node не нужно писать врэпперы, DLL или в твоём случае So можно вызывать напрямую, без врэппера.
На счёт MoveBlock помочь не могу. Хотя если выложишь наработки можно попробовать разобраться. Хотя без харда протестить ничего неполучится.
хорошо а как ты вызовешь без врапера функцию например такую:

pci_read_word(struct pci_dev, int pos);
???
насчет int pos это понятно просто типа инт параметра подать на вход.
а как насчет struct pci_dev?
Я же уже писал выше:

подсчитываешь максимальное количество байт в структуре pci_dev
перед вызавом библиотеки инициализируешь в LabVIEW байтовый массив с посчитаным макс. кол-вом
передаёшь этот массив библиотеке
на выходе узла CLFN получаешь заполненый массив
преобразуешь этот массив с помощью Type Cast в кластер
и всё
arcades
beginner
beginner
Сообщения: 16
Зарегистрирован: 26 мар 2008, 16:15
Версия LabVIEW: 7.1
Откуда: Рига / Латвия
Контактная информация:

Re: PCIe via Call Library Function Node

Сообщение arcades »

да это ты писал, но я не понимаю сам принцип работы, как это будет работать с описанной струтурой в pci.h ?
Аватара пользователя
Eugen Graf

Activity Professionalism Silver Black
guru
guru
Сообщения: 6502
Зарегистрирован: 13 ноя 2007, 02:20
Награды: 4
Версия LabVIEW: 2009
Откуда: Saarbrücken
Контактная информация:

Re: PCIe via Call Library Function Node

Сообщение Eugen Graf »

Или конечно наоборот если тебе нужно передать структуру, то надо создать кластер соответствующий этой структуре и с помощью Typr Cast преобразовать его в байтовый массив и передать библиотеке.
arcades
beginner
beginner
Сообщения: 16
Зарегистрирован: 26 мар 2008, 16:15
Версия LabVIEW: 7.1
Откуда: Рига / Латвия
Контактная информация:

Re: PCIe via Call Library Function Node

Сообщение arcades »

ок, вот функция которая нужна: long pci_read_word(struct pci_dev, int pos)
так она описана в pci.h
в pci.h так же описана структура struct pci_dev:
====================================================
struct pci_dev {
struct pci_dev *next; /* Next device in the chain */
u16 domain; /* PCI domain (host bridge) */
u8 bus, dev, func; /* Bus inside domain, device and function */

/* These fields are set by pci_fill_info() */
int known_fields; /* Set of info fields already known */
u16 vendor_id, device_id; /* Identity of the device */
u16 device_class; /* PCI device class */
int irq; /* IRQ number */
pciaddr_t base_addr[6]; /* Base addresses */
pciaddr_t size[6]; /* Region sizes */
pciaddr_t rom_base_addr; /* Expansion ROM base address */
pciaddr_t rom_size; /* Expansion ROM size */

/* Fields used internally: */
struct pci_access *access;
struct pci_methods *methods;
u8 *cache; /* Cached config registers */
int cache_len;
int hdrtype; /* Cached low 7 bits of header type, -1 if unknown */
void *aux; /* Auxillary data */
};
====================================================
Создаю библиотеку указываю параметры:
long CaFunc(unsigned char *pData, int pos) {
....

и как передать unsigned char *pData - что это именно структура pci_dev из pci.h?
допустим посчитал сколько байт занимает структура pci_dev 164 или около того это сделал printf("Size of Struct pci_dev = %d", SizeOf(Struct pci_dev));
получил 164 байта.

объясни пожалуйста подробнее, я просто не монимаю как библиотека поймет что этот параметр (байтовый массив) является структурой описанной в pci.h. Это в теле программы указывать? тоесь как я предполагаю: подаешь на вход первого параметра байтовый массив размером 164 байта, далее в теле функции этому массиву присваивается значение струтуры struct pci_dev (только не знаю как это делать), так?
Аватара пользователя
Eugen Graf

Activity Professionalism Silver Black
guru
guru
Сообщения: 6502
Зарегистрирован: 13 ноя 2007, 02:20
Награды: 4
Версия LabVIEW: 2009
Откуда: Saarbrücken
Контактная информация:

Re: PCIe via Call Library Function Node

Сообщение Eugen Graf »

Отвечу пока быстро не разбираясь.

Понимаешь, параметры функции перечислены через запятую. Отсюда и понятно как интерпретировать какой параметр. Если ты передаёшь вторым параметром из LabVIEW байтовый массив, то библиотека (точнее функция, которую ты вызываешь) воспринимает этот массив как структуру, которая как параметр находится на втором месте.
Самое главное чтобы то (сами данные) что передаётся полностью совпадало с тем что ожидается. :cool:
arcades
beginner
beginner
Сообщения: 16
Зарегистрирован: 26 мар 2008, 16:15
Версия LabVIEW: 7.1
Откуда: Рига / Латвия
Контактная информация:

Re: PCIe via Call Library Function Node

Сообщение arcades »

тоесть только имя функции библиотеки должно совпадать с названием функции в #include <pci.h> ?
Аватара пользователя
Eugen Graf

Activity Professionalism Silver Black
guru
guru
Сообщения: 6502
Зарегистрирован: 13 ноя 2007, 02:20
Награды: 4
Версия LabVIEW: 2009
Откуда: Saarbrücken
Контактная информация:

Re: PCIe via Call Library Function Node

Сообщение Eugen Graf »

Да, местонахождение DLL или SO, имя функции, количество параметров и количество байт в каждом параметре. Ну и конечно сами данные в памяти, а вот тип необязательно, т.к. каждая сторона интерпретирует данные по-своему.
arcades
beginner
beginner
Сообщения: 16
Зарегистрирован: 26 мар 2008, 16:15
Версия LabVIEW: 7.1
Откуда: Рига / Латвия
Контактная информация:

Re: PCIe via Call Library Function Node

Сообщение arcades »

Всем привет. Реализовал эту задачу при помощи CIN, если будет время попробую и Call Library Node. Всем спасибо! только вот сомниваюсь что скорость передачи данных будет близка к скорости PCIe x8 :dntknw: сейчас проблема с точностью измерить эту скорость - а именно для начала с точность до наносекунд измерить время выполнения кода а потом можно будет и скорость найти. Если мои опасения подтвердятся... придется писать модуль под linux и на програмном уровне устанавливать режим DMA для передачи этих данных.
Аватара пользователя
Eugen Graf

Activity Professionalism Silver Black
guru
guru
Сообщения: 6502
Зарегистрирован: 13 ноя 2007, 02:20
Награды: 4
Версия LabVIEW: 2009
Откуда: Saarbrücken
Контактная информация:

Re: PCIe via Call Library Function Node

Сообщение Eugen Graf »

Я не знаю есть ли в твоей версии LabVIEW возможность измерить скорость выполнения прибора. Посмотри Tools->Profile->Performance and Memory...

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

А сейчас так вообще купили версию LabVIEW, где есть целая палитра для анализы приборов. Но я туда пока не заглядывал. Не нужно было до сих пор.
Вложения
VI_analyzer.PNG
VI_analyzer.PNG (9.8 КБ) 6626 просмотров
TeopeTuK
interested
interested
Сообщения: 1
Зарегистрирован: 16 июн 2008, 16:43

Re: PCIe via Call Library Function Node

Сообщение TeopeTuK »

перед вызавом библиотеки инициализируешь в LabVIEW байтовый массив с посчитаным макс. кол-вом
передаёшь этот массив библиотеке
на выходе узла CLFN получаешь заполненый массив
преобразуешь этот массив с помощью Type Cast в кластер
и всё
Если осторожно (и если ломает в LV описывать лишние ненужные кластеры) можно передавать во внешнюю функцию (через CallLibrary) вместо массива кучу переменных (соответствующих полям структуры) в порядке, обратном тому как они указаны в структуре в h-файле. Главное -- не ошибиться с количеством байт в каждом поле :) Обратный порядок связан с т.н. C-конвенцией (cdecl) при передаче параметров в функцию.

Вообще, рекомендую написать на C простенькую библиотечку с функцией, которая принимает в качестве аргумента структуры и распечатывает полученные аргументы. И поиграться с этой функцией через CallLibrary.
Аватара пользователя
mzu2006

Professionalism Tutorials Black
doctor
doctor
Сообщения: 2456
Зарегистрирован: 16 авг 2008, 02:12
Награды: 3
Версия LabVIEW: 7.1 10 11 12
Откуда: St-Petersburg (RU), Phila, Boston, Washington DC
Контактная информация:

Re: PCIe via Call Library Function Node

Сообщение mzu2006 »

arcades
Не рекомендую использовать CIN без существенных на то причин.
вкратце: технология устарела и не имеет примуществ перед вызовом разделяемой библиотеки если работаешь с версией
LabVIEW больше равно 8.2

подробнее:
http://www.automationlabs.ru/forum/show ... #post12819

а также замечательный экскурс в историю зачем были нужны dll(so) и CIN

http://expressionflow.com/2007/05/09/ex ... -overview/
http://expressionflow.com/2007/05/19/ex ... -and-cins/

Вызовы LabVIEW memory manager делаются из dll так же точно.
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Коммуникация с приборами»