| 
       
     | 
  
    | 
       
       
      
        
        - Участник
 
                						- Здесь с 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 Подскажите пожалуйста куда копать? 
                             
                        
               
     | 
  
  
    | 
       
     | 
  
    | 
       
       
      
        
        - Сотрудник "Л Кард"
 
                						- Здесь с 17.04.2014
 
						- Сообщений: 1,359
 
               
       
     | 
      
        Re: E2010 orangepi 4
        
          А какую версию исходников lcomp (по какой ссылке скачивали) пытаетесь собрать? 
                             
                        
               
     | 
  
  
    | 
       
     | 
  
    | 
       
       
      
        
        - Участник
 
                						- Здесь с 28.12.2022
 
						- Сообщений: 6
 
               
       
     | 
      
        Re: E2010 orangepi 4
        
          В Readme указана версия 1.57.1 Скачано с сайта https://www.lcard.ru/download/lcomp_linux.tgz 
                             
                        
               
     | 
  
  
    | 
       
     | 
  
    | 
       
       
      
        
        - Сотрудник "Л Кард"
 
                						- Здесь с 17.04.2014
 
						- Сообщений: 1,359
 
               
       
     | 
      
        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.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 
                             
                        
               
     | 
  
  
    | 
       
     | 
  
    | 
       
       
      
        
        - Сотрудник "Л Кард"
 
                						- Здесь с 17.04.2014
 
						- Сообщений: 1,359
 
               
       
     | 
      
        Re: E2010 orangepi 4
        
          Если я правильно понял, исходя из настроек Вы по первому фронту на DI16 запускаете сбор, который дальше уже идет непрерывно (судя по StopCnt = 0) с частотой 10 МГц независимо от внешних импульсов. Далее не совсем понятно, вы пишите про вызов check_ready() по таймеру. Каким образом и с каким периодом это происходит? Надо учитывать, что программный таймер имеет задержку (случайно меняющуюся от вызова к вызову) и на пути данных от модуля до буфера и проверки программой тоже могут быть задержки, поэтому если таймер выставлен исходя из IrqStep, то в общем в зависимости от соотношения задержек он может в каждую итерацию сработать чуть раньше или чуть позже, чем пришел новый пакет данных, что в общем и соответствует выводу, когда сперва значение счетчика повторяется (таймер сработал чуть раньше), а затем увеличивается сразу на два (пришел пропущенный ранее пакет и новый). При этом если частота у Вас 10 МГц, то время IRQStep 4096 получается вообще меньше пол мс? Не совсем понятно, как Вы его контролируете, ОС общего назначения может задерживаться и на более длительные времена. Также не совсем понял про "раз в несколько импульсов" - как контролируется число импульсов, т.к. сбор у Вас после первого фронта идет непрерывно? 
                             
                        
               
     | 
  
  
    | 
       
     | 
  
    | 
       
       
      
        
        - Участник
 
                						- Здесь с 28.12.2022
 
						- Сообщений: 6
 
               
       
     | 
      
        Re: E2010 orangepi 4
        
          Да, я по сути хочу чтобы по фронту на DI16 запустился сбор и оцифровал мне некоторую длительность на некотором канале. Каждый мой импульс - это должна быть новая инициализация тк длительность и канал разные, и новый фронт. Новый фронт приходит только после обработки данных response(adc_buffer_pointer) и нового вызова init. Таймер в случае лога шел с периодом 1мс. Да, я понимаю что у меня не ОСРВ и мой таймер не синхронизирован с процессом сбора. По таймеру я не обрабатываю ничего, только смотрю завершился сбор или нет.  Если я задал однократный сбор (adcPar.t2.AutoInit = 0;) и задал какое то количество страниц Pages, то я ожидаю что заполнив весь буфер процесс оцифровки остановится. Или я ошибаюсь? 
                             
                        
               
     | 
  
  
    | 
       
     | 
  
    | 
       
       
      
        
        - Сотрудник "Л Кард"
 
                						- Здесь с 17.04.2014
 
						- Сообщений: 1,359
 
               
       
     | 
      
        Re: E2010 orangepi 4
        
          Теперь понял, проблема в том, что при AutoInit = 0 не выполняется останов на конце буфера. Тогда посмотрю, видимо действительно в нем проблема с работой в текущей версии. А как именно Вы проверяете, что сбор буфера завершился и по какому условию вызывается e2010::stop()? 
                             
                        
               
     | 
  
  
    | 
       
     | 
  
    | 
       
       
      
        
        - Участник
 
                						- Здесь с 28.12.2022
 
						- Сообщений: 6
 
               
       
     | 
      
        Re: E2010 orangepi 4
        
          StopLDevice вызывается в stop, который вызывается исходя из проверки условия с adc_buffer_offset в check_ready. 
                             
                        
               
     | 
  
  
    | 
       
     | 
  
    | 
       
       
      
        
        - Сотрудник "Л Кард"
 
                						- Здесь с 17.04.2014
 
						- Сообщений: 1,359
 
               
       
     | 
      
        Re: E2010 orangepi 4
        
          Точно. Смутил вывод, но видимо за время отладочного вывода adc_buffer_offset значение самого adc_buffer_offset успевает изменится на IrqStep, поэтому при выводе adc_buffer_offset == 106496 (_buffer_size) сбор продолжается (т.к. за время вывода до проверки успевает IrqStep стать 4096),  а при выводе 102400 - останавливается (т.к. до проверки успевает стать 106496). По сути действительно сейчас автостоп не работает в этой версии и модуль продолжает собирать данные, а выполнится останов или нет зависит от того, попадете Вы при проверки на значение 106496 или нет. Тогда как поправлю выложу новую версию. 
                             
                        
               
     | 
  
  
    | 
       
     | 
  
    | 
       
       
      
        
        - Сотрудник "Л Кард"
 
                						- Здесь с 17.04.2014
 
						- Сообщений: 1,359
 
               
       
     | 
      
        Re: E2010 orangepi 4
        
          Закинул на сервер сборки пакетов версию 1.58.3 для lcomp-dkms, должно быть доступно обновление в ближайшее время, тогда попробуйте  - решится ли проблема. У меня этот режим теперь заработал, проверял для достоверности корректной работы, что за несколько проверок после дохождения до конца буфера позиция остается равной размеру буфера, а также, что первый отсчет остается неизменный, с момента прихода первых данных. 
                             
                        
               
     | 
  
  
    | 
       
     | 
  
    | 
       
       
      
        
        - Участник
 
                						- Здесь с 28.12.2022
 
						- Сообщений: 6
 
               
       
     | 
      
        Re: E2010 orangepi 4
        
          Вроде заработало, спасибо! 
                             
                        
               
     |