Меню
+7 (495) 785-95-25
sale@lcard.ru
sale@lcard.ru
Страницы 1
|
||||
|
Архитектура построения ПО для съема данных с двух АЦП LTR24Здравствуйте!
А вот код функции которая вызывается из главного потока:
Возникает странная вещь. Критическая секция csr используется для того чтобы гарантировать непрерывность цикла съема плюс копирование относительно функции из главного потока. Но лог файл показывает что при вызове функции главного потока возникает задержка то есть поток съема успевает несколько раз занять/освободить csr прежде чем основной поток таки войдет в эту критическую секцию и установит все необходимые атрибуты для копирования. Я понимаю что у меня в потоке съема задержка составляет порядка 70 мс (накапливается 4096 отсчетов при частоте дискретизации LTR24_FREQ_58K). Может кто - нибудь сталкивался с похожей задачей и можно как то более элегантно выйти из положения чем городить то что я нагородил? Или может быть проблема в потоке логгирования? Каждый вызов WriteLnProtocolIndirect содержит внутри вход в критическую секцию и ее освобождение в конце функции. Прошу прощения за длинну кода, буду рад Любой Информации. Может быть есть какие - то примеры кода как правльно делать подобные вещи для данного АЦП ??? |
|||
|
||||
|
Re: Архитектура построения ПО для съема данных с двух АЦП LTR24Привожу участок лог-файла после вызова функции основного потока Хорошо видно что поток съема успевает несколько раз занять и осовободить критическую секцию csr прежде чем основной поток наконец в нее войдет. Как это понимать? И что с этим можно сделать ? |
|||
|
||||
|
Re: Архитектура построения ПО для съема данных с двух АЦП LTR24Добрый день. Ну полностью Вашу программу разобрать нет возможности, это несколько выходит за рамки техподдержки. Вообще говоря, при работе с несколькими потоками, всегда стараются минимизировать время, когда будет захвачен примитив синхронизации. Так что у Вас все выполнение цикла (включая прием данных с АЦП) захвачена критическая секция делать не очень правильно, по сути Вы почти полностью теряете всю пользу от второго потока. Защищать примитивами синхронизации имеет смысл только момент обращения к общим ресурсам - посылку/проверку запроса на копирование и перекладывание данных, и уж точно исключить из этого момент сбора данных с самого модуля. А сам подход к организации такого сбора может быть очень разный. Я бы, если правильно понял Вашу задачу, вообще бы скорее всего не использовал критические секции, а ограничился бы двумя событиями - запрос на сохранения данных от основного потока к потоку сбора и указание о завершении сохранения блока от потока сбора к главному. В основном же потоке: Т.к. поток сбора использует общий буфер только после события от основного и до установки своего события, а основной поток использует его только после установки события потока сбора о завершении копирования и не устанавливает свое событие до завершения обработки, то в данном случае уже гарантируется разделение времени доступа к буферу. Основной поток при этом блокируется (хотя он тоже на пункте 4 может выполнять и другую работу, просто проверяя событие) на время ожидания перекладывания одного буфера при запросе, а поток сбора данных вообще не блокируется. |
|||
|
||||
|
Re: Архитектура построения ПО для съема данных с двух АЦП LTR24Здравствуйте, Алексей! |
|||
|
||||
|
Re: Архитектура построения ПО для съема данных с двух АЦП LTR24По событиям - да. Вы либо если не нужно делать никаких действий вызываете WaitFor с большим таймаутом, либо, если нужно только проверить, и выполнять свою работу, то делате WaitFor с минимальным таймаутом (как правило для этого может быть использован нулевой таймаут, чтобы только проверить и не ждать cовсем). В любом случае нужно проверить результат на равенство wrSignaled, чтобы убедиться, что событие было установлено. По поводу после, тогда во первых по пункту 3, если событие установлено, то после сброса принять блок и уже его сохранять, а не предыдущий, тогда будет скопирован блок, принятый уже после события. |
|||
|
||||
|
Re: Архитектура построения ПО для съема данных с двух АЦП LTR24Алексей, Спасибо! Все понял, буду переделывать. |
Страницы 1
Адрес: 117105, Москва, Варшавское шоссе, д. 5, корп. 4, стр. 2
Многоканальный телефон:
+7 (495) 785-95-25
Отдел продаж: sale@lcard.ru
Техническая поддержка: support@lcard.ru
Время работы: с 9-00 до 19-00 мск