PCIe via Call Library Function Node
-
Eugen Graf
- guru
- Сообщения: 6502
- Зарегистрирован: 13 ноя 2007, 02:20
- Награды: 4
- Версия LabVIEW: 2009
- Откуда: Saarbrücken
- Контактная информация:
Re: PCIe via Call Library Function Node
Для использовния Call Library Node не нужно писать врэпперы, DLL или в твоём случае So можно вызывать напрямую, без врэппера.
На счёт MoveBlock помочь не могу. Хотя если выложишь наработки можно попробовать разобраться. Хотя без харда протестить ничего неполучится.
Кстати внеси версию LabVIEW в свой профиль, если не трудно.
На счёт MoveBlock помочь не могу. Хотя если выложишь наработки можно попробовать разобраться. Хотя без харда протестить ничего неполучится.
Кстати внеси версию LabVIEW в свой профиль, если не трудно.
-
- beginner
- Сообщения: 16
- Зарегистрирован: 26 мар 2008, 16:15
- Версия LabVIEW: 7.1
- Откуда: Рига / Латвия
- Контактная информация:
Re: PCIe via Call Library Function Node
хорошо а как ты вызовешь без врапера функцию например такую:eg писал(а):Для использовния Call Library Node не нужно писать врэпперы, DLL или в твоём случае So можно вызывать напрямую, без врэппера.
На счёт MoveBlock помочь не могу. Хотя если выложишь наработки можно попробовать разобраться. Хотя без харда протестить ничего неполучится.
pci_read_word(struct pci_dev, int pos);
???
насчет int pos это понятно просто типа инт параметра подать на вход.
а как насчет struct pci_dev?
-
Eugen Graf
- guru
- Сообщения: 6502
- Зарегистрирован: 13 ноя 2007, 02:20
- Награды: 4
- Версия LabVIEW: 2009
- Откуда: Saarbrücken
- Контактная информация:
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?
подсчитываешь максимальное количество байт в структуре pci_dev
перед вызавом библиотеки инициализируешь в LabVIEW байтовый массив с посчитаным макс. кол-вом
передаёшь этот массив библиотеке
на выходе узла CLFN получаешь заполненый массив
преобразуешь этот массив с помощью Type Cast в кластер
и всё
-
- beginner
- Сообщения: 16
- Зарегистрирован: 26 мар 2008, 16:15
- Версия LabVIEW: 7.1
- Откуда: Рига / Латвия
- Контактная информация:
Re: PCIe via Call Library Function Node
да это ты писал, но я не понимаю сам принцип работы, как это будет работать с описанной струтурой в pci.h ?
-
Eugen Graf
- guru
- Сообщения: 6502
- Зарегистрирован: 13 ноя 2007, 02:20
- Награды: 4
- Версия LabVIEW: 2009
- Откуда: Saarbrücken
- Контактная информация:
Re: PCIe via Call Library Function Node
Или конечно наоборот если тебе нужно передать структуру, то надо создать кластер соответствующий этой структуре и с помощью Typr Cast преобразовать его в байтовый массив и передать библиотеке.
-
- beginner
- Сообщения: 16
- Зарегистрирован: 26 мар 2008, 16:15
- Версия LabVIEW: 7.1
- Откуда: Рига / Латвия
- Контактная информация:
Re: PCIe via Call Library Function Node
ок, вот функция которая нужна: 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 (только не знаю как это делать), так?
так она описана в 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
- guru
- Сообщения: 6502
- Зарегистрирован: 13 ноя 2007, 02:20
- Награды: 4
- Версия LabVIEW: 2009
- Откуда: Saarbrücken
- Контактная информация:
Re: PCIe via Call Library Function Node
Отвечу пока быстро не разбираясь.
Понимаешь, параметры функции перечислены через запятую. Отсюда и понятно как интерпретировать какой параметр. Если ты передаёшь вторым параметром из LabVIEW байтовый массив, то библиотека (точнее функция, которую ты вызываешь) воспринимает этот массив как структуру, которая как параметр находится на втором месте.
Самое главное чтобы то (сами данные) что передаётся полностью совпадало с тем что ожидается.
Понимаешь, параметры функции перечислены через запятую. Отсюда и понятно как интерпретировать какой параметр. Если ты передаёшь вторым параметром из LabVIEW байтовый массив, то библиотека (точнее функция, которую ты вызываешь) воспринимает этот массив как структуру, которая как параметр находится на втором месте.
Самое главное чтобы то (сами данные) что передаётся полностью совпадало с тем что ожидается.
-
- beginner
- Сообщения: 16
- Зарегистрирован: 26 мар 2008, 16:15
- Версия LabVIEW: 7.1
- Откуда: Рига / Латвия
- Контактная информация:
Re: PCIe via Call Library Function Node
тоесть только имя функции библиотеки должно совпадать с названием функции в #include <pci.h> ?
-
Eugen Graf
- guru
- Сообщения: 6502
- Зарегистрирован: 13 ноя 2007, 02:20
- Награды: 4
- Версия LabVIEW: 2009
- Откуда: Saarbrücken
- Контактная информация:
Re: PCIe via Call Library Function Node
Да, местонахождение DLL или SO, имя функции, количество параметров и количество байт в каждом параметре. Ну и конечно сами данные в памяти, а вот тип необязательно, т.к. каждая сторона интерпретирует данные по-своему.
-
- beginner
- Сообщения: 16
- Зарегистрирован: 26 мар 2008, 16:15
- Версия LabVIEW: 7.1
- Откуда: Рига / Латвия
- Контактная информация:
Re: PCIe via Call Library Function Node
Всем привет. Реализовал эту задачу при помощи CIN, если будет время попробую и Call Library Node. Всем спасибо! только вот сомниваюсь что скорость передачи данных будет близка к скорости PCIe x8 сейчас проблема с точностью измерить эту скорость - а именно для начала с точность до наносекунд измерить время выполнения кода а потом можно будет и скорость найти. Если мои опасения подтвердятся... придется писать модуль под linux и на програмном уровне устанавливать режим DMA для передачи этих данных.
-
Eugen Graf
- guru
- Сообщения: 6502
- Зарегистрирован: 13 ноя 2007, 02:20
- Награды: 4
- Версия LabVIEW: 2009
- Откуда: Saarbrücken
- Контактная информация:
Re: PCIe via Call Library Function Node
Я не знаю есть ли в твоей версии LabVIEW возможность измерить скорость выполнения прибора. Посмотри Tools->Profile->Performance and Memory...
Хорошая штука, только мне не приходилось ей часто пользоваться. Так иногда пользуюсъ чтобы узнать каким способом лучше спрограммировать тот или иной кусок прибора. Для сравнения короче.
А сейчас так вообще купили версию LabVIEW, где есть целая палитра для анализы приборов. Но я туда пока не заглядывал. Не нужно было до сих пор.
Хорошая штука, только мне не приходилось ей часто пользоваться. Так иногда пользуюсъ чтобы узнать каким способом лучше спрограммировать тот или иной кусок прибора. Для сравнения короче.
А сейчас так вообще купили версию LabVIEW, где есть целая палитра для анализы приборов. Но я туда пока не заглядывал. Не нужно было до сих пор.
- Вложения
-
- VI_analyzer.PNG (9.8 КБ) 6626 просмотров
Re: PCIe via Call Library Function Node
Если осторожно (и если ломает в LV описывать лишние ненужные кластеры) можно передавать во внешнюю функцию (через CallLibrary) вместо массива кучу переменных (соответствующих полям структуры) в порядке, обратном тому как они указаны в структуре в h-файле. Главное -- не ошибиться с количеством байт в каждом поле :) Обратный порядок связан с т.н. C-конвенцией (cdecl) при передаче параметров в функцию.перед вызавом библиотеки инициализируешь в LabVIEW байтовый массив с посчитаным макс. кол-вом
передаёшь этот массив библиотеке
на выходе узла CLFN получаешь заполненый массив
преобразуешь этот массив с помощью Type Cast в кластер
и всё
Вообще, рекомендую написать на C простенькую библиотечку с функцией, которая принимает в качестве аргумента структуры и распечатывает полученные аргументы. И поиграться с этой функцией через CallLibrary.
-
mzu2006
- 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
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 так же точно.
Не рекомендую использовать 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 так же точно.
Правила форума (Forum rules in Russian)
rm -rf /mnt/windows
rm -rf /mnt/windows
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
- 1 Ответы
- 1021 Просмотры
-
Последнее сообщение Artem.spb
-
- 8 Ответы
- 667 Просмотры
-
Последнее сообщение Select
-
- 8 Ответы
- 1506 Просмотры
-
Последнее сообщение Eugene_Eugene