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


Запись в DM или еще о PLX 9050/9030

Вы не вошли.

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

Папа Карло
19.11.2005 01:00:45
#1

Гость

Запись в DM или еще о PLX 9050/9030

В момент загрузки биоса...
В Dos-совских примерах это аналогично 
LOAD_LBIOS_PLX
PUT_DM_ARRAY_PLX
PUT_DM_WORD_IO_PLX

В линуксовых
write_dm()

....
    for(i=0; i < n; i++)
    {    _outpw(base + IDMA_ADDR,addr+i);
         _outpw(base + IDMA_DATA, pdata[i]);

         _outpw(base + IDMA_ADDR,addr+i);
          tst[i] = _inpw(base + IDMA_DATA);
    }
....
   for(i=0;i<n;i++)
   {  if(tst[i] != pdata[i])
      {  printf("Приплыли:%i  %x != %x ",i, tst[i], pdata[i]);
   }

В результате имеем что-то вроде:
0  55 != a1
1  66 != 55
2  77 != 66
4  88 != 77

Т.е. при последовательной записи и чтении слова из DM читается содержимое из какой-то защелки, в котором сидит значение предыдущей записи

ущипните/укусите меня, скажите на какой странице доки написано, что так нельзя делать

Victoria
19.11.2005 10:21:48
#2

Гость

Re: Запись в DM или еще о PLX 9050/9030

В этом исходнике по крайней мере ошибка вот здесь
вместо
_outpw(base + IDMA_ADDR,addr+i);
_outpw(base + IDMA_DATA, pdata[i]);
надо бы
_outpw(base + 2,addr+i);
_outpw(base + IDMA_DATA, pdata[i]);
и соответственно далее так же.
Задание адреса для канала IDMA - по адресу base+2 (стр. 63) для любого из двух типа обмена.
Константа IDMA_DATA у Вас наверно в диапазоне BASE+4096 ... BASE+8192. Т.е. в области для быстрого обмена (ее специфика, и Вы это точно знаете - в автоинкременте адреса после очередной операции). Адрес для обмена Вы не задали (он какой-то произвольный оказался или по умолчанию), отсюда и эффект, который Вы наблюдаете.

Р.S.: все мои выводы только - по техническому описанию. Остальное - только в перспективных планах (и lbios для своих задач упростить и дополнить, еще лучше бы переписать на Си) и на Linux переехать. А так - только легкая модификация lbios и использование vxdapi для Windows. 
Удачи Вам!

Папа Карло
19.11.2005 14:14:07
#3

Гость

Re: Запись в DM или еще о PLX 9050/9030

Не, я работаю по стр 62 ;-)
и все строго:
#define IDMA_DATA 0x00
#define IDMA_ADDR 0x02

Взял с www.plxtech.com доку 9030db-14.pdf. Нифига в ней понять не могу, разглядел только что эти дивайсы обзываются pci bus accelerators, есть fifo буфер и prefetch.... вот как раз на это и похоже...
Дооптимизировался получается...и получил привет от полуоси и PLX... когда переключение засемафоренных ниток происходит быстрее одного outp()...
Тогда понятно, почему в боевой программе у клиента на боевой машине это происходит, а я на отладочной получить не могу - клиенту поставили проц помощнее...
С чего я взял про время одного outp() ?
Да в вышеописанном примере достаточно сделать
{
_outpw(base + IDMA_ADDR,addr+i);
_outpw(base + IDMA_ADDR,addr+i);
_outpw(base + IDMA_DATA, pdata[i]);

_outpw(base + IDMA_ADDR,addr+i);
_outpw(base + IDMA_ADDR,addr+i);
tst[i] = _inpw(base + IDMA_DATA);
}

чтобы все совпало.

Victoria
21.11.2005 08:09:38
#4

Гость

Re: Запись в DM или еще о PLX 9050/9030

Пардон, невнимательно посмотрела на константы.
>когда переключение засемафоренных ниток происходит быстрее одного outp()...
Это не очень понятно, но если уж экспериментировать, то почему бы не попробовать режим с автоинкрементом (загрузить всю область через 2-й способ, а потом прочитать также всю область для сравнения). Могу это кстати  и на своей плате попробовать (у меня, правда, L783 и выбор только между Windows  и Linux).

Папа Карло
21.11.2005 10:57:26
#5

Гость

Re: Запись в DM или еще о PLX 9050/9030

с автоинкриментом и надо использовать, но, поскольку идет разбор полетов (типа почему раз в 1-10-40 часов происходит "все пропало") то требовалось продемонстрировать наглядно.

т.е. если в одной нитке выполняется
_дождаться семафора_
_outpw(base + IDMA_ADDR,addr+i);
_outpw(base + IDMA_DATA, pdata[i]);
_сбросить семафор_  (1)

а в другой:
_дождаться семафора_
//вот тут оказываемся сразу после (1)
_outpw(base + IDMA_ADDR,addr+i);
rc = _inpw(base + IDMA_DATA);
_сбросить семафор_
то в rc оказывается совсем не то, что ожидается.

ну еще до кучи про странности и глюки - некоторые операции  и сам биос у меня грузится с автоинкриментом. Но, что касается загрузки биоса - иногда(обычно очень редко) загрузка не проходит. Долго не мог понять, потом сделал загрузку с проверкой (проверка - чтение с инкриментом) - оказалось действительно несовпадает... А тут в руках оказалась какая-то глючная плата, в которой после холодного старта загрузка происходит не с первого раза...может загрузится без ошибок, но какой-нибудь из тестов не проходит (т.е. биос не стартует) или же АЦП не запускается (прерывание не идет)... через какое-то время все начинает и грузится и работать... но в при загрузке в DM по адресу +1052 вместо нуля прописывается ffff !!!.. Хотя и этот эффект тоже пропадает.

Эффект, который описан в первом сообщении проявлялся не только на этой глючной плате.. т.е. проявлялся и на 780M и на 780...хм и почему-то не проявился на 761..надо будет посмотреть

Папа Карло
21.11.2005 17:18:44
#6

Гость

Re: Запись в DM или еще о PLX 9050/9030

чегой-то я совсем как Карабас-Барабас и сам себе злобный буратин в одном флаконе.

C 761 все точно так же.

Фефект исходного сообщения проявляется только когда я оптимизатор включаю. Внимательное разглядывание ассемблера для оптимизированного и неоптимизированного никаких особых различий не выявляет, разве что в оптимизированном два вывода в порт стоят почти рядом - через один mov

out dx, ax
mov...
out dx, ax

Victoria
21.11.2005 17:50:51
#7

Гость

Re: Запись в DM или еще о PLX 9050/9030

Два mov должно быть - один в dx, другой в ax.

Пока не могу на 783 проверить, компьютер меняю. Если хотите - листинг оптимизированный на этот пример опубликуйте.
У меня то субъективные ощущения, что если память (в данном случае PLX) поддерживает автоинкремент, то она умеет работать только в этом режиме (конечно, и через принудительное задание адреса тоже умеет, только хуже wink). 
Хотя - может все проще и только оптимизация виновата.