čempres EZ-USB FX2 strujeću problema sa CyAPI i CyUSB

E

Elephantus

Guest
Ja sam izradi streaminga podataka aplikacija s čempres EZ-USB FX2, koristeći CyAPI.Podaci su preneseni iz vanjskih logika preko robovsku FIFO sučelje na quad-međupohranom skupno za vršne točke u FX2.PC dohvaća podatke iz FX2 koristeći prijenos prescheduling by čekanje u redu overlapped transferi (u BeginXfer-WaitXfer-FinishXfer pristup kao što je prikazano u CyAPI uzana primjer).
The yield trebali dati pristup kontinuiranom dohvat podataka o USB sabirnice i opsežnog poliranje se koristi na računalu kako bi se povećala propusnost stream.

Međutim, nakon ispitivanja i mjerenja, praćenje FLAGB (FIFO punoj zastava) je pokazala da je FX2 FIFO se prazni non-kontinuirano, ovisno o trenutnom CPU load.U program koji koristi tri paralelne threads (jedan za sitne unaprijed raspored USB podatke, drugi za primanje podataka i pokrenuti obradu i treći koji simulira obrada za dano trajanje) praćenje FLAGB pokazala da je bila puna FX2 FIFO (unserviced by USB Host) za točno vrijeme na simulirani obrade (određenog razdoblja visoke CPU load).Slični rezultati su postignuti pri ukupnom CPU load je podignuta pomoću paralelnih CPU-vrijeme trajanja procesa.

Dodatna mjerenja i motrenja na FLAGB ponašanje navelo je da postoji mogućnost da je donese i preschedule nit nije dobio dovoljan CPU vremena,
što je rezultiralo u unsufficient brzine prijenosa reprogramiranje, koja se prazni prescheduled transfer red čekanja.Međutim, povećanje tampon / prijenosa i mijenjanje veličine nit nije prioritet eliminirati problem.Za dati dizajn, postizanja kontinuiranog streaming podataka od iznimne je važnosti zbog ograničene sposobnosti međupohrana predmetne hardver.Non-continuous dobavljanje podataka rezultate u gubitak podataka uslijed buffer overflow, što je neprihvatljivo s obzirom na dizajn.

Pitanje: je ovisnost o prijenosu stopa na CPU load uzrokovane CyAPI / CyUSB vozač arhitekture, te je li postoji način da povećate performanse sa CyUSB driver?Moglo bi se povećati performanse po izravno pristupanje CyUSB vozača putem CyIOCTL sučelje?

Ako bilo tko ima odgovor, ili bilo koja druga ideja o given problem, ja bih svaku pomoć.

 
da u potpunosti koriste propusne čempresa FX2, koja je USB2.0 uređaj, računalo ima ogromne posla.

Kao što smo opazili na prethodni projekti, streaminga tijekom procesa, bilo koji prozor-povučete će izazvati privremeno paketne zatajiti.

To je sorta sistem ograničenje.Nije uzrokovana vozač ili sth.

 
Dobro propusne nadali smo iskoristili da je nešto oko 30-40 sekundi megabiti, međutim sve dodatne CPU load sve što izgleda kao da pauze da bandwith.
Nekako se čini da je primjena, obavljanje zadanih zadataka, ne može održavati potrebnu propusnost cijelo vrijeme ili na sve, bez obzira na činjenicu da je FX2 bandwith nije u potpunosti koristiti.

 
Znam da je ovo stari thread, ali ako ne mogu pronaći, drugi će se previše.

Ja programirani prijenos podataka s CCD-Sensor Modul s čempres USB i prebaci s CyAPI da CyUSB jer izgleda da overlapped IO nije stvarno rade u CyAPI.

Uz direktan pristup CyUSB (via DeviceIOCtrl) mogu početi transfer u dvije zasebne buffers a vozač se vraća svaki tampon kad se napuni.Čim jedan buffer napuni, JA početi neki drugi tampon tako da su uvijek 2 buffers primanja.

Teoretski bi mogla učiniti isto s CyAPI, ali ako to učinite, JA dobiti prvi poziv oba buffers kada završite.

Stoga je jedini način za mene je da direktni korištenje CyUSB.

1) Uključena "cyioctl.h"

2) nabrojiti (ispričavam se, Njemački komentara)
Code:

/ / / GUID des čempres USB Treibers

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

statički nepotpisan const int XXX_LINE_MAGICNUMBER = 0x555A;/ / / Adresse des USB Endpoints

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

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

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 Modul erstellen

