PCIe via Call Library Function Node

VISA, TCP/IP, USB, CAN, GPIB и подобные протоколы
arcades
beginner
beginner
Сообщения: 16
Зарегистрирован: 26 мар 2008, 16:15
Версия LabVIEW: 7.1
Откуда: Рига / Латвия
Контактная информация:

PCIe via Call Library Function Node

Сообщение arcades »

Работаю в Linux Ubuntu ядро 2.6. Есть программа на Си которая считывает данные с памяти устройства через PCI express. Нужна реализация этой программы в LabView 7.1. Использую Call Library Function Node. У меня появилось несколько вопросов:
1) Возможно ли весь проект на Си скомпилировать как разделяемую библиотеку .so и вызывать конкретную функцию уже в LabView?

Программа внутри себя использует функции PCI библиотеки libpci.so которые экспортированы в pci.h. (инициализация шины pci, поиск устройства итд)
2) Мне нужно будет вызывать эти функции также по отдельности? Если да, то что делать если они используют сложные параметры состоящие из структур и поинтеров?

P.S: для считывания данных используется функция mmap( .... );
Аватара пользователя
Pavel Krivozubov

Activity Bronze
professor
professor
Сообщения: 4421
Зарегистрирован: 07 фев 2008, 16:39
Награды: 3
Версия LabVIEW: 7.0 - 2013
Откуда: г. Электросталь
Благодарил (а): 24 раза
Поблагодарили: 9 раз
Контактная информация:

Re: PCIe via Call Library Function Node

Сообщение Pavel Krivozubov »

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

Re: PCIe via Call Library Function Node

Сообщение arcades »

Indey потаму что Линукс бесплатный и более гибкий для работы с устройствами можно самому создавать модули, загружать в ядро и открывается много возможностей.
Аватара пользователя
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 писал(а):Работаю в Linux Ubuntu ядро 2.6. Есть программа на Си которая считывает данные с памяти устройства через PCI express. Нужна реализация этой программы в LabView 7.1. Использую Call Library Function Node. У меня появилось несколько вопросов:
1) Возможно ли весь проект на Си скомпилировать как разделяемую библиотеку .so и вызывать конкретную функцию уже в LabView?
Что значит разделяемая? Я тоже библиотеки для линукса не делал, но думаю что работает примерно так же как и DLL в винде. Если так, то можно скомпилировать всё в одну библиотеку, которая будет иметь много функций. Эти функции можно вызывать поотдельности из LabVIEW используя как раз Call Library Function Node.
arcades писал(а): Программа внутри себя использует функции PCI библиотеки libpci.so которые экспортированы в pci.h. (инициализация шины pci, поиск устройства итд)
2) Мне нужно будет вызывать эти функции также по отдельности? Если да, то что делать если они используют сложные параметры состоящие из структур и поинтеров?

P.S: для считывания данных используется функция mmap( .... );
Я думаю можно и из LabVIEW сразу вызывать libpci.so без какой либо программы-врэппера. Что же касается сложных структур, то если помучится, то в принципе можно и структуры всякие через поинтеры вызывать. Надо будет эту структуту преобразовать в эррэй, по-моему. Точно не помню, но в принципе возможно.
arcades
beginner
beginner
Сообщения: 16
Зарегистрирован: 26 мар 2008, 16:15
Версия LabVIEW: 7.1
Откуда: Рига / Латвия
Контактная информация:

Re: PCIe via Call Library Function Node

Сообщение arcades »

насчет структур такой пример:
использую функцию
Vendor = pci_read_word(dev, 0x00);

далее эта функция pci_read_word описана как:

" u16 pci_read_word(struct pci_dev *, int pos); "

а структура 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 */
};

у меня честно говоря голова кругом идет от этого, буду благодарен за детальные советы и замечания
Аватара пользователя
Pavel Krivozubov

Activity Bronze
professor
professor
Сообщения: 4421
Зарегистрирован: 07 фев 2008, 16:39
Награды: 3
Версия LabVIEW: 7.0 - 2013
Откуда: г. Электросталь
Благодарил (а): 24 раза
Поблагодарили: 9 раз
Контактная информация:

Re: PCIe via Call Library Function Node

Сообщение Pavel Krivozubov »

arcades писал(а):Indey потаму что Линукс бесплатный и более гибкий для работы с устройствами можно самому создавать модули, загружать в ядро и открывается много возможностей.
Согласен только с бесплатностью, да и то появились уже дистрибутивы Red Hat для корпоративного применения, которые очень даже платные. Во всем остальном вопрос спорный.
Кстати а что за плата то? Может для нее уже давно драйвер написан под винду и все библиотеки есть?
Еще могу посоветовать проделать вызовы всех этих функций из dll под windows: если прокатит там - то и под linux должно прокатить тоже. Но все же тема компиляции под linux немного экзотична, а то что используются вызовы из библиотек, написанных на сторонних IDE делает её экзотичной вдвойне. Кстати по моему на форуме МГУ чем то подобным занимался Vanessa, попробуй спросить у него.
arcades
beginner
beginner
Сообщения: 16
Зарегистрирован: 26 мар 2008, 16:15
Версия LabVIEW: 7.1
Откуда: Рига / Латвия
Контактная информация:

