Форум: Техническая поддержка

Тема: Ввод по ПДП в новой библиотеке

Вы не вошли.

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

Андрей
03.04.2002 19:42:07
#1

Гость

Ввод по ПДП в новой библиотеке

Использую Celeron 733 под W98, программа на C++ Builder 3, использую новую библиотеку.
Необходимо ввести данные в течение 30 секунд с 13 каналов с частотой 10 кГц. Однако при увеличение времени более 4 сек (приблизительно) получаю ошибку.
Экспериментально установил, что это происходит при числе страниц до 512 (pages) все нормально, при этом значение FIFO установлено в 1024. Значения g_adcPar.FIFO = 512, g_adcPar.Pages = 1024. Если же увеличить число страниц (увеличением времени считывания) получаю ошибку, при этом FIFO = 1024, pages = реальному значению, а значения g_adcPar.FIFO и g_adcPar.FIFO какие-то непонятные.
Вот текст программы ввода:

DEV_REG_UNI g_dev;
double fRate=10.0;
WORD fifo=1024;

g_dev.size=sizeof(DEV_REG_UNI);
OpenLDevice(0,&g_dev);
LoadBios(&g_dev,"lbios11");
SetSpeedADSP_1251 (&g_dev, 0);

DWORD* sync;
ADC_PAR g_adcPar;
WORD* dataQW;
DWORD g_dwBufferSizeQW1 = 0;
int nNumChannelsQW=13;
WORD pChannelsQW[]={0,1,2,3,4,5,6,7,8,9,10,11,14};
int nMilliSecondsQW = 4050;
g_adcPar.size=sizeof(ADC_PAR);
double chfrQW = fRate*(nNumChannelsQW+1);
double kadr = 1/fRate;
int wTotalCountQW=int(((nMilliSecondsQW/kadr)+1)*nNumChannelsQW);
DWORD pages = wTotalCountQW/fifo;

FillADCparameters_1251(&g_adcPar, &chfrQW, &kadr, 0,0,0,0,nNumChannelsQW,pChannelsQW,fifo,fifo,pages);
g_adcPar.AutoInit = 0;
g_dwBufferSizeQW1=(wTotalCountQW*4096+1)/4096;
RequestBuffer(&g_dev,&g_dwBufferSizeQW1);
SetParameters(&g_dev, &g_adcPar, &g_dwBufferSizeQW1, &dataQW, &sync);
DWORD halfpages = g_adcPar.FIFO*g_adcPar.Pages/2;

InitStartLDevice(&g_dev);
StartLDevice(&g_dev);
while(*sync!=2*halfpages);
StopLDevice(&g_dev);

//Преобразование в формат (-5,12...+5,12)В
float d;
float *DataAllN1=new float[g_dwBufferSizeQW1];
for(unsigned int n=0;n<g_dwBufferSizeQW1;n++)
{
  if(dataQW[n]>32678)
  d = dataQW[n]-65536;
  else
    d = dataQW[n];
  DataAllN1[n] = d*5.12/2048;
}
CloseLDevice(&g_dev);
...

04.04.2002 08:50:15
#2

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

Re: Ввод по ПДП в новой библиотеке

А ощибка то в каком месте возникает и какая?

Андрей
04.04.2002 19:35:36
#3

Гость

Re: Ввод по ПДП в новой библиотеке

Ошибка появляется на первой же итерации цикла сбора данных, похоже при сравнении *sync!=2*halfpages.
Вот дословно (если это может помочь):
Access violation at address 004044C9 in module /'MAIN_PROJECT.EXE/'. Read of address FFFC3508.

05.04.2002 08:43:38
#4

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

Re: Ввод по ПДП в новой библиотеке

А сколько памяти в RequesеBuffer запрашиваете.
Будет неплохо если пришлете консольное приложение
на C в котором у Вас это ошибка вылазит.

Андрей
09.04.2002 12:27:23
#5

Гость

Re: Ввод по ПДП в новой библиотеке

Poul, весь ввод данных описан мною в первом письме. Он выполнен в виде отдельной процедуры и никаких внешних переменных в эту процедуру не вводится.
Размер запрашиваемой памяти до команды RequestBuffer - 4294445234 (использую вышеуказанный текст программы), после - становится 383, после команды SetParameters - 11013931. Это если проходить по программе пошагово.
Если же ставить брейкпоинт сразу после команды RequestBuffer получаю 13, после команды SetParameters - 11015080.
Если ставить брейкпоинт после команды SetParameters вообще обнуляется...
Что бы это могло быть?

09.04.2002 16:06:19
#6

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

Re: Ввод по ПДП в новой библиотеке

Не ну RequestBuffer надо дать какое либо разумное число а не 4Г - столько он не в жизнь не выделит.
Ну 1000000 например.

Андрей
09.04.2002 18:30:33
#7

Гость

Re: Ввод по ПДП в новой библиотеке

Таким образом получается, что больше 4 секунд подряд я считывать с 13 каналов на 10 кГц не могу?
Если разбивать необходимые 30 секунд на несколько процедур считываний между ними определенно появяться пропуски, а это очень нежелательно. Что же делать?

И еще один вопрос. Если я "открыл" плату, загрузил в нее биос, подготовил все переменные, инициализировал их, произвел сбор данных, остановил сбор данных. После этого не "закрываю" плату и пытаюсь произвести еще один сбор данных.
Использую другие переменные, заново их инициализирую. При этом программа ИНОГДА зависает sad
Если я "закрываю" плату, а затем произвожу алгоритм описанный выше снова - все тип-топ. Однако появляются довольно большие паузы между сборами данных - на 10 циклов набегает ~ 2 секунд.

10.04.2002 08:34:39
#8

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

Re: Ввод по ПДП в новой библиотеке

Можно и 10М выделить - но это разумное число.Уж точно не больше озу установленного в компьютере.
Использовать циклический сбор как в пример к плате L7XX.TXT(AutoInit=1). Пришлите небольшой консольный пример с Вашим куском сбора данных где
проявляется зависание я посмотрю(консольный тк я не пользую C++ Builder).

Контакты

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

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

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

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