| 
| 
 | Вопрос # 3 306/ вопрос открыт / | 
 |  Приветствую, уважаемые эксперты!Вопрос очень специфичный, но возможно, какие-нибудь идеи общего плана мне подскажут.
 В устройстве нижнего уровня на микроконтроллере для сопряжения с USB используется микросхема FT245BM с ее родной DLL для связи с пользовательской программой.
 Подпрограммы открытия и записи-чтения приведены в блоке 1,чуть доработаны под конкретную задачу. Все хорошо, работает,только очень медленно. По осциллографу вижу : передача, 5мс обработка внизу, ответ - и 60мс задумчивый ступор до следующей передачи. В рабочей программе никаких адержек :
 for i := I1 to I2 do    begin ...(копирование в буфер вывода 32 байт)... Seans() end ;
 Выкопал где-то в хелпах пример повышения приоритета ( блок 2 ) - результат нулевой.
 Буду писать шотландской FTDI, но если спросят : а все ли ты сделал для... ?
 Приложение:Переключить в обычный режим    procedure TForm1.BtnOpnClick(Sender: TObject);  // Openbegin  Caption := 'USB <-> Serial';If Open_USB_Device_By_Device_Description(Caption) = FT_OK then  Begin  FTSendFile.enabled := true;  Reset_USB_Device;     // warning - this will destroy any pending data.  Set_USB_Device_TimeOuts(1,1); // read and write timeouts = 1 mS  End;end;    var  FC1,Total,I,J,K,PortStatus : Integer;  S : String;Begin  Purge_USB_Device_Out ;  Purge_USB_Device_In ;  SCmd[2] := 0 ; SCmd[1] := Nfrm ; Inc (NFrm) ;   J := SCmd[0]+1 ;  for I := 0 to J do FT_Out_Buffer[i] := SCmd[I] ;  I := Write_USB_Device_Buffer( J );  Ed2.Text := 'Waiting for Data ...';  Repeat  Application.ProcessMessages;  PortStatus := Get_USB_Device_QueueStatus;  If PortStatus <> FT_OK then     // Device no longer present ...    Begin    //Timer1.Enabled := True;    Ed2.Text := '';    Exit;    End;  Until FT_Q_Bytes > 0;  Application.ProcessMessages;  I := Read_USB_Device_Buffer(FT_In_Buffer_Size);  Total := I;  NInp := I ;  for I := 0 to Ninp-1 do SRcv[I] := FT_In_Buffer[I] ;  Ed2.Text := 'Bytes Received = ' + IntToStr(Total);  Reset_USB_Device ; end;   var i,j,k,i1,i2 : integer ;   ProcessID : DWORD; //**   ProcessHandle : THandle; //**   ThreadHandle : THandle; //**begin  if (FlagOpn>0) and (FlagFil>0) then     begin       ProcessID := GetCurrentProcessID; //**       FlagGo := 1 ;       ProcessHandle := OpenProcess(PROCESS_SET_INFORMATION,False,ProcessID); //**       SetPriorityClass(ProcessHandle, REALTIME_PRIORITY_CLASS); //**       ThreadHandle := GetCurrentThread; //**       SetThreadPriority(ThreadHandle, THREAD_PRIORITY_TIME_CRITICAL); //** 
|  |   Вопрос задал: Яуген Таляныч (статус: Посетитель)Вопрос отправлен: 20 октября 2009, 15:11
 Состояние вопроса: открыт, ответов: 0.
 |  
 Мини-форум вопросаМини-форум пуст. Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |