PCIe via Call Library Function Node
-
- beginner
- Сообщения: 16
- Зарегистрирован: 26 мар 2008, 16:15
- Версия LabVIEW: 7.1
- Откуда: Рига / Латвия
- Контактная информация:
PCIe via Call Library Function Node
Работаю в 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( .... );
1) Возможно ли весь проект на Си скомпилировать как разделяемую библиотеку .so и вызывать конкретную функцию уже в LabView?
Программа внутри себя использует функции PCI библиотеки libpci.so которые экспортированы в pci.h. (инициализация шины pci, поиск устройства итд)
2) Мне нужно будет вызывать эти функции также по отдельности? Если да, то что делать если они используют сложные параметры состоящие из структур и поинтеров?
P.S: для считывания данных используется функция mmap( .... );
-
Pavel Krivozubov
- professor
- Сообщения: 4422
- Зарегистрирован: 07 фев 2008, 16:39
- Награды: 3
- Версия LabVIEW: 7.0 - 2013
- Откуда: г. Электросталь
- Благодарил (а): 24 раза
- Поблагодарили: 9 раз
- Контактная информация:
Re: PCIe via Call Library Function Node
под линукс не компилил, поэтому помочь ничем не могу к сожалению.
у меня возник оффтоп вопрос, а почему именно линукс выбрана в качестве конечной ОС для работы? если не секрет.
у меня возник оффтоп вопрос, а почему именно линукс выбрана в качестве конечной ОС для работы? если не секрет.
Правила форума
Developlabs - IT услуги - ждём Ваших заказов на написание программ
Новостной канал о LabVIEW и технологиях NI на Facebook
Developlabs - IT услуги - ждём Ваших заказов на написание программ
Новостной канал о LabVIEW и технологиях NI на Facebook
-
- beginner
- Сообщения: 16
- Зарегистрирован: 26 мар 2008, 16:15
- Версия LabVIEW: 7.1
- Откуда: Рига / Латвия
- Контактная информация:
Re: PCIe via Call Library Function Node
Indey потаму что Линукс бесплатный и более гибкий для работы с устройствами можно самому создавать модули, загружать в ядро и открывается много возможностей.
-
Eugen Graf
- guru
- Сообщения: 6502
- Зарегистрирован: 13 ноя 2007, 02:20
- Награды: 4
- Версия LabVIEW: 2009
- Откуда: Saarbrücken
- Контактная информация:
Re: PCIe via Call Library Function Node
Что значит разделяемая? Я тоже библиотеки для линукса не делал, но думаю что работает примерно так же как и DLL в винде. Если так, то можно скомпилировать всё в одну библиотеку, которая будет иметь много функций. Эти функции можно вызывать поотдельности из LabVIEW используя как раз Call Library Function Node.arcades писал(а):Работаю в Linux Ubuntu ядро 2.6. Есть программа на Си которая считывает данные с памяти устройства через PCI express. Нужна реализация этой программы в LabView 7.1. Использую Call Library Function Node. У меня появилось несколько вопросов:
1) Возможно ли весь проект на Си скомпилировать как разделяемую библиотеку .so и вызывать конкретную функцию уже в LabView?
Я думаю можно и из LabVIEW сразу вызывать libpci.so без какой либо программы-врэппера. Что же касается сложных структур, то если помучится, то в принципе можно и структуры всякие через поинтеры вызывать. Надо будет эту структуту преобразовать в эррэй, по-моему. Точно не помню, но в принципе возможно.arcades писал(а): Программа внутри себя использует функции PCI библиотеки libpci.so которые экспортированы в pci.h. (инициализация шины pci, поиск устройства итд)
2) Мне нужно будет вызывать эти функции также по отдельности? Если да, то что делать если они используют сложные параметры состоящие из структур и поинтеров?
P.S: для считывания данных используется функция mmap( .... );
-
- beginner
- Сообщения: 16
- Зарегистрирован: 26 мар 2008, 16:15
- Версия LabVIEW: 7.1
- Откуда: Рига / Латвия
- Контактная информация:
Re: PCIe via Call Library Function Node
насчет структур такой пример:
использую функцию
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 */
};
у меня честно говоря голова кругом идет от этого, буду благодарен за детальные советы и замечания
использую функцию
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
- professor
- Сообщения: 4422
- Зарегистрирован: 07 фев 2008, 16:39
- Награды: 3
- Версия LabVIEW: 7.0 - 2013
- Откуда: г. Электросталь
- Благодарил (а): 24 раза
- Поблагодарили: 9 раз
- Контактная информация:
Re: PCIe via Call Library Function Node
Согласен только с бесплатностью, да и то появились уже дистрибутивы Red Hat для корпоративного применения, которые очень даже платные. Во всем остальном вопрос спорный.arcades писал(а):Indey потаму что Линукс бесплатный и более гибкий для работы с устройствами можно самому создавать модули, загружать в ядро и открывается много возможностей.
Кстати а что за плата то? Может для нее уже давно драйвер написан под винду и все библиотеки есть?
Еще могу посоветовать проделать вызовы всех этих функций из dll под windows: если прокатит там - то и под linux должно прокатить тоже. Но все же тема компиляции под linux немного экзотична, а то что используются вызовы из библиотек, написанных на сторонних IDE делает её экзотичной вдвойне. Кстати по моему на форуме МГУ чем то подобным занимался Vanessa, попробуй спросить у него.
Правила форума
Developlabs - IT услуги - ждём Ваших заказов на написание программ
Новостной канал о LabVIEW и технологиях NI на Facebook
Developlabs - IT услуги - ждём Ваших заказов на написание программ
Новостной канал о LabVIEW и технологиях NI на Facebook
-
- beginner
- Сообщения: 16
- Зарегистрирован: 26 мар 2008, 16:15
- Версия LabVIEW: 7.1
- Откуда: Рига / Латвия
- Контактная информация:
Re: PCIe via Call Library Function Node
Спасибо!Indey писал(а):Согласен только с бесплатностью, да и то появились уже дистрибутивы Red Hat для корпоративного применения, которые очень даже платные. Во всем остальном вопрос спорный.arcades писал(а):Indey потаму что Линукс бесплатный и более гибкий для работы с устройствами можно самому создавать модули, загружать в ядро и открывается много возможностей.
Кстати а что за плата то? Может для нее уже давно драйвер написан под винду и все библиотеки есть?
Еще могу посоветовать проделать вызовы всех этих функций из dll под windows: если прокатит там - то и под linux должно прокатить тоже. Но все же тема компиляции под linux немного экзотична, а то что используются вызовы из библиотек, написанных на сторонних IDE делает её экзотичной вдвойне. Кстати по моему на форуме МГУ чем то подобным занимался Vanessa, попробуй спросить у него.
Всё дело в том, что есть уже готовая программа которая считывает данные с платы. (Плата от Altera Stratix GX II development board, есть конечно ДЛЛ дня виндовса, но это находится на нижнем приоритете тоесть потом и за виндовс скорее всего возьмусь, но есть еще одна которую сделал коллега с нее тоже нужно будет читать данные)
Программа отлично справляется правда написана под Линукс. Осталось главное - адаптировать её для работы с LabView посредством Code Interface Node или Call Library Function Node. Только в NI сапорт уже давно не занимается CIN-ами, а что касается библиотек - очень сложно адаптировать структурные данные, которые внутри себя еще содержат указатели и на другие структуры, для работы с LabView. Искал в интернете и не нашел чтобы ктото вообще писал Враперы под Линукс и понятия не имею как и вообще писать
-
Eugen Graf
- guru
- Сообщения: 6502
- Зарегистрирован: 13 ноя 2007, 02:20
- Награды: 4
- Версия LabVIEW: 2009
- Откуда: Saarbrücken
- Контактная информация:
Re: PCIe via Call Library Function Node
Посмотри вот так я вызываю DLL с поинтерами на структуры. Может чем нибудь поможет.
В общем чтобы вызвать из LabVIEW функцию DLL использующюю поинтер на структуру тебе нужно посчитать количество байт в структуре (для аллокации памяти) и в настройках Call Library Function Node надо указать тип как у маня на картинке. А уж после получения массива преобразовывать в кластер, то биш структуру.-
- beginner
- Сообщения: 16
- Зарегистрирован: 26 мар 2008, 16:15
- Версия LabVIEW: 7.1
- Откуда: Рига / Латвия
- Контактная информация:
Re: PCIe via Call Library Function Node
Спасибо, насчет размера структуры - через sizeof(... ) и далее malloc(sizeof(....) ) ? не силен в Сях, сорри если глупый вопрос.
-
Eugen Graf
- guru
- Сообщения: 6502
- Зарегистрирован: 13 ноя 2007, 02:20
- Награды: 4
- Версия LabVIEW: 2009
- Откуда: Saarbrücken
- Контактная информация:
Re: PCIe via Call Library Function Node
Посмотри вот этот документ. Он на немецком, но там много понимать не надо. Посмотри пункт 4.5.1 и 4.5.2 в самом конце документа.
http://www.labviewforum.de/index.php?ac ... t&id=32624
А ещё обязательно найди PDF UsingExtCode на сайте НИ, там на английском всё написано.
Alloc и Malloc тебе совсем не нужны. Тебе нужен Init Array в LabVIEW.
А лучше всего выкладывай DLL и описание функций. И может быть твои наработки, попробуем разобраться.
http://www.labviewforum.de/index.php?ac ... t&id=32624
А ещё обязательно найди PDF UsingExtCode на сайте НИ, там на английском всё написано.
Alloc и Malloc тебе совсем не нужны. Тебе нужен Init Array в LabVIEW.
А лучше всего выкладывай DLL и описание функций. И может быть твои наработки, попробуем разобраться.
-
- beginner
- Сообщения: 16
- Зарегистрирован: 26 мар 2008, 16:15
- Версия LabVIEW: 7.1
- Откуда: Рига / Латвия
- Контактная информация:
Re: PCIe via Call Library Function Node
Вобщем я даже незнаю что лучше мне использовать Call Library Function Node или Code Interface Node? "External code manual" читал. Кто разбирается в CIN, нужно ли выделять память для структур которые я использую в программе (которые описаны в pci.h) ?
Сейчас попробую по строчки отдебагить до какого момента работает CIN и что возвращают функции. Сложность еще в том что на терминале не показывается debugging информация а также стандартные вызовы printf внутри программы.
Сейчас попробую по строчки отдебагить до какого момента работает CIN и что возвращают функции. Сложность еще в том что на терминале не показывается debugging информация а также стандартные вызовы printf внутри программы.
-
Eugen Graf
- guru
- Сообщения: 6502
- Зарегистрирован: 13 ноя 2007, 02:20
- Награды: 4
- Версия LabVIEW: 2009
- Откуда: Saarbrücken
- Контактная информация:
Re: PCIe via Call Library Function Node
Да кстати если у тебя MS Visual Studio, то можно дебагить вместе с LabVIEW. To есть запускаешь дибаггинг в Visual Studio и стартуешь свой VI в LabVIEW, можно ставить брейк поинты и проверять значения переменных в DLL-ке.
-
- beginner
- Сообщения: 16
- Зарегистрирован: 26 мар 2008, 16:15
- Версия LabVIEW: 7.1
- Откуда: Рига / Латвия
- Контактная информация:
Re: PCIe via Call Library Function Node
да нет... Под Линуксом и код низкого уровня Си. попробовал строка за строкой вобщем не находит девайсы.
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 тобишь не находит устройства.
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
- guru
- Сообщения: 6502
- Зарегистрирован: 13 ноя 2007, 02:20
- Награды: 4
- Версия LabVIEW: 2009
- Откуда: Saarbrücken
- Контактная информация:
Re: PCIe via Call Library Function Node
Да, сорри, я забыл про линукс. Конечно никакого Микрософта.
А MAX в линуксе то должен быть, да? Там дивайс видно?
А MAX в линуксе то должен быть, да? Там дивайс видно?
-
- beginner
- Сообщения: 16
- Зарегистрирован: 26 мар 2008, 16:15
- Версия LabVIEW: 7.1
- Откуда: Рига / Латвия
- Контактная информация:
Re: PCIe via Call Library Function Node
Решил проблему с компиляцией CIN! Нужно было отредактировать Makefile, только это было очень сложно, можно сказать что нахаляву угадал. Осталась проблема с функцией MoveBlock, кто-нибудь имеет опыт работы с этой функцией ? (Call Library Function Node пока отложил, но благодарю за советы, материалы и скриншоты, буду учиться враперы писать)
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
- 1 Ответы
- 1030 Просмотры
-
Последнее сообщение Artem.spb
-
- 8 Ответы
- 688 Просмотры
-
Последнее сообщение Select
-
- 8 Ответы
- 2082 Просмотры
-
Последнее сообщение Eugene_Eugene