Российский производитель и разработчик сертифицированного измерительного оборудования с 1987 года

Форум: Техническая поддержка

Вы не вошли.

 Поиск | Регистрация | Вход 

28.12.2022 16:30:58
#1

Участник
Здесь с 28.12.2022
Сообщений: 6

E2010 orangepi 4

Добрый день
Успешно собрал lcomp под linux (debian x64), пытаюсь собрать для orangepi с ОС Orangepi4-lts_3.0.6_debian_bullseye_desktop_xfce_linux5.10.43
Файл Readme прочел, libatomic_ops собрал, атомарные операции в stubs.h раскомментировал.

Получаю следующую ошибку

make -C /lib/modules/5.10.0-18-arm64/build/ M=/home/orangepi/qt/e2010 modules
make[1]: Entering directory '/usr/src/linux-headers-5.10.0-18-arm64'
  CC [M]  /home/orangepi/qt/e2010/ldevice.o
  CC [M]  /home/orangepi/qt/e2010/l760.o
  CC [M]  /home/orangepi/qt/e2010/ldevpciu.o
  LD [M]  /home/orangepi/qt/e2010/ldevpci.o
  CC [M]  /home/orangepi/qt/e2010/e2010.o
  CC [M]  /home/orangepi/qt/e2010/e140.o
  CC [M]  /home/orangepi/qt/e2010/e440.o
  CC [M]  /home/orangepi/qt/e2010/e154.o
  CC [M]  /home/orangepi/qt/e2010/ldevusbu.o
  LD [M]  /home/orangepi/qt/e2010/ldevusb.o
  CC [M]  /home/orangepi/qt/e2010/l791.o
  CC [M]  /home/orangepi/qt/e2010/ldevpcib.o
  LD [M]  /home/orangepi/qt/e2010/ldevpcibm.o
  MODPOST /home/orangepi/qt/e2010/Module.symvers
ERROR: modpost: "__aarch64_swp4_acq" [/home/orangepi/qt/e2010/ldevusb.ko] undefined!
make[3]: *** [/usr/src/linux-headers-5.10.0-18-common/scripts/Makefile.modpost:123: /home/orangepi/qt/e2010/Module.symvers] Error 1
make[3]: *** Deleting file '/home/orangepi/qt/e2010/Module.symvers'
make[2]: *** [/usr/src/linux-headers-5.10.0-18-common/Makefile:1760: modules] Error 2
make[1]: *** [/usr/src/linux-headers-5.10.0-18-common/Makefile:185: __sub-make] Error 2
make[1]: Leaving directory '/usr/src/linux-headers-5.10.0-18-arm64'
make: *** [Makefile:29: modules] Error 2

Подскажите пожалуйста куда копать?

28.12.2022 16:42:36
#2

Сотрудник "Л Кард"
Здесь с 17.04.2014
Сообщений: 1,270

Re: E2010 orangepi 4

А какую версию исходников lcomp (по какой ссылке скачивали) пытаетесь собрать?

28.12.2022 17:28:34
#3

Участник
Здесь с 28.12.2022
Сообщений: 6

Re: E2010 orangepi 4

В Readme указана версия 1.57.1
Скачано с сайта https://www.lcard.ru/download/lcomp_linux.tgz

29.12.2022 12:27:09
#4

Сотрудник "Л Кард"
Здесь с 17.04.2014
Сообщений: 1,270

Re: E2010 orangepi 4

