Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 306

/ вопрос открыт /

Приветствую, уважаемые эксперты!
Вопрос очень специфичный, но возможно, какие-нибудь идеи общего плана мне подскажут.
В устройстве нижнего уровня на микроконтроллере для сопряжения с USB используется микросхема FT245BM с ее родной DLL для связи с пользовательской программой.
Подпрограммы открытия и записи-чтения приведены в блоке 1,чуть доработаны под конкретную задачу. Все хорошо, работает,только очень медленно. По осциллографу вижу : передача, 5мс обработка внизу, ответ - и 60мс задумчивый ступор до следующей передачи. В рабочей программе никаких адержек :
for i := I1 to I2 do begin ...(копирование в буфер вывода 32 байт)... Seans() end ;
Выкопал где-то в хелпах пример повышения приоритета ( блок 2 ) - результат нулевой.
Буду писать шотландской FTDI, но если спросят : а все ли ты сделал для... ?

Приложение:
  1.  
  2.  
  3.  
  4. procedure TForm1.BtnOpnClick(Sender: TObject); // Open
  5. begin
  6. Caption := 'USB <-> Serial';
  7. If Open_USB_Device_By_Device_Description(Caption) = FT_OK then
  8. Begin
  9. FTSendFile.enabled := true;
  10. Reset_USB_Device; // warning - this will destroy any pending data.
  11. Set_USB_Device_TimeOuts(1,1); // read and write timeouts = 1 mS
  12. End;
  13. end;
  14.  
  15.  
  16.  
  17.  
  18. var
  19. FC1,Total,I,J,K,PortStatus : Integer;
  20. S : String;
  21. Begin
  22. Purge_USB_Device_Out ;
  23. Purge_USB_Device_In ;
  24. SCmd[2] := 0 ; SCmd[1] := Nfrm ; Inc (NFrm) ;
  25. J := SCmd[0]+1 ;
  26. for I := 0 to J do FT_Out_Buffer[i] := SCmd[I] ;
  27. I := Write_USB_Device_Buffer( J );
  28. Ed2.Text := 'Waiting for Data ...';
  29. Repeat
  30. Application.ProcessMessages;
  31. PortStatus := Get_USB_Device_QueueStatus;
  32. If PortStatus <> FT_OK then // Device no longer present ...
  33. Begin
  34. //Timer1.Enabled := True;
  35. Ed2.Text := '';
  36. Exit;
  37. End;
  38. Until FT_Q_Bytes > 0;
  39. Application.ProcessMessages;
  40. I := Read_USB_Device_Buffer(FT_In_Buffer_Size);
  41. Total := I;
  42. NInp := I ;
  43. for I := 0 to Ninp-1 do SRcv[I] := FT_In_Buffer[I] ;
  44. Ed2.Text := 'Bytes Received = ' + IntToStr(Total);
  45. Reset_USB_Device ;
  46.  
  47. end;
  48.  
  49.  
  50.  
  51. var i,j,k,i1,i2 : integer ;
  52. ProcessID : DWORD; //**
  53. ProcessHandle : THandle; //**
  54. ThreadHandle : THandle; //**
  55. begin
  56. if (FlagOpn>0) and (FlagFil>0) then
  57. begin
  58. ProcessID := GetCurrentProcessID; //**
  59. FlagGo := 1 ;
  60. ProcessHandle := OpenProcess(PROCESS_SET_INFORMATION,False,ProcessID); //**
  61. SetPriorityClass(ProcessHandle, REALTIME_PRIORITY_CLASS); //**
  62. ThreadHandle := GetCurrentThread; //**
  63. SetThreadPriority(ThreadHandle, THREAD_PRIORITY_TIME_CRITICAL); //**
  64.  


Яуген Таляныч Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Яуген Таляныч (статус: Посетитель)
Вопрос отправлен: 20 октября 2009, 15:11
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Мини-форум пуст.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:58
Выполнено за 0.02 сек.