|
Вопрос # 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); // Open
- begin
- 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.
|
Мини-форум вопроса
Мини-форум пуст.
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|