Re: PCIe via Call Library Function Node

Сообщение arcades »

Indey писал(а):
arcades писал(а):Indey потаму что Линукс бесплатный и более гибкий для работы с устройствами можно самому создавать модули, загружать в ядро и открывается много возможностей.
Согласен только с бесплатностью, да и то появились уже дистрибутивы Red Hat для корпоративного применения, которые очень даже платные. Во всем остальном вопрос спорный.
Кстати а что за плата то? Может для нее уже давно драйвер написан под винду и все библиотеки есть?
Еще могу посоветовать проделать вызовы всех этих функций из dll под windows: если прокатит там - то и под linux должно прокатить тоже. Но все же тема компиляции под linux немного экзотична, а то что используются вызовы из библиотек, написанных на сторонних IDE делает её экзотичной вдвойне. Кстати по моему на форуме МГУ чем то подобным занимался Vanessa, попробуй спросить у него.
Спасибо!
Всё дело в том, что есть уже готовая программа которая считывает данные с платы. (Плата от Altera Stratix GX II development board, есть конечно ДЛЛ дня виндовса, но это находится на нижнем приоритете тоесть потом и за виндовс скорее всего возьмусь, но есть еще одна которую сделал коллега с нее тоже нужно будет читать данные)
Программа отлично справляется правда написана под Линукс. Осталось главное - адаптировать её для работы с LabView посредством Code Interface Node или Call Library Function Node. Только в NI сапорт уже давно не занимается CIN-ами, а что касается библиотек - очень сложно адаптировать структурные данные, которые внутри себя еще содержат указатели и на другие структуры, для работы с LabView. Искал в интернете и не нашел чтобы ктото вообще писал Враперы под Линукс и понятия не имею как и вообще писать :dntknw:
Аватара пользователя
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 с поинтерами на структуры. Может чем нибудь поможет.
Struct.PNG
В общем чтобы вызвать из LabVIEW функцию DLL использующюю поинтер на структуру тебе нужно посчитать количество байт в структуре (для аллокации памяти) и в настройках Call Library Function Node надо указать тип как у маня на картинке. А уж после получения массива преобразовывать в кластер, то биш структуру.
arcades
beginner
beginner
Сообщения: 16
Зарегистрирован: 26 мар 2008, 16:15
Версия LabVIEW: 7.1
Откуда: Рига / Латвия
Контактная информация:

Re: PCIe via Call Library Function Node

Сообщение arcades »

Спасибо, насчет размера структуры - через sizeof(... ) и далее malloc(sizeof(....) ) ? не силен в Сях, сорри если глупый вопрос.
Аватара пользователя
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 »

Посмотри вот этот документ. Он на немецком, но там много понимать не надо. Посмотри пункт 4.5.1 и 4.5.2 в самом конце документа.

http://www.labviewforum.de/index.php?ac ... t&id=32624

А ещё обязательно найди PDF UsingExtCode на сайте НИ, там на английском всё написано.

Alloc и Malloc тебе совсем не нужны. Тебе нужен Init Array в LabVIEW.

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

Re: PCIe via Call Library Function Node

Сообщение arcades »

Вобщем я даже незнаю что лучше мне использовать Call Library Function Node или Code Interface Node? "External code manual" читал. Кто разбирается в CIN, нужно ли выделять память для структур которые я использую в программе (которые описаны в pci.h) ?
Сейчас попробую по строчки отдебагить до какого момента работает CIN и что возвращают функции. Сложность еще в том что на терминале не показывается debugging информация а также стандартные вызовы printf внутри программы.
Аватара пользователя
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 »

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

Re: PCIe via Call Library Function Node

Сообщение arcades »

да нет... Под Линуксом и код низкого уровня Си. попробовал строка за строкой вобщем не находит девайсы.

MgErr CINRun(int32 *Numeric, int32 *param1, int32 *param2);

MgErr CINRun(int32 *Numeric, int32 *param1, int32 *param2)
{

struct pci_access *pacc;
struct pci_dev *dev;
pacc = pci_alloc();
pci_init(pacc);
pci_scan_bus(pacc);
dev = pacc->devices;
//unsigned char *ptr;
*Numeric = pacc;
if (dev != NULL) {
*param1 = 32;
}
if (dev == NULL) {
*param1 = 128;
}
............................
возвращает 128 тобишь не находит устройства.
Аватара пользователя
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 »

Да, сорри, я забыл про линукс. Конечно никакого Микрософта. :crazy:

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

Re: PCIe via Call Library Function Node

Сообщение arcades »

Решил проблему с компиляцией CIN! Нужно было отредактировать Makefile, только это было очень сложно, можно сказать что нахаляву угадал. Осталась проблема с функцией MoveBlock, кто-нибудь имеет опыт работы с этой функцией ? (Call Library Function Node пока отложил, но благодарю за советы, материалы и скриншоты, буду учиться враперы писать)
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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