Cypress EZ-USB FX2 streaming problemi con CyAPI e CyUSB

E

Elephantus

Guest
Io sono la progettazione di una applicazione di acquisizione dei dati di streaming con il Cypress EZ-USB FX2, utilizzando CyAPI.I dati vengono trasferiti da esterno attraverso la logica FIFO interfaccia slave ad un quad-buffered rinfusa endpoint nel FX2.Il PC recupera i dati dal FX2 utilizzando trasferimento da prescheduling code sovrapposta trasferimenti (l'BeginXfer-WaitXfer-FinishXfer approccio, come indicato nel CyAPI streamer esempio).
Il dato dovrebbe rendimento continuo caricamento dei dati sul bus USB e un ampio tampone è utilizzato su PC, al fine di massimizzare il flusso di volume.

Tuttavia,
previo collaudo e misurazione, il monitoraggio del FLAGB (FIFO piena bandiera) ha dimostrato che l'FX2 fifo viene svuotato non continuamente a seconda della corrente di carico della CPU.In una applicazione che utilizza tre fili paralleli (uno per scaricare e pre-calendario dati USB,
il secondo per la ricezione di dati e di innescare la trasformazione e la terza, che simula il trattamento per un determinato periodo) il controllo delle FLAGB ha dimostrato che l'FX2 FIFO è piena (da unserviced USB Host) per l'esatta durata del trattamento simulato (un determinato periodo di elevato carico della CPU).Risultati simili sono stati ottenuti quando il carico della CPU è stata sollevata utilizzando un parallelo CPU processo in termini di tempo.

Ulteriori misurazioni e di osservazione del comportamento FLAGB indicato che non vi è una possibilità che il fetch e preschedule thread non è dato sufficiente tempo di CPU,
con conseguente unsufficient la velocità di trasferimento di rinegoziazione, che svuota la prescheduled trasferimento coda.Tuttavia, aumentando il buffer / trasferimento e la modifica delle dimensioni thread priorità non eliminare il problema.Per la data di progettazione,
la realizzazione di un continuo flusso di dati è di fondamentale importanza a causa della limitata capacità del buffer hardware.Il mancato caricamento continuo dei dati si traduce in una perdita di dati a causa di overflow del buffer,
il che è inaccettabile in un determinato progetto.

Le domande sono: è la dipendenza della velocità di trasferimento di carico sulla CPU causato dalla CyAPI / CyUSB driver di architettura, e vi è un modo per incrementare le prestazioni con il CyUSB driver?Le prestazioni potrebbero essere aumentate di accedere direttamente CyUSB il conducente tramite l'interfaccia CyIOCTL?

Se qualcuno ha una risposta, o qualsiasi altra idea su un determinato problema,
vorrei apprezzare alcun aiuto.

 
di utilizzare pienamente la banda di cipresso FX2, che è un dispositivo
USB 2.0, il PC ha un enorme carico di lavoro.

Come abbiamo osservato in precedenti progetti, durante il processo di streaming, qualsiasi finestra trascinando farà pacchetto temporaneo stallo.

E 'sorta sistema limite.Non sia stato causato da driver o STH.

 
Beh, la larghezza di banda nella speranza siamo stati un po 'di utilizzare circa il 30-40 megabit al secondo, ma ogni ulteriore carico della CPU per spezzare qualsiasi sembra che la larghezza di banda.
In qualche modo sembra che la domanda, dato che svolgono compiti, non può sostenere la necessità di throughput o tutto il tempo a tutti, indipendentemente dal fatto che la FX2 la larghezza di banda non è completamente utilizzata.

 
So che questo è un vecchio thread, ma se riesco a trovarlo,
gli altri saranno troppo.

Ho programmato il trasferimento dei dati dal sensore CCD-modulo con Cypress USB e passare da CyAPI di CyUSB perché sembra che overlapped IO non è in realtà che operano nel CyAPI.

Con accesso diretto alla CyUSB (via DeviceIOCtrl) Sono in grado di iniziare il trasferimento in due distinti buffer e il conducente restituisce ogni buffer quando si è riempito.Non appena un buffer è pieno, inizio di un altro tampone in modo che ci sono sempre 2 buffer ricezione.

In teoria si potrebbe fare lo stesso con CyAPI, ma se lo faccio, ho la prima richiamata quando entrambi i buffer sono finiti.

Quindi l'unico modo per me è quello di rendere l'uso diretto di CyUSB.

