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


E20-10 и ECS + Core i5

Вы не вошли.

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

Сергей
22.12.2011 10:43:04
#1

Гость

E20-10 и ECS + Core i5

Помогите пожалуйста разобраться со следующей проблемой. Программа (в течение 22 мс пишет данные с внешней синхронизацией, следующие 22 мс выводит на экран), написанная на BC++ Builder 6.0 на основе примера из //E20-10//Examples//Borland C++ Builder 6.0//SynchroInput нормально работала на ПК Intel D945GTP + Pentium 4 2005 года выпуска со встроенной видеокартой. При переносе программы на ПК ECS + Pentium Core i5 четырех-ядерный 2011 года выпуска даже с видеокартой GeForce GT430 программа стала пропускать строки и выдавать сообщение "Не могу завершить сбор данных". В обоих случаях ОС Windows XP, DirectX 9.0c. Как отследить, что у ПК с четырех-ядерным процессором тормозит? Что вообще можно сделать в таком случае?

22.12.2011 11:22:43
#2

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

Re: E20-10 и ECS + Core i5

Потоки в программе используются?

Сергей
22.12.2011 13:11:49
#3

Гость

Re: E20-10 и ECS + Core i5

Да, конечно, потоки используются.

22.12.2011 14:12:45
#4

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

Re: E20-10 и ECS + Core i5

Если я не ошибаюсь, на многопроцессорных системах могут жестче проявляться недочеты в синхронизации потоков (race conditions). Не может быть дело в этом?

Сергей
22.12.2011 15:00:35
#5

Гость

Re: E20-10 и ECS + Core i5

Поток вывода на экран у мнея реализуется в ф-ии Synchronize(RedrawViewer);


void __fastcall TSynchroThread::Execute()
{
    //---- Place thread code here ----
    Synchronize(InitThread);
    if(!ThreadError) { if(!pModule->STOP_ADC()) ThreadError = true; }
    while(!Terminated && !ThreadError)
    {
        if(!pModule->ReadData(&IoReq)) { Mes = "Не могу послать запрос на сбор данных с модуля!"; Synchronize(ShowErrorMessageBox); break; }
        if(!pModule->START_ADC()) { Mes = "Не могу стартануть сбор данных!"; Synchronize(ShowErrorMessageBox); break; }
        if(!WaitingForIoRequestCompleted(&IoReq)) break;
        if(!pModule->STOP_ADC()) { Mes = "Не могу завершить сбор данных!"; Synchronize(ShowErrorMessageBox); break; }
        if(Terminated) break;
//        if(ModuleRevision == REVISIONS_E2010[REVISION_A_E2010]) DataCorrection();
        if(Terminated) break;
        Synchronize(RedrawViewer);
        Sleep(1); //было Sleep(300);
    }

    if(!pModule->STOP_ADC()) { Mes = "ÍНе могу завершить сбор данных!"; Synchronize(ShowErrorMessageBox); }
    if(!CancelIo(ModuleHandle)) { Mes = "Не могу прервать асинхронный сбор!"; Synchronize(ShowErrorMessageBox); }
    FreeResource();
    while(!Terminated) { Sleep(1); }
//было Sleep(50);
}

Работа программы с пропуском строк обычно заканчивается сообщением "Не могу завершить сбор данных!"

22.12.2011 16:39:53
#6

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

Re: E20-10 и ECS + Core i5

Что значит <<пропуск строк>>?
Есть ли в других потоках обращения к pModule?

Чему равен размер запроса IoReq (сколько мс он собирается при данной частоте дискретизации и размере кадра?)

Вообще-то лучше сделать двойную буферизацию (посмотрите топики от пользователя с ником MOT) - например, http://www.lcard.ru/forumthreads/10628 и ссылки оттуда.

Может быть, это поможет?

22.12.2011 18:03:40
#7

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

Re: E20-10 и ECS + Core i5

1. Двойная буферизация в данном случае не нужна, т.к. работа идёт в старт-стопном режиме. Именно поэтому и размер запроса IoReq не существенен.
2. Было бы интересно узнать какую именно ошибку возвращает функция STOP_ADC().
3. Чисто для проверки можно бы попробовать вообще убрать Synchronize(RedrawViewer) и посмотреть останутся ли ошибки выполнения функции STOP_ADC().

22.12.2011 18:14:14
#8

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

Re: E20-10 и ECS + Core i5

1. Виноват, не разлядел безусловный стоп.
2. pModule->GetLastErrorInfo(), плюс доступны исходники lusbapi.
3. Попробуйте... Вообще я бы для теста прогнал простую консольную программку в один поток, которая бы в цикле делала start-read-stop много раз с теми же параметрами, что в рабочей программе. Если ошибок не будет, то с драйвером и библиотекой, вероятно, все в порядке, и надо искать загвоздку в приложении.

Сергей
23.12.2011 09:24:11
#9

Гость

Re: E20-10 и ECS + Core i5

to Сергей
<<2. Было бы интересно узнать какую именно ошибку возвращает функция STOP_ADC().>>
Если после if(!pModule->STOP_ADC()){
вставить строки
pModule->GetLastErrorInfo(&LastErrorInfo);
Mes = IntToStr(LastErrorInfo.ErrorNumber);
то выдает число 419.

<<3. Чисто для проверки можно бы попробовать вообще убрать Synchronize(RedrawViewer) и посмотреть останутся ли ошибки выполнения функции STOP_ADC().>>
Убрал Synchronize(RedrawViewer).
Через такое же время выскакивает та же ошибка 419.

23.12.2011 10:01:28
#10

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

Re: E20-10 и ECS + Core i5

1. Попробую воспроизвести Вашу ситуацию у себя.
2. А какая ревизия у модуля? Какой чипсет мат. платы?

Сергей
23.12.2011 10:44:12
#11

Гость

Re: E20-10 и ECS + Core i5

<< 2. А какая ревизия у модуля? >>
Вопрос насчет A или B? - тогда B, 2011 года выпуска.
<< Какой чипсет мат. платы? >>
По идее Intel H67.
System Information:
Processor: Intel(R) Core(TM) i5-2300 CPU @ 2.80GHz
MotherBoard: H67H2-M3
BIOS: AMI version 2011/03/14
Operating System: Microsoft Windows XP 32bit.

23.12.2011 11:03:09
#12

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

Re: E20-10 и ECS + Core i5

Интересно, а в какой разъём подключается модуль E20-10: USB 3.0 или USB 2.0?

Сергей
23.12.2011 11:29:41
#13

Гость

Re: E20-10 и ECS + Core i5

<< Интересно, а в какой разъём подключается модуль E20-10: USB 3.0 или USB 2.0? >>
Опробованы все разъемы на плате - результат один. Отключал неиспользуемые USB концентраторы. Все то же. Было подозрение, что скорость работы USB на плате ECS недостаточна по сравнению с MotherBoard Intel D945GTP. Как измерить?
Сейчас модуль подключен к USB 2.0.

Сергей
23.12.2011 13:23:24
#14

Гость

Re: E20-10 и ECS + Core i5

<<2. Было бы интересно узнать какую именно ошибку возвращает функция STOP_ADC().>>
К тому же
if(!pModule->STOP_ADC()){
pModule->GetLastErrorInfo(&LastErrorInfo);
ErS = LastErrorInfo.ErrorString;
Mes = AnsiString((char*)ErS);
Synchronize(ShowErrorMessageBox);
break;
}
выдает сообщение:
Сообщение TSynchroThread::Execute()!
Ошибка выполнения функции TLUSBBASE::LDeviceIoControl(). Модуль не отвечает на запрос USB.

Контакты

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

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

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

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