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


Загрузка ЦП при сборе данных с L791

Вы не вошли.

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

Александр
20.02.2012 08:31:21
#1

Гость

Загрузка ЦП при сборе данных с L791

Добрый день.Работаем с АЦП L791 и возникла следующая проблема. При потоковом сборе процессор Pentium E6600 загружен на 100%. Собираем в потоке с двух плат по 16 каналов на каждой плате.
LGraph нагружает процессор на 28% при тех же характеристиках. Хотелось бы узнать есть ли какие то особенности при сборе данных с АЦП в потоке. Программа написана на C++ Builder XE, у каждой платы свой буфер и свои уникальные параметры.Частота опроса 2Кгц на канал.
Вот собственно поток сбора данных.
P.S. если собирать половинками буфера результат тот же.
void LCard791::Run(void)        //поток сбора
{
    Num=0;                   //Cчетчик собранных частей (1/16 половинки)
    int halfbuffer=(IrqStep*pages)/2;      //вот столько измерений в половинке
    part = halfbuffer/256;                //а вот столько в 1части    //было 64

    while (collect)
        {
            if (sync[I_ADC_PCI_COUNT_L791]<=halfbuffer)                         //указатель в 1й части буфера
             {
                int q=0;                                            //счетчик собраных частей внутри одной половинки
                while ((sync[I_ADC_PCI_COUNT_L791]<=halfbuffer)&&collect)
                {
                    if(sync[I_ADC_PCI_COUNT_L791] > (q+1)*part)     //если частичка уже собралась
                    {
                        memcpy(&Base[part*Num],&data[q*part],sizeof(ULONG)*part);//то копируем ее в большой буфер
                        q++;
                        Num++;
                    }
                }
             }
             else    //указатель во второй части буфера
             {
                 int q=0;
                 while ((sync[I_ADC_PCI_COUNT_L791]>halfbuffer)&&collect)
                 {
                    if(sync[I_ADC_PCI_COUNT_L791] > halfbuffer+((q+1)*part) )   //если частичка  уже собралась
                    {
                        memcpy(&Base[part*Num], &data[halfbuffer+(q*part)], sizeof(ULONG)*part);//то копируем ее в большой буфер
                        q++;
                        Num++;
                    }
                 }
             }
        }
    Index=part*Num;              //всего данных
    ProtocolForm->SendToProtocol("Данных собрано "+UnicodeString(Index));
}

20.02.2012 11:00:53
#2

Сотрудник "Л Кард"
Откуда: Москва
Здесь с 23.04.2014
Сообщений: 3,727

Re: Загрузка ЦП при сборе данных с L791

ну как бы отдавать надо в потоке Sleep-ом. Посмотрите как примерах..

20.02.2012 11:09:28
#3

Сотрудник "Л Кард"
Здесь с 18.04.2014
Сообщений: 810

Re: Загрузка ЦП при сборе данных с L791

Любой цикл, не содержащий вызвов API, ставящих поток в состояние ожидания (WaitForSingleObject, WaitForMultipleObjects, Sleep и т.д.), будет потреблять 100% времени процессора/ядра, на которм выполняется поток. Операционная система не может отличить for (;;) { } от важной работы - раз поток не отдает управление, значит, он занят интенсивными вычислениями.
Будет работать только вытесняющая многозадачность.

Так что, условно говоря, ожидание способом
volatile int event_flag;
...
while (!event_flag);
это 100% CPU
WaitForSingleObject(hEvent, Timeout) - это 0% CPU (бездействие системы), но нужен механизм генерации события.
Если событие не сделать, то на худой конец
while (!event_flag) Sleep(немножко);

http://en.wikipedia.org/wiki/Busy_waiting

Александр
20.02.2012 11:46:30
#4

Гость

Re: Загрузка ЦП при сборе данных с L791

Спасибо за оперативный ответ.Понял свой косяк.

Контакты

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

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

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

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