dok je ((modules.size () <XXX_MAX_MODULES) & & (SetupDiEnumDeviceInterfaces (hwDeviceInfo, 0, (LPGUID) & CYUSBDRV_GUID, (DWORD) modules.size (), & 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 ( "ERROR: SetupDiGetDeviceInterfaceDetail () [1] failed -");

printf ( "šifra pogreške:% d (0x% x) \ n", errorCode, errorCode);

FreeModuleList ();

povratak ERR_XXX_SETUPAPI;

)

)

reservedLength = requiredLength;

deviceInterfaceDetailData = (PSP_INTERFACE_DEVICE_DETAIL_DATA) nove pougljiti [reservedLength];

memset (deviceInterfaceDetailData, 0, reservedLength);

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

realLength = reservedLength;

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

(

/ / Modul initialisieren

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

modules.push_back (newModule);

) Else

(

int error =:: GetLastError ();

STD: cerr << "XXXEnumerator: UpdateModuleList: failed SetupDiGetDeviceInterfaceDetail s broj" <<error << "\" "<<ErrorMessage (error) <<" \ "" <<STD:: endl;

FreeModuleList ();

povratak ERR_XXX_SETUPAPI;

)/ / DeviceInterfaceDetailData reservierten Speicher für freigeben

brisanje deviceInterfaceDetailData;

deviceInterfaceDetailData = NULL;

)/ / Auflistung beenden

SetupDiDestroyDeviceInfoList (hwDeviceInfo);/ / Fertig

povratak ERR_XXX_OK;/ / Gerätetreiber nicht vorhanden -> ergo keine Module

) Else

(

povratak ERR_XXX_NODRIVER;

)
 
Overlapped reads nisu dobro dokumentirane, ali oni to rade.Vi nikada neće biti bolje nego oko 15 MB / sec u moje iskustvo sa standardnim blokiranje poziva pročitati, a vi
ćete dobiti u bilo koje ozbiljne dropouts stopa iznad ~ 6 MB / sec.

Ja sam se ovaj kôd primati do oko 32 megabajt / sec iz FX2 čempres.To je trčanje za dane u vrijeme bez dropouts u 10 megabajt / sec (s hardverom 16KB FIFO.)

Code:S32 ADC_acquire (void)

(

OVERLAPPED inOv [QSIZE]; / / 32 u mom slucaju

statično * U8 usjajiti [QSIZE];

U8 * kontekstima [QSIZE];BulkInPipe4-> SetXferSize (Nbytes); / / 65536 u mom slucajuADC_enable_acquisition (1); / / (primjena specifične)S32 max_size = BulkInPipe4-> MaxPktSize;

S32 xfer_size = BulkInPipe4-> GetXferSize ();printf ( "MaxPkt =% d, XferSize = 0x% x, bHighSpeed =% d \ n",

max_size, xfer_size, USBDevice-> bHighSpeed);dokazivanje (NSAMPLES == (xfer_size / 4));for (S32 i = 0; i <QSIZE; i )

(

usjajiti = (U8 *) malloc (xfer_size);

tvrditi (usjajiti ! = NULL);memset (& inOv , 0, sizeof (inOv ));

inOv . hEvent = CreateEvent (NULL, false, false, NULL);kontekstima = BulkInPipe4-> BeginDataXfer (usjajiti , xfer_size & inOv );

)printf ( "Primanje podataka \ n \ n");S64 start = mono_time_uS ();

S64 proteklo = 0;

S64 bytes = 0;S32 bufnum = 0;S32 rezultat = 0;for (;)

(

proteklo mono_time_uS = () - početi;if (_kbhit ())

(

rezultat = (_getch (!) = 27);

break;

)/ / Pričekajte da ispunite ovaj xferif (! BulkInPipe4-> WaitForXfer (& inOv [bufnum], 1000))

(

ADC_enable_acquisition (0);

BulkInPipe4-> Prekini ();

dokazivanje (0);

WaitForSingleObject (inOv [bufnum]. HEvent, zauvijek);

)LONG rLen = xfer_size;if (! BulkInPipe4-> FinishDataXfer (usjajiti [bufnum], rLen & inOv [bufnum], kontekstima [bufnum]))

(

ADC_enable_acquisition (0);

show_last_error ();

exit (1);

)/ / Proces Nbytes podataka iz usjajiti [bufnum]U8 * src = usjajiti [bufnum];

/ / .../ / Ponovno pošaljite prijenoskontekstima [bufnum] = BulkInPipe4-> BeginDataXfer (usjajiti [bufnum], xfer_size & inOv [bufnum]);bufnum = (bufnum 1)% QSIZE;

bytes = rLen;

)ADC_enable_acquisition (0);

flush (0);if (prošlo)

(

printf ( "\ n \ n% I64d bajtova,% I64d usec =% I64d bytes / sec,

byte,

proteklo,

1000000 bytes * / proteklo);

)/ / ČišćenjeBulkInPipe4-> Prekini ();for (S32 i = 0; i <QSIZE; i )

(

if (! BulkInPipe4-> WaitForXfer (& inOv , 1000))

(

BulkInPipe4-> Prekini ();

WaitForSingleObject (inOv . HEvent, zauvijek);

)LONG rLen = xfer_size;

BulkInPipe4-> FinishDataXfer (usjajiti , rLen & inOv , kontekstima );CloseHandle (inOv . HEvent);free (usjajiti );

usjajiti = NULL;

)povratak rezultat;

)

 

Welcome to EDABoard.com

Sponsor

Back
Top