1) Includi "cyioctl.h"

2) Enumerazione (spiacenti, tedesco commenti)
Codice:

/ / / GUID dei Cypress USB Treibers

statica CYUSBDRV_GUID GUID = (0xae18aa60, 0x7f6a, 0x11d4, 0x97, 0xdd, 0x0, 0x1, 0x2, 0x29, 0xb9, 0x59);/ / / Zeilenanfangskennung

static const unsigned int XXX_LINE_MAGICNUMBER = 0x555A;/ / / Adresse des USB Estremità

# define XXX_TX_ENDPOINT_ADDR 0x08/ / / Transferdatenblockgröße

# define DEFAULT_TX_TRANSFER_SIZE 64/ / Handle holen auf den Gerätetreiber

HDEVINFO hwDeviceInfo = SetupDiGetClassDevs ((LPGUID) & CYUSBDRV_GUID, NULL, NULL, DIGCF_PRESENT | DIGCF_INTERFACEDEVICE);

if (hwDeviceInfo! = INVALID_HANDLE_VALUE)

(

/ / DevInterfaceData Struktur vorbereiten

SP_DEVICE_INTERFACE_DATA devInterfaceData;

devInterfaceData.cbSize = sizeof (devInterfaceData);/ / Liste aller vorhandenen Modulo erstellen

while ((modules.size () <XXX_MAX_MODULES) & & (SetupDiEnumDeviceInterfaces (hwDeviceInfo, 0, (LPGUID) & CYUSBDRV_GUID, (DWORD) modules.size (), e devInterfaceData)))

(

/ / DeviceInfoData Struktur vorbereiten

SP_DEVINFO_DATA deviceInfoData;

memset (& deviceInfoData, 0, sizeof (SP_DEVINFO_DATA));

deviceInfoData.cbSize = sizeof (SP_DEVINFO_DATA);/ / DeviceInterfaceDetailData Struktur vorbereiten

PSP_DEVICE_INTERFACE_DETAIL_DATA deviceInterfaceDetailData;

ULONG requiredLength = 0, reservedLength = 0, realLength = 0;

if (! SetupDiGetDeviceInterfaceDetail (hwDeviceInfo, & devInterfaceData, NULL, 0, & requiredLength, NULL))

(

int errorCode = GetLastError ();

if (errorCode! = ERROR_INSUFFICIENT_BUFFER)

(

perror ( "ERRORE: SetupDiGetDeviceInterfaceDetail () [1] non -");

printf ( "Codice di errore% d (0x% X) \ n", errorCode, errorCode);

FreeModuleList ();

ERR_XXX_SETUPAPI andata e ritorno;

)

)

reservedLength = requiredLength;

deviceInterfaceDetailData = (PSP_INTERFACE_DEVICE_DETAIL_DATA) nuovo char [reservedLength];

memset (deviceInterfaceDetailData, 0, reservedLength);

deviceInterfaceDetailData-> cbSize = sizeof (SP_DEVICE_INTERFACE_DETAIL_DATA);/ / Dettagli abfragen

realLength = reservedLength;

if (SetupDiGetDeviceInterfaceDetail (hwDeviceInfo, & devInterfaceData, deviceInterfaceDetailData, reservedLength, & realLength, & deviceInfoData))

(

/ / Modulo initialisieren

XXXModule * newModule = new XXXModule ((int) modules.size (), deviceInterfaceDetailData-> DevicePath);

modules.push_back (newModule);

) Else

(

int errore =:: GetLastError ();

std:: cerr << "XXXEnumerator:: UpdateModuleList: SetupDiGetDeviceInterfaceDetail non con il codice" <<errore << "\" "<<errorMessage (errore) <<" \ "" <<std:: endl;

FreeModuleList ();

ERR_XXX_SETUPAPI andata e ritorno;

)/ / Per deviceInterfaceDetailData reservierten Speicher freigeben

eliminare deviceInterfaceDetailData;

deviceInterfaceDetailData = NULL;

)/ / Auflistung Beenden

SetupDiDestroyDeviceInfoList (hwDeviceInfo);/ / Fertig

ERR_XXX_OK andata e ritorno;/ / Gerätetreiber nicht vorhanden -> ergo keine Modulo

) Else

(

ERR_XXX_NODRIVER andata e ritorno;

)
 

Welcome to EDABoard.com

Sponsor

Back
Top