Меню
+7 (495) 785-95-25
sale@lcard.ru
sale@lcard.ru
Да, можно и DAC использовать аналогично. Если задержки не критичны, то можно вообще просто использовать асинхронный вывод как вначале после StreamsStart, так и в конце перед StreamsStop, что значительно проще.
Если речь про burnUSB.bat из архива с версией 2.0.0.0, то в принципе он рабочий, просто требует остановки ltrd и привязан к Windows.
Поэтому сейчас основной вариант описан в ltr_cross_sdk.pdf: либо через LTR Manger (пункт 4.3.3), либо в отдельной консольной утилитой (пункт 4.5.1.3). Последнее в основном для использования в Linux без графического интерфейса.
Подумаю, возможно можно будет включить краткое описание способов в ltr_soft_getting_started.pdf, чтобы не было вопросов...
Что-то файлы wireshark до нас не дошли, Вы на support высылали?
А поставить что-то вроде ПК (возможно одноплатного) на стороне крейта, чтобы там был ltrd, а конечный софт уже в пользовательской сети, такой возможности нет?
Здравствуйте.
В принципе должно быть возможно. Можно использовать как циклический вывод на одно слово (значение выходов DO), так и потоковый, подгрузив одно значение (если новые не будет передаваться, то будет повторяться на выводе последнее). Сделать предзагрузку этого одного слова нужно до X502_StreamsStart(), тогда по X502_StreamsStart() начнется выводиться как это значение на DOUT, так и сбор АЦП (с фиксированной задержкой, описанной в руководстве пользователя.
А вот чтобы установить выход обратно в 0 по останову сбора данных придется видимо использовать асинхронный вывод значения перед X502_StreamsStop() или после него, соответственно будет разница во времени между этими двумя событиями на время выполнения этих команд.
Перепрошивка выполняется с помощью программы LTR Manager. Если укажете где указаны другие способы, уберем...
Для перепрошивки необходимо:
- Подключить крейт к ПК по USB (обновление по сети доступно только с 3.0.0.17, в 2.0.0.0 - только по USB). На какой интерфейс настроен крейт не важно, по USB крейт будет виден даже если настроен по на работу по Ethernet, но только без модулей
- Открыть LTR Mangger, нажать правой кнопкой по подключенному по USB керйту и выбрать пункт меню "Обновление прошивки крейта...".
- Выбрать записываемый файл прошивки для нужного типа крейта (можно скачать со страницы крейта в разделе "Программное обеспечение" -> "Firmware и BIOS" (для EU-8/16 версия 3.0.0.17 - https://www.lcard.ru/download/ltr_eu_8_ … 0.0.17.zip, версия 2.0.0.0 - https://www.lcard.ru/download/ltr_eu_8_16_fw2000.zip).
- После завершения записи снять питание крейта и снова включить питание
- Проверить, что изменилась версия прошивки в LTR Manager
Обратно можно вернуть 2.0.0.0 точно также, скачав старую версию прошивки.
В случае если по какой-то причине обновление пройдет неудачно, что к крейту нельзя будет подключиться после обновление, то есть вариант нажать и удерживать долго (секунд 10) спрятанную кнопку сброса на передней панели крейта, тогда будет загружен крейт в режиме загрузчика, а не штатная прошивка, и крейт будет видится как LTR-EU-2 без модулей и точно также можно через LTR Manager его обновить.
А какие версии прошивки крейта у Вас? Если ниже последней (3.0.0.17), то лучше обновить.
Каких-то специальных требований, кроме необходимости обеспечить непрерывный поток данных в соответствии с настроенной частотой сбора. В остальном требования такие же как и с другими сетевыми устройствами со статическим IP-адресом. Хотя конечно полностью исключать какие-то проблемы с совместимостью с работой какого-либо сетевого оборудования нельзя...
А как именно у Вас организована сеть у клиента? Что отвечает за разделение сетей? Есть там NAT и если да, настроен ли проброс портов и каким образом и т.д. Также вопрос наличия другого трафика, не может ли возникать полная загрузка канала другим трафиком в этой сети?
Также на всякий случай следует проверить отсутствие пересечения IP адресов других устройств с адресами крейтов в сети клиента.
Есть ли возможность записать на ПК клиента обмен данными с помощью программы вроде Wireshark и прислать нам?
Выглядит несколько странно, тогда чтобы проверить, вопрос это именно Вашей сборки прошивки из исходников или в чем-то еще, можете попробовать на уже собранной (правда gcc) версии прошивки BlackFin отсюда: http://lcard.ru/download/l502-bf.ldr - будет ли с ней переполнение.
Да и под функцией загрузки прошивки Вы все же имели ввиду X502_BfLoadFirmware?
Тип сборки в VisualDSP был Release?
Настройка шлюза требуется только в том случае, если у Вас крейт и ПК с ltrd (ну или ПК с ltrd и ПК с программой сбора данных, если они разные) находятся в разных сетях (т.е. в IP адресе старшие части адреса, отвечающие за сеть, у ПК и крейта отличаются). В этом случае т.к. устройство не может напрямую послать пакет в другую сеть, оно шлет его по указанному адресу шлюза для дальнейшей передачи. Для крейта адрес шлюза задается в его сетевых настройках, как и его IP-адрес. В LTR Manager для их изменения нужно нажать правой кнопки мыши на подключенном крейте и выбрать пункт "Сетевые настройки" (до версии прошивки 3.0.0.17 доступен только при подключении по USB). Для ПО на ПК адрес шлюза определяется сетевыми настройками самого ПК.
Но опять же в локальной сети настройка шлюза не требуется, а если Вы работаете в разных сетях, то без нее по идее и работать не должно.
Поэтому сильно сомневаюсь, что проблема как-то с этим связана.
А если запускать просто в параллель несколько консольных примеров, с измененными настройками на Ваши, то проблема будет проявляться?
У Вас правда два раза присутствует LTR212 и нет LTR12 в списке скоростей и у LTR212 ближайшая частота около 150, но в общем в любом случае трафик от этих модулей даже при максимальных настройках меньше 100 МБит/с, а если скорость около 100 отсчетов в секунду, то существенно меньше. Для LTR114 и LTR212 передается 2 слова (8 байт = 64 бита) на отстчет, у LTR12 - 1 слово (4 байта = 32 бита). Если стоит LTR Manger, то можно также в нем посмотреть при скорость приема в словах в секунду.
Здравствуйте.
Для начала нужно понять:
1. Влияет ли режим работы с DSP на переполнение, т.е. если оставить тот же код, но включать режим работы с FPGA, то проблема остается?
2. Влияет ли сам код Вашей программы, т.к. если какие-то действия после завершения Recv до следующего его вызова выполняются дольше, чем собственно время, за которое выполняется преобразование принимаемого за блок кол-ва точек, то данные будут забираться медленнее, чем передаваться модулем, что в конце концов приведет к переполнению буфера. Можно взять консольный пример, и посмотреть на нем, изменив настройки модуля на используемые у Вас, а затем также добавив загрузку прошивки DSP.
Да, описанный подход возможен и используется (в той же LMS открытие и настройка модулей выполняется при загрузке эксперимента, а запуск сбора/генерации данных уже при нажатии кнопки запуска, которая может быть нажата сильно позже). ltrd не закрывает соединения с клиентом даже если обмена не было долгое время.
По поводу описания передачи данных, то в принципе корректно, только во фразе:
Для LTR114 единица данных, насколько я понял - это данные только с одного из всех каналов, которые мы опрашиваем.
Для LTR27 единица данных - это полноценный кадр, то есть, грубо говоря, снимок данных со всех 16 физ.каналов модуля/сабмодуля.
Для LTR51 единица данных - это параметры частотного сигнала {N,M}, которые генерятся с частотой F_Base.
не совсем понятно, что имеется ввиду под "единица данных". Единицей передачи данных независимо от модуля является 32-битное слово (которые принимаются в LTRxxx_Recv()). Отличие в том, что в LTR114 во первых одному отсчету соответствует 2 слова, во вторых, так как это модуль с коммутацией каналов и измерения происходят последовательно, то он передает по одному отсчету (2 слова), как только очередные данные будут готовы, т.е. данные будут передаваться по два слова равномерно с частой АЦП. В LTR27 одному отсчету соответствует одно слово, при этом в этом модуле каналы АЦП работают параллельно и модуль сразу выдает все 16 слов (по одному отчету на канал) раз в заданный период дискретизации АЦП. В LTR51 передача идет аналогично LTR27, но одному отсчету соответствует два слова, со значениями M и N. Но все это передается в общий буфер и при передаче в ПК один кадр даже переданный одновременно от модуля, как для LTR27? может быть разбит например на разные пакеты TCP, в середину кадра попасть данные другого модуля если придут в момент передачи слов кадра и т.п.
a) идея в принципе правильная, правда при передаче по Ethernet это все немного сложнее. Корректнее сказать, что данные поступают в общий буфер в крейте, прошивка процессора крейта на сколько я помню раз в 1 мс проверяет наличия новых данных в FIFO и при их наличии ставит их на передачу по интерфейсу, в Вашем случае через TCP по Ethernet. Далее уже действуют алгоритмы передачи самого TCP, на которые влияет реализация TCP с обоих сторон соединения, в частности Алгоритм Нейгла (данные передаются либо когда все отправленные были подтверждены другой стороной, либо накопился целый новый пакет для отправки по TCP), подверждения от ПК так же могут при этом быть отложены и не переданы сразу (delayed ACK) и т.п.
б) Если говорить о задержках в модулях и в крейте до попадания данных в FIFO буфер крейта, то тут они будут либо фиксированы для каждого типа модуля, либо иметь небольшой дребезг, но явно они не измерялись для каждого режима работы каждого модуля. Но они не должны превышать единиц мс и остальные факторы по идее должны иметь большее значение при обработке данных на ПК.
в) Задержки в сети измерить выглядит не так просто, если под ними подразумевать не только физическое время передачи пакета, но и задержки в планировании отправки пакетов сетевого стека с обоих сторон соединения. Про ltrd так, но опять же ОС общего назначения вполне имеет право вносить задержки при переключении задач на выполнения ltrd, при передаче программе сигнала готовности данных принятых по сети в сокете и т.п., и они в общем случае не нормированы, хотя и в частном случае малозагруженной системы могут быть минимальными
г) помимо буфера ltrd нужно иметь ввиду, что обмен ltrd с клиентом также выполняется через локальные сокеты, у которых тоже есть свой внутренний буфер. Если в нем есть место, то ltrd сразу принятые слова записывает в сокет на передачу клиенту и они в собственно буфере данных модуля в самом ltrd не задерживаются. Заполняться буфер будет в том случае, если сокет клиента не может принять на передачу данные из-за того, что его буфер заполнен. Таким образом действительно, если клиент своевременно откачивает данные, то этот буфер должен быть пуст или минимально заполнен.
В теории (если это действительно нужно, см. дальше) определить число готовых к приему слов по статистике можно, но если использовать счетчик принятых от модуля слов (wrd_recv). Т.е. можно перед LTRxxx_Start() прочитать это значение, далее с учетом того, что по крайней мере для используемых у Вас модулей, по вызову Start происходит посылка одной команды с одним ответом (для LTR114 предполагается, что начальная калибровка уже выполнена до старта), то прибавить к этому числу 1 и взять это значение за начало отчета. Далее проверяя статистику и вычисляя разницу между новым wrd_recv и взятым за начало отсчета, можно понять, сколько слов данных было принято от модуля. При этом нужно также завести счетчик принятых слов клиентом (т.е. Вашей программой) увеличиваемый при каждом успешном Recv на количество принятых слов. Соответственно разница числа принятых слов от модуля и принятых слов клиентом и будет числом принятых ltrd, но не считанных клиентом слов, т.е. той самой общей заполненностью буферов сокета клиента и буфера модуля в ltrd.
д) Подходы могут быть разные... С моей стороны самым простым и удобным является выделение под каждый модуль потока, и в нем реализовывать принцип, который и приводится в консольных примерах на модуль. Т.е. исходя из интервала обработки и настроенных частоты сбора и прочих настроек можно получить, сколько слов мы должны обработать за один цикл программы, а далее вызывается в этом потоке Recv на этот размер с заведомо большим таймаутом (время цикла плюс несколько секунд). В этом случае при корректной работе Recv ожидает заданное число слов и как только они дойдут до клиента, Recv вернет управление (по сути то, что Вы пытаетесь сделать). Таймаута функция при штатной работе не дожидается (т.к. завершение работы функции выполняется по тому событию, которое было первым - пришло нужное число данных или истек таймаут), и служит только как указание через сколько выйти из функции в случае каких-либо ошибочных ситуациях, и завышенное значение негативно на нормальную работу не влияет. Далее уже идет ProcessData, возможно какая-то своя обработка и далее при необходимости передача полученного блока данных за цикл в другой поток для обработки/сохранения в зависимости от задачи. После переход к новому циклу ожидания. В этом случае время цикла обработки определяется временем прихода нужного числа данных, нет требования измерять время или заполненность буфера вручную и если время обработки меньше времени цикла, то гарантирует своевременную откачку данных. Так как на каждый модуль свой поток, то то, что он спит, ожидая новую порцию данных внутри Recv, не является проблемой, все равно ему нечего выполнять, пока нет новых данных. Если есть желание принимать данные всех модулей в одном потоке, тогда общий поток не должен зависать в Recv, тогда имеет смысл получать число непрочитанных слов через статистики описанным выше методом, а при потоке на модуль не уверен в целесообразности этого...
e) ну тут опять же зависит от Вашей программы, если как описано выше Recv используется для ожидания новых данных, то таймаут может быть взят с большим запасом на несколько секунд больше интервала сбора и это ничему не вредит, в варианте со статистикой он может быть и небольшим (в пределах секунды или десятков/сотен мс), тут только задержки самой ОС могут влиять, хотя опять же увеличение его не влияет негативно на штатную работу.
а то, что в ltr114_metr программе нельзя одновременно измерять напряжение и сопротивление - это просто ограничение программы или действительно есть какие-то ограничение на "смешанное" измерение?
Это ограничение конкретной программы, т.к. она в первую очередь предназначена для поверки модуля, а в ней поверка при измерении напряжения и сопротивления проводятся отдельными этапами. В другом ПО, вроде LMS, или при написании своей программы, Вы можете использовать одновременно часть каналов под измерения напряжения, а часть под измерения сопротивления, с тем лишь учетом, что физически канал измерения сопротивления занимает контакты под два канала измерения напряжения (n и n+16).
Из руководства пользователя LTR:
LTR114 реализует следующие возможные соотношения количеств каналов измерения напряжения/сопротивления : 16/0, 14/1, 12/2, 10/3, 8/4, 6/5, 4/6, 2/7, 0/8 (естественно, меньшие количества каналов измерения в перечисленных парах тоже реализуемы).
Здравствуйте.
Вы вроде сами приводите порядок вызова функций, поэтому не совсем понятно, как у Вас может вызываться Stop лишний раз или без Start. Корректная работа с модулем подразумевает, что Stop вызывается на успешно выполненный Start один раз, другое использование нештатное и для определенных типов модулей действительно Stop во время не запущенного сбора приводит к такой ошибке.
Если данные не вычитывать и они заполнят весь буфер, то далее из-за отсутствия места станут отбрасываться, если вызвать Stop в этот момент, то так как команды и данные передаются в LTR общим потоком для модуля, то ответ на Stop может быть отброшен из-за отсутствия места в буфера, что может привести к подобной ошибке. Но переполнение это не штатная ситуация, которая при нормальной работе не должна возникать.
Также если используете несколько потоков, то функции, относящиеся к одному модулю (одном описателю) должны вызваться всегда последовательно, т.е. либо из одного потока, либо если из разных, то необходимо гарантировать, что вызываются не одновременно. Если например идет прием и обработка в одном потоке, то нельзя для этого же модуля вызвать просто так Stop или Close из другого потока, нужно вызывать либо из того же потока, либо подавать сигнал для выхода из потока, дождаться его завершения, и только потом уже вызывать Stop из другого.
При корректной последовательности вызовов и штатной работе подобных проблем при вызове Stop возникать не должно. Выполнять вызов последовательности функций правильно целиком в Ваших руках, а переполнение буфера это в общем нештатная ситуация, которая по хорошему требует перезапуск сбора или вообще целиком модуля (Close/Open).
Чтобы проверить, что при корректной последовательности вызовов все нормально работает, можете просто запустить параллельно по примеру на каждый модуль отдельными программами, просто поменяв настройки на нужные.
Здравствуйте.
5022 Ом в Вашем случае это значение, соответствующее максимальному коду АЦП, переведенное в Ом с учетом калибровочных коэффициентов конкретного модуля. Оно выше номинального диапазона (4000 Ом), т.к. у модуля есть свой запас диапазона (вне номинального, где технически сигнал еще в пределах измерения АЦП, но погрешность не гарантируется). Т.е. по сути это соответствует зашкалу АЦП (превышение верхнего предела измеряемого сигнала).
Следует учитывать, что в случае оборванных входов, значение измеряемого сигнала в случае LTR114 в принципе не определено и Ваше предположение, что оно должно быть 0 не верно, подробнее об этом описано тут: https://www.lcard.ru/support/faq/nc_inp_drift_adc . Поэтому оно может быть как зашкал за верхнюю границу измерения (5022 Ом в Вашем случае), за нижнюю границу (0 Ом), так и в принципе в пределах действительного диапазона. В том числе это вполне может для АЦП с коммутацией каналов зависеть от порядка и параметров измерения опрашиваемых каналов, как и от частоты переключения каналов (тут еще вопрос, все ли отсчеты Вы выводите на больших частотах, возможно просто этот процесс не виден, если отображается только один отсчет за период). Но в любом случае, нельзя рассчитывать на конкретное значение измерения при не подключенных входа LTR114 (у модуля есть отдельно функция проверки обрыва линий, но при остановленном сборе).
По поводу сбора на низкой частоте или на высокой, но с программным усреднением, то это справедливо, если речь идет об АЦП без встроенных фильтров (например LTR11). В этом случае с точки зрения шумов действительно лучше принимать на максимальной частоте сигнал и далее выполнять усреднение или полноценную фильтрацию. Но уменьшение частоты для АЦП с коммутацией каналов увеличивает время между переключением каналов и соответственно увеличивает время на установление входного сигнала (оно должно быть достаточно, чтобы сигнал установился после переключения каналов, что зависит в том числе от характеристик источника сигнала). Во вторых уменьшение частоты уменьшает поток данных, что может быть Важно при большом числе каналов, как с точки зрения пропускной способности канала передачи данных, так и объема вычислений и т.п.
В LTR114 же используется АЦП с встроенным фильтром, частота среза и характеристики которого также меняются с уменьшением частоты АЦП (подробнее см. в главе 18 руководства https://www.lcard.ru/download/ltr.pdf). Для 5 Гц в частности наибольшее подавление фильтра находится в окрестностях частоты 50 Гц, для подавления влияния сетевых помех. Поэтому понижение частоты АЦП для LTR114 в общем случае должно давать лучшее подавление помех, чем простое усреднение, поэтому
По поводу времени опроса тут могут быть свои тонкости. Во первых нужно учитывать, что сам таймер в ОС общего назначения может срабатывать с задержкой (хотя если он отсчитывается от начала сбора, а не от предыдущего срабатывания, это может быть не так важно), во вторых частота ПК на основе которой срабатывает таймер будет отличаться от частоты крейта, что может приводить к тому, что он будет чуть реже срабатывать и вычитывать данные будут чуть медленнее, чем генерироваться данные, что при длительной работе может привести к накоплению буфера и приему не последних данных.
Здравствуйте.
Да, для L-502/E-502/E16 используется другая библиотека. Ее подробное описание приведено тут: https://www.lcard.ru/download/x502&e16api.pdf
По поводу установки библиотеки, то пакеты устанавливаются аналогично lcomp, только требуемый пакет libx502api1-devel и его зависимости. Драйвер для E-502 не требуется, так как работа по USB под Linux идет через стандартную библиотеку libusb-1.0, а Ethrenet в принципе драйверов не требует. Установка под Linux описана в пункте 2.1.7 руководства программиста.
Примеры есть на сайте на странице https://www.lcard.ru/support/developer в разделе E-502/L-502, там есть два консольных примера под msvc/gcc:
Ввод - https://www.lcard.ru/download/examples/ … m_read.zip
Циклический вывод - https://www.lcard.ru/download/examples/ … le_out.zip
Также в исходных кодах библиотеки можно дополнительные примеры использования посмотреть: https://gitlab.com/l-card/acq/devices/x … type=heads
По поводу Вашей задачи я не до конца понял про мертвое время и запуск каждую секунду на 2 секунды. Но думаю что Вам нужно смотреть в сторону запуска постоянного потокового ввода одновременно данных АЦП и цифровых линий и по данным цифровых линий определять момент фронта PPS и привязывать к нему данные АЦП и уже делить на файлы и изменять данные в соответствии с задачей. Режимом именно запуска сбора по сигналу синхронизации у Вас вряд ли получится, т.к. во-первых синхронизация запуска АЦП и ЦАП идет по одному условию, а у Вас ЦАП если я правильно понял должен генерировать сигнал непрерывно и на том же модуле, а во-вторых иначе у Вас будут теряться данные во время перезапуска сбора, а у Вас время записи на 2 секунды по сути на два блока непрерывного сбора, и не понятно как гарантировать, чтобы перезапуск успел до прихода следующего PPS.
SendDebugMsg посылает по Ethernet UDP пакет с текстом отладочного сообщения.
Эти сообщения можно посмотреть утилитой под Windows: http://www.lcard.ru/download/ltr_udp_monitor.zip, ну либо самостоятельно перехватывать эти UDP сообщения
Штатно без JTAG других отладочных средств нет, если только самостоятельно свои отладочные команды по USB/Ethernet добавлять.
Функция SetLDeviceEvent реализована только в Windows-версии библиотеки lcomp.
Для Linux если только вручную отслеживать по позиции в буфере, когда будет принято нужное число отсчетов, после чего перезапускать сбор.
Да, сейчас действительно в примере на консоль выводятся только указатель на заполненность буфера (первое число) и завершение сбора (второе), а данные просто пишутся в файл в отдельном потоке (thread_func). Данные в бинарном файле по два байта на отсчет, формат описан в главе 3.2.1 документа https://www.lcard.ru/download/e14_440_p … _guide.pdf .
Также необходимо установить настройки АЦП в соответствии с вашим подключением сигналов ко входам АЦП, в частности тут задается опрос каналов:
adcPar.t1.NCh = 4;
adcPar.t1.Chn[0] = 0x0;
adcPar.t1.Chn[1] = 0x1;
adcPar.t1.Chn[2] = 0x2;
adcPar.t1.Chn[3] = 0x3;В данном случае опрашиваются первые 4 канала в диф. режиме, диапазон 10 В, формат параметров опроса канала (Chn) описан в 3.2.3 в том же документе (или в lcomp.pdf windows-версии).
В смысле если посмотреть бинарные данные из записываемого файла, например через
xxd test.dat | lessто будут одни только нули?
Здравствуйте.
Да, обновить можно через LTR Manager. Крейт должен быть подключен по USB. Обновление по Ethernet добавлено только начиная с версии прошивки 3.0.0.16.
Для восстановления прошивки можно выполнить долгое нажатие потайной кнопки RESET на задней панели LTR-EU-2, тогда запустится не рабочая прошивка, а загрузчик, через который можно записать основную прошивку по USB штатным образом через LTR Manager (он будет видится как обычный крейт, но без модулей). Ну если только в своей прошивке Вы не затрете область энергонезависимой памяти, где хранится загрузчик, но это нужно специально постараться сделать.
Поправил ту часть библиотеки, где была зависимость от размера страницы. Выложил на сборку пакетов (версия 1.58.3). Теперь вроде падать не должно и ведет себя корректно (правда данные не проверял). Как будет возможность, проверьте, отпишитесь.
Также пример обновил, там главным образом включение проверки ошибок всех функций, чтобы лучше понимать, что не выполнилось
Судя по всему проблема из-за некорректной работы библиотеки/драйвера при нестандартном размере страницы памяти (на RPi5 перешли на 16384 вместо стандартной 4096). Там действительно при выделении буфера (в функции RequestBufferStream) есть место, где есть зависимость от этого размера, поэтому у Вас она и завершается с ошибкой и буфер не выделяется и реально указатель возвращается нулевой и далее уже пример падает при попытке обращения по нему.
У нас на одноплатных ПК на arm везде размер 4096 и все работает корректно. На следующей неделе надеюсь будет возможность попробовать именно на RPi5 и поправить работу.
Пока можете попробовать запустить версию ядра со старым размером страницы, насколько я понял это возможно задав "kernel=kernel8.img" в файле настроек /boot/firmware/config.txt (добавив строку или заменив, если уже есть kernel=).
И можете также вывести результат RequestBufferStream - заменить
pI->RequestBufferStream(&size);
cout << " alloc size " << size << endl;на
err = pI->RequestBufferStream(&size);
cout << " alloc size " << size << " err " << err << endl;А можете привести вывод при вызове из командой строки:
getconf PAGESIZEА также сделать
sudo dmesg -c до запуска примера и после и если появятся какие-то сообщения в выводе после, то тоже их привести.
Адрес: 117105, Москва, Варшавское шоссе, д. 5, корп. 4
Многоканальный телефон:+7 (495) 785-95-25
Письма и запросы: lcard@lcard.ru
Отдел продаж: sale@lcard.ru
Техническая поддержка: support@lcard.ru
Время работы: с 9-00 до 19-00 мск