А в версии 1.58 это проявляется? Можно взять либо готовые пакеты для Debian aarch64 (описано в https://www.lcard.ru/download/lcard_lin … utions.pdf, пакеты lcomp-dkms и liblcomp1-dev), либо исходники есть на git (драйвер https://gitlab.com/l-card/acq/devices/e … iver_linux, библиотека https://gitlab.com/l-card/acq/devices/e … p_library)

28.01.2023 14:57:17
#5

Участник
Здесь с 28.12.2022
Сообщений: 6

Re: E2010 orangepi 4

Установил пакеты lcomp-dkms и liblcomp1-dev. Версия 1.58.2. К проекту линкую libcomp из каталога /usr/lib/

Столкнулся со следующей странностью. Использую e2010 для оцифровки одиночных импульсов известной длительности со стартом по сигналу на DI16. При этом задаю размер буфера исходя из длительности, а также задаю номер канала. Размер буфера делаю кратным IrqStep.

Вот код инициализации

class e2010 : public QObject {
....
private:
     ....
     unsigned short *adc_buffer_pointer = nullptr; /* ADC buffer pointer */
     unsigned int *adc_buffer_offset = nullptr; /* ADC buffer offset in words */
     unsigned int _channel_number = 1;
     unsigned int _ freq = 10000000;
     unsigned int _size = 0;
     unsigned int _IrqStep = 4096;
};

void e2010::init() {
    ADC_PAR adcPar;

    PLATA_DESCR_U2 pd;
    SLOT_PAR sl;
    ULONG size;

    m_pI->GetSlotParam( &sl );

    m_pI->ReadPlataDescr( &pd ); // fill up properties

    size = _freq * this->get_duration(); 
    if ((size % _IrqStep) == 0) {
        ;
    } else {
        size = ((int)(size / _IrqStep)) * _IrqStep + _IrqStep;
    }
    if (size < _IrqStep) {
        size = _IrqStep;
    }
    _size = size;

    ULONG res = m_pI->RequestBufferStream( &size );

    if (res == L_SUCCESS) {
        qCDebug(logDebug()) << "e2010: success alloc size" << size;
    } else if (res == L_ERROR) {
        qCDebug(logDebug()) << "error";
    }

    switch( sl.BoardType )
    {
    case E2010B:
    case E2010:
        {
            adcPar.t2.s_Type = L_ADC_PARAM;
            adcPar.t2.AutoInit = 0; //1
            adcPar.t2.dRate = _freq / 1000.0;	/* частота в кадре (KHz)*/  // Fsampling
            adcPar.t2.dKadr = 0;	/* задержка между кадрами */ // 1000.0 / Fsampling //1000.0 / _freq;
            adcPar.t2.SynchroType = EXT_START_UP; //INT_START
            adcPar.t2.SynchroSrc = INT_CLK;

            switch (this->get_channel_number()) {
                case 1:
                    adcPar.t2.AdcIMask = SIG_0 | V30_0 | GND_1 | GND_2 | GND_3;
                break;
                case 2:
                    adcPar.t2.AdcIMask = SIG_1 | V30_1 | GND_0 | GND_2 | GND_3;
                break;
                case 3:
                    adcPar.t2.AdcIMask = SIG_2 | V30_2 | GND_0 | GND_1 | GND_3;
                break;
                case 4:
                    adcPar.t2.AdcIMask = SIG_3 | V30_3 | GND_0 | GND_1 | GND_2;
                break;
                default:

                break;
            }

            adcPar.t2.NCh = 1; //NCh
            adcPar.t2.Chn[0] = this->get_channel_number() - 1;
            adcPar.t2.FIFO = 0; //32768 //not used
            adcPar.t2.IrqStep = _IrqStep;
            adcPar.t2.Pages = size / _IrqStep; //64; in words
            adcPar.t2.IrqEna = 1;
            adcPar.t2.AdcEna = 1;
            // extra sync mode
            adcPar.t2.StartCnt = 0;
            adcPar.t2.StopCnt = 0;
            adcPar.t2.DM_Ena = 0;
            adcPar.t2.SynchroMode = 0;
            adcPar.t2.AdPorog = 0;

            m_pI->FillDAQparameters( &adcPar.t2 );

            m_pI->SetParametersStream( &adcPar.t2, &size, ( void ** ) &adc_buffer_pointer, ( void ** ) &adc_buffer_offset, L_STREAM_ADC );

            m_adcPar = adcPar;
        } break;
    }

    m_pI->EnableCorrection();
    m_pI->InitStartLDevice();

    qCDebug(logDebug) << "e2010: StartLDevice";
    m_pI->StartLDevice();
    _buffer_size = m_adcPar.t2.IrqStep*m_adcPar.t2.Pages;
}

Затем по таймеру смотрю наполненность буфера

void e2010::check_ready() {
    qCDebug(logDebug()) << "adc_buffer_offset" << *adc_buffer_offset;
    if (*adc_buffer_offset >= _buffer_size) {
        this->stop();
    }
}

void e2010::stop() {
    m_pI->StopLDevice();
    emit response(adc_buffer_pointer);
    qCDebug(logDebug) << "e2010: StopLDevice";
}

При этом в некоторые моменты, раз в несколько импульсов, буфер наполняется по несколько раз. Вот лог, демонстрирующий этот момент.

2023-01-27 14:18:39.545 [Debug]  : e2010: success alloc size 106496
2023-01-27 14:18:39.546 [Debug]  : Buffer size(word):  106496
2023-01-27 14:18:39.546 [Debug]  : Pages:              26
2023-01-27 14:18:39.547 [Debug]  : IrqStep:            4096
2023-01-27 14:18:39.548 [Debug]  : FIFO:               0
2023-01-27 14:18:39.548 [Debug]  : Rate:               10000
2023-01-27 14:18:39.548 [Debug]  : Kadr:               0.0001
2023-01-27 14:18:39.561 [Debug]  : e2010: StartLDevice
2023-01-27 14:18:39.603 [Debug]  : adc_buffer_offset 0
2023-01-27 14:18:39.617 [Debug]  : adc_buffer_offset 0
2023-01-27 14:18:39.619 [Debug]  : adc_buffer_offset 0
2023-01-27 14:18:39.621 [Debug]  : adc_buffer_offset 0
2023-01-27 14:18:39.623 [Debug]  : adc_buffer_offset 0
2023-01-27 14:18:39.624 [Debug]  : adc_buffer_offset 4096
2023-01-27 14:18:39.625 [Debug]  : adc_buffer_offset 8192
2023-01-27 14:18:39.625 [Debug]  : adc_buffer_offset 12288
2023-01-27 14:18:39.626 [Debug]  : adc_buffer_offset 16384
2023-01-27 14:18:39.628 [Debug]  : adc_buffer_offset 20480
2023-01-27 14:18:39.628 [Debug]  : adc_buffer_offset 24576
2023-01-27 14:18:39.629 [Debug]  : adc_buffer_offset 24576
2023-01-27 14:18:39.630 [Debug]  : adc_buffer_offset 32768
2023-01-27 14:18:39.631 [Debug]  : adc_buffer_offset 32768
2023-01-27 14:18:39.632 [Debug]  : adc_buffer_offset 40960
2023-01-27 14:18:39.633 [Debug]  : adc_buffer_offset 45056
2023-01-27 14:18:39.635 [Debug]  : adc_buffer_offset 49152
2023-01-27 14:18:39.635 [Debug]  : adc_buffer_offset 53248
2023-01-27 14:18:39.637 [Debug]  : adc_buffer_offset 57344
2023-01-27 14:18:39.638 [Debug]  : adc_buffer_offset 61440
2023-01-27 14:18:39.638 [Debug]  : adc_buffer_offset 61440
2023-01-27 14:18:39.639 [Debug]  : adc_buffer_offset 65536
2023-01-27 14:18:39.641 [Debug]  : adc_buffer_offset 73728
2023-01-27 14:18:39.643 [Debug]  : adc_buffer_offset 81920
2023-01-27 14:18:39.644 [Debug]  : adc_buffer_offset 86016
2023-01-27 14:18:39.645 [Debug]  : adc_buffer_offset 94208
2023-01-27 14:18:39.647 [Debug]  : adc_buffer_offset 102400
2023-01-27 14:18:39.649 [Debug]  : adc_buffer_offset 106496
2023-01-27 14:18:39.650 [Debug]  : adc_buffer_offset 4096
2023-01-27 14:18:39.651 [Debug]  : adc_buffer_offset 8192
2023-01-27 14:18:39.652 [Debug]  : adc_buffer_offset 12288
2023-01-27 14:18:39.653 [Debug]  : adc_buffer_offset 16384
2023-01-27 14:18:39.654 [Debug]  : adc_buffer_offset 20480
2023-01-27 14:18:39.654 [Debug]  : adc_buffer_offset 24576
2023-01-27 14:18:39.656 [Debug]  : adc_buffer_offset 32768
2023-01-27 14:18:39.658 [Debug]  : adc_buffer_offset 36864
2023-01-27 14:18:39.659 [Debug]  : adc_buffer_offset 40960
2023-01-27 14:18:39.659 [Debug]  : adc_buffer_offset 45056
2023-01-27 14:18:39.661 [Debug]  : adc_buffer_offset 49152
2023-01-27 14:18:39.663 [Debug]  : adc_buffer_offset 57344
2023-01-27 14:18:39.664 [Debug]  : adc_buffer_offset 61440
2023-01-27 14:18:39.665 [Debug]  : adc_buffer_offset 65536
2023-01-27 14:18:39.665 [Debug]  : adc_buffer_offset 69632
2023-01-27 14:18:39.667 [Debug]  : adc_buffer_offset 73728
2023-01-27 14:18:39.668 [Debug]  : adc_buffer_offset 77824
2023-01-27 14:18:39.669 [Debug]  : adc_buffer_offset 81920
2023-01-27 14:18:39.669 [Debug]  : adc_buffer_offset 81920
2023-01-27 14:18:39.671 [Debug]  : adc_buffer_offset 90112
2023-01-27 14:18:39.672 [Debug]  : adc_buffer_offset 94208
2023-01-27 14:18:39.673 [Debug]  : adc_buffer_offset 98304
2023-01-27 14:18:39.673 [Debug]  : adc_buffer_offset 98304
2023-01-27 14:18:39.675 [Debug]  : adc_buffer_offset 102400
2023-01-27 14:18:39.684 [Debug]  : e2010: StopLDevice

29.01.2023 12:20:08
#6

Сотрудник "Л Кард"
Здесь с 17.04.2014
Сообщений: 1,270

Re: E2010 orangepi 4

Если я правильно понял, исходя из настроек Вы по первому фронту на DI16 запускаете сбор, который дальше уже идет непрерывно (судя по StopCnt = 0) с частотой 10 МГц независимо от внешних импульсов.
Далее не совсем понятно, вы пишите про вызов check_ready() по таймеру. Каким образом и с каким периодом это происходит? Надо учитывать, что программный таймер имеет задержку (случайно меняющуюся от вызова к вызову) и на пути данных от модуля до буфера и проверки программой тоже могут быть задержки, поэтому если таймер выставлен исходя из IrqStep, то в общем в зависимости от соотношения задержек он может в каждую итерацию сработать чуть раньше или чуть позже, чем пришел новый пакет данных, что в общем и соответствует выводу, когда сперва значение счетчика повторяется (таймер сработал чуть раньше), а затем увеличивается сразу на два (пришел пропущенный ранее пакет и новый).
При этом если частота у Вас 10 МГц, то время IRQStep 4096 получается вообще меньше пол мс? Не совсем понятно, как Вы его контролируете, ОС общего назначения может задерживаться и на более длительные времена.
Также не совсем понял про "раз в несколько импульсов" - как контролируется число импульсов, т.к. сбор у Вас после первого фронта идет непрерывно?

31.01.2023 09:24:23
#7

Участник
Здесь с 28.12.2022
Сообщений: 6

Re: E2010 orangepi 4

Да, я по сути хочу чтобы по фронту на DI16 запустился сбор и оцифровал мне некоторую длительность на некотором канале. Каждый мой импульс - это должна быть новая инициализация тк длительность и канал разные, и новый фронт. Новый фронт приходит только после обработки данных response(adc_buffer_pointer) и нового вызова init.
Таймер в случае лога шел с периодом 1мс. Да, я понимаю что у меня не ОСРВ и мой таймер не синхронизирован с процессом сбора. По таймеру я не обрабатываю ничего, только смотрю завершился сбор или нет.

Если я задал однократный сбор (adcPar.t2.AutoInit = 0;) и задал какое то количество страниц Pages, то я ожидаю что заполнив весь буфер процесс оцифровки остановится. Или я ошибаюсь?

31.01.2023 13:06:12
#8

Сотрудник "Л Кард"
Здесь с 17.04.2014
Сообщений: 1,270

Re: E2010 orangepi 4

Теперь понял, проблема в том, что при AutoInit = 0 не выполняется останов на конце буфера. Тогда посмотрю, видимо действительно в нем проблема с работой в текущей версии. А как именно Вы проверяете, что сбор буфера завершился и по какому условию вызывается e2010::stop()?

31.01.2023 13:11:31
#9

Участник
Здесь с 28.12.2022
Сообщений: 6

Re: E2010 orangepi 4

StopLDevice вызывается в stop, который вызывается исходя из проверки условия с adc_buffer_offset в check_ready.

31.01.2023 13:40:51
#10

Сотрудник "Л Кард"
Здесь с 17.04.2014
Сообщений: 1,270

Re: E2010 orangepi 4

Точно. Смутил вывод, но видимо за время отладочного вывода adc_buffer_offset значение самого adc_buffer_offset успевает изменится на IrqStep, поэтому при выводе adc_buffer_offset == 106496 (_buffer_size) сбор продолжается (т.к. за время вывода до проверки успевает IrqStep стать 4096),  а при выводе 102400 - останавливается (т.к. до проверки успевает стать 106496).
По сути действительно сейчас автостоп не работает в этой версии и модуль продолжает собирать данные, а выполнится останов или нет зависит от того, попадете Вы при проверки на значение 106496 или нет. Тогда как поправлю выложу новую версию.

31.01.2023 18:19:58
#11

Сотрудник "Л Кард"
Здесь с 17.04.2014
Сообщений: 1,270

Re: E2010 orangepi 4

Закинул на сервер сборки пакетов версию 1.58.3 для lcomp-dkms, должно быть доступно обновление в ближайшее время, тогда попробуйте  - решится ли проблема.
У меня этот режим теперь заработал, проверял для достоверности корректной работы, что за несколько проверок после дохождения до конца буфера позиция остается равной размеру буфера, а также, что первый отсчет остается неизменный, с момента прихода первых данных.

02.02.2023 13:54:32
#12

Участник
Здесь с 28.12.2022
Сообщений: 6

Re: E2010 orangepi 4

Вроде заработало, спасибо!

Контакты

Адрес: 117105, Москва, Варшавское шоссе, д. 5, корп. 4, стр. 2

Многоканальный телефон:
+7 (495) 785-95-25

Отдел продаж: sale@lcard.ru
Техническая поддержка: support@lcard.ru

Время работы: с 9-00 до 19-00 мск