|
|
Старые и новые версии SDK.
Есть работающая программа для L783M(работала под XP 32) соответственно использовался старый lcomp.exe lcomp.dll и L783.bio, захотелось использовать под W7 попробовали новый lcomp.exe теперь программа вылетает с BSOD пишет ошибка UNEXPECTED_KERNEL_MODE_TRAP в ldevpci.sys.
видимо старая программа не работает с новым SDK, возможно ли не изменяя программу заставить работать её с новым SDK? если нет, то что необходимо заменить?
|
|
|
Re: Старые и новые версии SDK.
Да еще дополнение, Lgraph вроде бы работает, пишет состояние платы Ok, драйвера тоже встают нормально.
|
|
- Сотрудник "Л Кард"
- Откуда: Москва
- Здесь с 23.04.2014
- Сообщений: 3,727
|
Re: Старые и новые версии SDK.
если W7 32 бита, то так и пользовать старый SDK. Если нет - то никак...
|
|
|
Re: Старые и новые версии SDK.
Дело в том, что после установки нового SDK, не удалось вернуться к использованию старого, путем удаления нового(штатными средствами uninstall) и установки заново старого.
видимо драйвер устройства и dll(lcomp.dll lcomp64.dll wlcomp.dll) из папки system32 надо удалять руками? возможно что то еще надо почистить?
Возвращаясь к предыдущему вопросу.
просто перекомпилирование программы не поможет, необходимо вносить измененияв программу, интерфейс существенно поменялся?
|
|
- Сотрудник "Л Кард"
- Откуда: Москва
- Здесь с 23.04.2014
- Сообщений: 3,727
|
Re: Старые и новые версии SDK.
Драйвера удалить руками. Просто перекомпиляция должна помочь(менялась размерность полей в структурах с USHORT на ULONG )...
|
|
|
Re: Старые и новые версии SDK.
Попробовал на чистой Win7 32, плата определилась, (старый драйвер встал) LGraph работает, но программа всё таки падает c BSOD.
Использовался драйвер ldevpci.sys от 17.04.2008 версия 6.0.0.0 (или 6.0.0.1) и lcomp.exe от 2 июня 2009 и lcomp.dll от 9 января 2008.
Видимо всё таки есть какое то различие между XP и Win7.
Насчет USHORT и ULONG посмотрю, спасибо.
|
|
- Сотрудник "Л Кард"
- Откуда: Москва
- Здесь с 23.04.2014
- Сообщений: 3,727
|
Re: Старые и новые версии SDK.
Тогда это не настолько старый... в readme.txt отражен факт смены размерности...
|
|
|
Re: Старые и новые версии SDK.
Вернулся опять к этой теме.
выяснил что структура ADC_PAR изменилась.
было
DAQ_PAR = object
public
s_Type : USHORT;
FIFO : USHORT;
IrqStep : USHORT;
Pages : USHORT;
end;
ADC_PAR = object (DAQ_PAR)
public
AutoInit : USHORT;
dRate : double;
dKadr : double;
dScale : double;
Rate : USHORT;
Kadr : USHORT;
Scale : USHORT;
FPDelay : USHORT;
SynchroType : USHORT;
SynchroSensitivity : USHORT;
SynchroMode : USHORT;
AdChannel : USHORT;
AdPorog : USHORT;
NCh : USHORT;
Chn : array [0..127] of USHORT;
IrqEna : USHORT;
AdcEna : USHORT;
end;
стало
ADC_PAR_0 = object (DAQ_PAR)
public
AutoInit : ULONG;
dRate : double;
dKadr : double;
dScale : double;
Rate : ULONG;
Kadr : ULONG;
Scale : ULONG;
FPDelay : ULONG;
SynchroType : ULONG;
SynchroSensitivity : ULONG;
SynchroMode : ULONG;
AdChannel : ULONG;
AdPorog : ULONG;
NCh : ULONG;
Chn : array [0..127] of ULONG;
// FIFO : USHORT;
// IrqStep : USHORT;
// Pages : USHORT;
IrqEna : ULONG;
AdcEna : ULONG;
end;
PADC_PAR_0 = ^ADC_PAR_0;
ADC_PAR_1 = object (DAQ_PAR)
public
AutoInit : ULONG;
dRate : double;
dKadr : double;
Reserved1 : ULONG;
DM_Ena : ULONG;
Rate : ULONG;
Kadr : ULONG;
StartCnt : ULONG;
StopCnt : ULONG;
SynchroType : ULONG;
SynchroMode : ULONG;
AdPorog : ULONG;
SynchroSrc : ULONG;
AdcIMask : ULONG;
NCh : ULONG;
Chn : array [0..127] of ULONG;
// FIFO : USHORT;
// IrqStep : USHORT;
// Pages : USHORT;
IrqEna : ULONG;
AdcEna : ULONG;
end;
PADC_PAR_1 = ^ADC_PAR_1;
ADC_PAR = record
case Integer of
0: (t1:ADC_PAR_0);
1: (t2:ADC_PAR_1);
end;
т.е. по сути поменялось USHORT на ULONG и ADC_PAR стало ADC_PAR_0.
пока еще не выяснил, что еще изменилось.
еще вопрос сейчас я использую ifc_ldev и ioctl из папки DELPHI, в старом чужом коде я использования этих файлов не нашел(только похожий код), этих файлов раньше не существовало?
|
|
- Сотрудник "Л Кард"
- Откуда: Москва
- Здесь с 23.04.2014
- Сообщений: 3,727
|
Re: Старые и новые версии SDK.
ворде существовали всегда. но можно и по другому их обозвать или переписать...
|
|
|
Re: Старые и новые версии SDK.
остановился на том, что SetParametersStream из ifc_ldev не выдает L_SUCCESS=0 или L_ERROR=2, а L_NOTSUPPORTED =1.
с чем это может быть связано? плата L-783M использую L783.bio.
все шаги до SetParametersStream проходят успешно.
из документации
Pascal: function SetParametersStream(var sp:DAQ_PAR; var UsedSize:ULONG; out Data;
out Sync; StreamId:ULONG):ULONG;
Параметры:
PDAQ_PAR sp - структура, которая описывает параметры ввода или вывода данных
( ADC_PAR,DAC_PAR или другая в зависимости от типа поля s_Type);
ULONG *UsedSize - переменная, в которой будет возвращено количество реально
используемой памяти (в отсчетах АЦП);
void** Data - переменная, в которой будет возвращен адрес начала большого буфера;
void** Sync - переменная, в которой будет возвращен адрес переменной синхронизации;
ULONG StreamId - дескриптор потока (L_STREAM_ADC, L_STREAM_DAC или другой);
какие параметры передаю я
ADC_PAR_0
ULONG
PUSHORT -непонятно какой должен быть тип
PULONG -непонятно какой должен быть тип
L_STREAM_ADC
в примере для делфи тип 3 переменной например PWA
type
WA = array [0..1048576] of SHORT;
PWA = ^WA;
полный код
const
PAGESAMOUNT = 8192;
SAMPLESPERCHUNK = 1024;
BUFFERSIZE = SAMPLESPERCHUNK * PAGESAMOUNT;
ap.s_Type := L_ADC_PARAM;
ap.AutoInit := 1;
ap.dRate := 200.0;
ap.dKadr := 0.0;
ap.dScale := 0;
ap.SynchroType := 3;
ap.SynchroSensitivity := 0;
ap.SynchroMode := 0;
ap.AdChannel := 0;
ap.AdPorog := 0;
ap.NCh := 1;
ap.Chn[0] := $0;
ap.Chn[1] := $1;
ap.Chn[2] := $2;
ap.Chn[3] := $3;
ap.FIFO := SAMPLESPERCHUNK;
ap.IrqStep := SAMPLESPERCHUNK;
ap.Pages := PAGESAMOUNT;
ap.IrqEna := 1;
ap.AdcEna := 1;
Logger := theLogger;
halfBuffer := BUFFERSIZE div 2;
FreeOnTerminate := True;
Cycles := TSamples.Create;
Pixels := TSamples.Create;
Lines := TSamples.Create;
Frames := TSamples.Create;
LostedBlocks := TSamples.Create;
AcceptedBlocks := TSamples.Create;
FrameStartMarkers := TSamples.Create;
FrameEndMarkers := TSamples.Create;
FrameReverseMarkers := TSamples.Create;
LineStartMarkers := TSamples.Create;
LineEndMarkers := TSamples.Create;
LineReverseMarkers := TSamples.Create;
WastedTimeMs := TSamples.Create;
ProcessingTimeMs := TSamples.Create;
Frames.ToAccept := 1;
Error := inf_No_errors_detected.Num;
hModule := LoadLibrary(/'lcomp.dll/');
if (hModule = 0) then begin
FatalError( err_Failed_to_find_lcomdll );
Exit;
end;
@FuncCreateInstance := GetProcAddress ( hModule, /'CreateInstance/' );
if (@FuncCreateInstance = nil) then begin
FatalError( err_Failed_to_find_ci_func );
Exit;
end;
pIUnknown := FuncCreateInstance(0);
if(pIUnknown = nil) then begin
FatalError( err_Failed_to_find_slot0 );
Exit;
end;
hr := pIUnknown.QueryInterface(IID_ILDEV,pLDev);
if( not Succeeded(hr)) then begin
FatalError( err_Failed_query_interface );
Exit;
end;
pIUnknown.Release;
dev:=pLDev.OpenLDevice;
if dev = INVALID_HANDLE_VALUE then begin
FatalError( err_Failed_to_open_device );
Exit;
end;
if not FileExists (ExtractModulePath + /'L783.bio/') then begin
FatalError ( err_Failed_to_find_pgm_L783 );
Exit;
end;
pLDev.LoadBios(/'l783/');
Sleep(100);
report := pLDev.PlataTest;
if report <> L_SUCCESS then begin
FatalError ( err_Failed_to_test_L783 );
Exit;
end;
pLDev.ReadPlataDescr(pd);
pLDev.GetSlotParam(slot);
pLDev.FillDAQparameters(ap);
tm := BUFFERSIZE;
report := pLDev.RequestBufferStream(tm, L_STREAM_ADC);
if report <> L_SUCCESS then begin
FatalError( err_Failed_allocate_circbuf );
Exit;
end;
report := pLDev.SetParametersStream (
ap, tm, StartOfCycleBuffer, sync, L_STREAM_ADC);
if report <> L_SUCCESS then begin
FatalError( err_Failed_get_circbuf_adr );
Exit;
end;
end;
|
|
- Сотрудник "Л Кард"
- Откуда: Москва
- Здесь с 23.04.2014
- Сообщений: 3,727
|
Re: Старые и новые версии SDK.
тестовый пример на Delphi нормально работает? такую ошибку эта функция не может вернуть...
|
|
|
Re: Старые и новые версии SDK.
тогда как трактовать, то что функция возвращает 1?
то что лежит в l7xx.dpr не работает нормально постоянно выдает access violation, но какая то исправленная версия того же самого, что я скачал с вашего форума работает. (похоже отсюда http://www.lcard.ru/forumthreads/10136 )
выдает
Testing library
Loading library - success.
Slot parameters
Base - EC00
BaseL - 0080
Mem - FEBE0000
MemL - 00010000
Type - 14
DSPType - 2185
Irq - 4
ReadPlataDescr status 0
LoadBios status 0
Serial Num. 3D360166
Board Name L783
Revision C
DSP Type 2185
Quartz 20000000
PlataTest status 0
IoAsync call
Data[0] - 0
Allocated memory size(word) : 1048576
Buffer size(word): 0
Pages: 128
Rate: 10
возможно ошибка происходит потому, что параметры составлены не корректно? возможно ли такая ситуация и что должна выдавать функция в таком случае?
|
|
- Сотрудник "Л Кард"
- Откуда: Москва
- Здесь с 23.04.2014
- Сообщений: 3,727
|
Re: Старые и новые версии SDK.
buffer size смущает. а так она каунтер печатать должна. попробуйте из полного lcomp.exe
|
|
|
Re: Старые и новые версии SDK.
выяснил что в примере SetParametersStream выдает 2, т.е. ошибку (просто там проверки не было и казалось ,что всё работает).
что значит из "полного lcomp.exe" ?
я пробовал запускать из C:/Program Files/L-Card/LIBRARY/l7xx.dpr и скомпилированный экзешник и проект при компиляции выдают access violation (в ридми последняя запись от 12.04.2012, так что СДК вроде бы последний)
|
|
|
Re: Старые и новые версии SDK.
впрочем если поменять
pIUnknown:=CreateInstance(1);
на
pIUnknown:=CreateInstance(0);
то работает и из C:/Program Files/L-Card/LIBRARY/l7xx.dpr
SetParametersStream так же выдает 2
|
|
- Сотрудник "Л Кард"
- Откуда: Москва
- Здесь с 23.04.2014
- Сообщений: 3,727
|
Re: Старые и новые версии SDK.
CreateInstance там на какой слот? если плата одна то 0 должен быть.
|
|
|
Re: Старые и новые версии SDK.
там было
pIUnknown:=CreateInstance(1);
я поменял на
pIUnknown:=CreateInstance(0);
и заработало.
а автоматом, нельзя слот платы определять?
попробовал запустить экзешник примера на win7 х32 и похоже он заработал, т.к. размер буфера там был не 0 и потом пошли отсчёты какие то выводится в окно.
так что дело может быть в xp? как можно проверить целостность установки(т.е. какие компоненты должны стоять и как проверить их версию?)
|
|
- Сотрудник "Л Кард"
- Откуда: Москва
- Здесь с 23.04.2014
- Сообщений: 3,727
|
Re: Старые и новые версии SDK.
просто поставить в xp sdk по новой.
|
|
|
Re: Старые и новые версии SDK.
скачал сейчас lcomp.exe отсюда http://www.lcard.ru/support/developer и просто установил поверх теперь всё и на хр заработало.
остался только вопрос
допустим участок кода, определяет сколько времени прошло с использования карты.
minutes := DataStream.FetchWord( Lcard_Elapsed_minutes );
ms := DataStream.FetchWord( Lcard_Elapsed_ms);
Edit8.Text := IntToStr(minutes) + txt_Min
+ IntToStr(ms div 1000) + txt_Sec
+ IntToStr(ms mod 1000) + txt_Ms ;
FetchWord это обертка над GetWord_DM, похоже что GetWord_DM изменилось и теперь должно выдавать ULONG
function TLcardProxy.FetchWord ( adr : USHORT) : ULONG;
var
value : USHORT;
begin
Result := $0001;
if (plDev <> nil) then begin
plDev.GetWord_DM( Adr, value);
Result := value;
end;
end;
но вопрос не в этом. например Lcard_Elapsed_minutes это просто адрес константа $2E25, но ничего подобного я не нашел поиском в СДК, похоже эти константы были жеcтко заданы предыдущим программистом.
вообщем вопрос как узнать адрес откуда считать например прошедшее время?
|
|
- Сотрудник "Л Кард"
- Откуда: Москва
- Здесь с 23.04.2014
- Сообщений: 3,727
|
Re: Старые и новые версии SDK.
Возвращает она по прежнему USHORT nr это слово и з памяти данных DSP и оно 16бит. Такого функционала в штатном биосе не было. Грузите тот, что был с приложением и код прежний оставляйте.
|
|
|
Re: Старые и новые версии SDK.
но в ifc_ldev она определена как
function GetWord_DM(Addr:USHORT; var Data:USHORT):ULONG; virtual; stdcall; abstract;
т.е. как я понимаю возвращает ULONG.
+еще есть "Пояснения по работе с платой L780M (rev C )." тоже вроде насчёт этого, но я не понял о чём там.
и вообще такое ощущение, что читается не оттуда(или не того размера) потому как по адресам в переменные читается мусор.
в мануале я нашел только что то похожее в разделе
"Список внутренних переменных биос L-761/L-780/L-783"
на всякий случай привожу список констант, может быть они были в старых версиях, но изменились в новых?
Lcard_Control_Framed_transfer = 3;
Lcard_Control_Analog_simul_enabled = 4;
Lcard_Control_Digital_simul_enabled = 5;
Lcard_Control_Backtrack_markers_enabled = 6;
Lcard_Control_Control_entered = 7;
//----------------------------------------------//
Lcard_Controls = $2E00;
Lcard_ADC_channel_selector = $2E01;
Lcard_Frame_signal_mask = $2E02;
Lcard_Frame_start_type = $2E03;
Lcard_Line_signal_mask = $2E04;
Lcard_Line_start_type = $2E05;
Lcard_ADC_clock_divider = $2E06;
Lcard_Pixels_per_line_accept = $2E07;
Lcard_Lines_per_frame_accept = $2E08;
Lcard_Frames_to_send = $2E09;
Lcard_Dark_tone = $2E0A;
Lcard_Light_tone = $2E0B;
Lcard_Timer_step = $2E0C;
Lcard_Square_side_size = $2E0D;
Lcard_Timer_5_low = $2E0E;
Lcard_Timer_5_high = $2E0F;
Lcard_Timer_1_low = $2E10;
Lcard_Timer_1_high = $2E11;
Lcard_Timer_2_low = $2E12;
Lcard_Timer_2_high = $2E13;
Lcard_Timer_3_low = $2E14;
Lcard_Timer_3_high = $2E15;
Lcard_Timer_4_low = $2E16;
Lcard_Timer_4_high = $2E17;
Lcard_Sequential_number = $2E18;
Lcard_e19unused = $2E19;
Lcard_e1Aunused = $2E1A;
Lcard_e1Bunused = $2E1B;
Lcard_e1Cunused = $2E1C;
Lcard_e1Dunused = $2E1D;
Lcard_e1Eunused = $2E1E;
Lcard_Data_block_tail = $2E1F;
Lcard_Status = $2E20;
Lcard_Frames_accepted = $2E21;
Lcard_Lines_accepted = $2E22;
Lcard_Frames_sent = $2E23;
Lcard_ADC_handler_size = $2E24;
Lcard_Elapsed_minutes = $2E25;
Lcard_Elapsed_ms = $2E26;
Lcard_Lines_per_frame_last = $2E27;
Lcard_e28unused = $2E28;
Lcard_e29unused = $2E29;
Lcard_e2Aunused = $2E2A;
Lcard_e2Bunused = $2E2B;
Lcard_e2Cunused = $2E2C;
Lcard_e2Dunused = $2E2D;
Lcard_e2Eunused = $2E2E;
Lcard_e2Funused = $2E2F;
Lcard_Frame_start_marker = $2E30;
Lcard_Frame_end_marker = $2E31;
Lcard_Frame_reverse_marker = $2E32;
Lcard_Line_start_marker = $2E33;
Lcard_Line_end_marker = $2E34;
Lcard_Line_reverse_marker = $2E35;
Lcard_Pixels_per_line_count = $2E36;
Lcard_Lines_per_frame_count = $2E37;
Lcard_Frames_to_send_count = $2E38;
Lcard_Detected_lines = $2E39;
Lcard_Simulated_Signals = $2E3A;
Lcard_Fifo_chunk_count = $2E3B;
Lcard_Main_cycle_size = $2E3C;
Lcard_Timer_handler_size = $2E3D;
Lcard_e3Eunused = $2E3E;
Lcard_e3Funused = $2E3F;
Lcard_Down_Count_ms = $2E40;
Lcard_Down_Count_minute = $2E41;
Lcard_Timer_1_count_low = $2E42;
Lcard_Timer_1_count_high = $2E43;
Lcard_Timer_2_count_low = $2E44;
Lcard_Timer_2_count_high = $2E45;
Lcard_Timer_3_count_low = $2E46;
Lcard_Timer_3_count_high = $2E47;
Lcard_Timer_4_count_low = $2E48;
Lcard_Timer_4_count_high = $2E49;
Lcard_Timer_5_count_low = $2E4A;
Lcard_Timer_5_count_high = $2E4B;
Lcard_Frames_count = $2E4C;
Lcard_Lines_count = $2E4D;
Lcard_e4Eunused = $2E4E;
Lcard_e4Funused = $2E4F;
Lcard_SaveI1ax0 = $2E50;
Lcard_SaveI1ay0 = $2E51;
Lcard_SaveI1ax1 = $2E52;
Lcard_SaveI1ay1 = $2E53;
Lcard_SaveI1ar = $2E54;
Lcard_SaveI1i7 = $2E55;
Lcard_SaveI7ax0 = $2E56;
Lcard_SaveI7ay0 = $2E57;
Lcard_SaveI7ar = $2E58;
Lcard_SaveI7i7 = $2E59;
Lcard_SaveIAax0 = $2E5A;
Lcard_SaveIAay0 = $2E5B;
Lcard_SaveIAar = $2E5C;
Lcard_e5Dunused = $2E5D;
Lcard_e5Eunused = $2E5E;
Lcard_e5Funused = $2E5F;
|
|
|
Re: Старые и новые версии SDK.
похоже все оказалось как вы написали, со кастомным биосом всё работает(по крайней мере на первый взгляд).
|
|
- Сотрудник "Л Кард"
- Откуда: Москва
- Здесь с 23.04.2014
- Сообщений: 3,727
|
Re: Старые и новые версии SDK.
ULONG это ошибку возвращает. оно вроде всегда ULONG было. данные USHORT
|