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

количество половинок буфера больше двух

Вы не вошли.

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

25.11.2014 16:14:33
#1

Участник
Здесь с 24.10.2014
Сообщений: 26

количество половинок буфера больше двух

Здравствуйте,

подскажите пожалуйста, где можно прочитать про организацию большого кольцевого буфера подробно?

В описании

Устройство АЦП собирает данные в кольцевой буфер или FIFO, реализованный в ОЗУ сигнального процессора или микросхемы ПЛИС. При заполнении части буфера генерируется прерывание. Драйвер устройства по этим прерываниям вычитывает данные и помещает их в большой кольцевой буфер, реализованный в ОЗУ компьютера. Большой кольцевой буфер драйвера доступен пользовательскому приложению - имеется указатель на начало этого буфера. Кроме этого пользователю доступен счетчик заполнения буфера (тоже посредством указателя). Используя этот счетчик, пользователь может забирать данные из правильной части кольцевого буфера (т.е. из той, в которую драйвер уже записал данные)

ничего не сказано про половинки кольцевого буфера. При этом в прилагаемом к библиотеке примере они используются.

 unsigned long  s;
       InterlockedExchange (&s, *sync);
       
        // настройка флагов
        ULONG fl2, fl1 = fl2 = (s <= halfbuffer) ? 0 : 1;
        void * tmp, * tmp1;
   
        // цикл по необходимомму количеству половинок
        for (int i = 0; i < multi; i ++) {
            while (fl2 == fl1) {
                if (InterlockedCompareExchange (&complete, 3, 3)) 
	            return 0;
                InterlockedExchange (&s, *sync);
                // ждем заполнения половинки буфера
	        fl2 = (s <= halfbuffer) ? 0 : 1; 
                }
        
	    tmp1 = ((char *)data + (halfbuffer * fl1) * pointsize); 
	    // записываем данные в файл
	    //  memcpy (tmp, tmp1, halfbuffer * pointsize);
	    
	
	    InterlockedExchange (&s, *sync);
            // обновляем флаг
            fl1 = (s <= halfbuffer) ? 0 : 1;                 
            // если собираем медленно то можно и спать больше
	    Sleep (20);                                     
            } 

Например, у меня получилась длина большого кольцевого буфера - 30001152 слов. При этом количество страниц  IrqStep в кольцевом буфере PC равно 32, а сама переменная IrqStep определена как 32768, т.е. по этим данным получается длина буфера 1048576 - ровно (?!) в 28 раз меньше полученной длины кольцевого буфера. Как используется остальная часть кольцевого буфера?

Можно ли через счетчик *sync адресовать пространство буфера, не дожидаясь заполнения его частей (как это можно понять из описания)?

спасибо,

25.11.2014 17:21:21
#2

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

Re: количество половинок буфера больше двух

Я так понимаю Вы выделили память 30001152. А дальше Вы задействовали только ее часть 32 * 32768. Только эту часть и будет заполнять данными модуль. В пример данные забираются просто по  заполнению половины используемого буфера... (то одной, то другой). Если нужно использовать больший буфер, то увеличивайте параметры и pages и IrqStep. Больший буфер выделяется с запасом чтобы не делать перевыделение памяти при необходимости изменить pages и IrqStep. *sync меняется только в пределах pages*IrqStep.

ttooss
18.02.2015 11:34:16
#3

Гость

Re: количество половинок буфера больше двух

Здравствуйте!
Запутался с этими буферами, использую плату Е440.
Значение FIFO устанавливаю равным 4096, если ставлю 8192, то после вызова функции FillDAQparameters значение становиться 6144, почему?
Что значит шаг генерации прерывания (IrqStep)? Какое значение устанавливать?
Как влияет параметр Pages?
Если я хочу считывать определенное значение отсчетов (например: 10000), какие значения необходимо установить в поля FIFO, IrqStep и Pages?

18.02.2015 13:09:50
#4

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

Re: количество половинок буфера больше двух

6144 это максимум что плата может у себя внутри выставить. Просто запустите пример и дождитесь когда будет sync >10000. Тогда в буфере будет 10000 валидных отсчетов. Если нужно однократно,то AutoInt в 0.

ttooss
18.02.2015 14:24:13
#5

Гость

Re: количество половинок буфера больше двух

А какие значения необходимо установить в поля FIFO, IrqStep и Pages? Какой физический смысл данных переменных?

18.02.2015 15:11:41
#6

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

Re: количество половинок буфера больше двух

fifo - это половинка буфера в плате; irqstep - это то какими порциями драйвер забирает данные из платы. pages - множитель при задании кольцевого буфера в драйвере - irqstep*pages. Для начала оставить можно как в примере...

Контакты

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

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

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

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