Cypress EZ-USB FX2 srautinių problemų su CyAPI ir CyUSB

E

Elephantus

Guest
Aš kuriant srautinių duomenų rinkimo taikymo su Cypress EZ-USB FX2, naudojant CyAPI.Duomenys yra perduodami iš išorės logika per vergais FIFO sąsaja su quad-buferinis urmu baigtis į FX2.PC nuskaito duomenis iš FX2 naudojant perdavimo prescheduling iš eilės sutapo pervedimus (į BeginXfer-WaitXfer-FinishXfer metodą, kaip nurodyta CyAPI pašvaistės pavyzdys).
Šis požiūris turėtų derlius nuolat gaunant duomenis apie USB autobusų ir platus buferizacijos naudojamas kompiuterio siekiant padidinti srauto pralaidumą.

Tačiau, kai bandymai ir matavimai, stebėsena FLAGB (FIFO pilnas vėliava) parodė, kad FX2 FIFO yra ištuštinamos ne nuolat, atsižvelgiant į dabartinę procesoriaus apkrova.Yra programa, kuri naudoja tris lygiagrečiai temas (po vieną paimti ir iš anksto planuoti USB duomenų, antra gauti duomenis ir paskatinti perdirbti bei trečiųjų kurie imituoja perdirbimo tam tikram laikotarpiui) stebėti FLAGB buvo įrodyta, kad FX2 FIFO buvo pilnas (unserviced pagal USB Host) už tikslią trukmę sumodeliuoti apdorojimas (tam tikro laikotarpio aukšto procesoriaus apkrova).Panašių rezultatų buvo pasiekta tada, kai bendra CPU apkrova buvo padidinta naudojant lygiagrečiai procesoriaus laiko reikalaujantis procesas.

Papildomi matavimo ir stebėjimo iš FLAGB elgesys rodo, kad yra tikimybė, kad paims ir preschedule temoje nėra suteikta pakankamai CPU laiko, todėl unsufficient greičio perdavimo Restruktūrizacija, kurių tara ir prescheduled perduoti eilės.Tačiau vis buferinėje / perkelti dydžius ir pakeisti pokalbio prioritetas nebuvo pašalinti šią problemą.Už šį projektą, siekiant nepertraukiamo duomenų srautams yra svarbu atsižvelgiant į ribotus buferizacijos pajėgumų pagrindinių aparatūros.Ne nuolat gaunant duomenis rezultatų duomenų praradimo dėl buferio, kuris yra nepriimtinas šioje dizainas.

Pateikta klausimų: yra priklausomybė nuo perdavimo tarifą procesoriaus apkrovos sukeltos CyAPI / CyUSB vairuotojo architektūra ir yra būdas padidinti produktyvumą su CyUSB vairuotojo pažymėjimą?Galėtų efektyvumą padidėjo tiesiogiai prieiti prie CyUSB vairuotojas per CyIOCTL sąsaja?

Jei kas nors turi atsakyti, ar kitų idėjų apie šią problemą, aš vertiname bet kokią pagalbą.

 
visapusiškai išnaudoti pralaida cyprysowego FX2, kuri yra USB2.0 prietaise, kompiuteryje turi didžiulį darbo krūvį.

Kaip mes nustatėme ankstesnių projektų metu transliacijos procesą, bet lango przeciągając bus sukelti laikiną paketiniams vilkinti.

It's sorta sistemos ribos.Ne dėl vairuotojo ar pr.

 
Na pralaidumą mes tikimės naudoti šiek tiek apie 30-40 MB per sekundę, tačiau jokių papildomų procesoriaus apkrova kas atrodo, kad pertrauka, kad juostos plotis.
Kažkaip atrodo, kad paraiškos atlikti paskirtas užduotis, negali išlaikyti reikalingas našumas visą laiką, arba visiems, nepriklausomai nuo to, kad FX2 pralaidumą nėra visiškai išnaudotos.

 
Aš žinau, tai yra sena thread, bet jei aš galiu rasti, kiti bus per.

Aš užprogramuotas duomenų perdavimo iš CCD Sensor modulis su Cypress USB ir pereiti nuo CyAPI į CyUSB, nes atrodo, kad sutapo IO nėra tikrai dirba CyAPI.

Tiesioginę prieigą prie CyUSB (per DeviceIOCtrl) aš galiu pradėti perkelti į dvi atskiras buferio ir vairuotojas grįžta kiekvieną buferis, kai ji yra pripildyta.Kaip tik vienas buferis užpildytas, aš pradedu kitą buferis, kad visada yra 2 buferius gauti.

Teoriškai galima padaryti tą patį su CyAPI, bet jei tai padarysite, aš pirmą ¹ kai abu buferiai yra baigtas.

Taigi vienintelis būdas man yra, kad tiesiogiai naudoti CyUSB.

1) Apima "cyioctl.h"

2) Enumerate (Atsiprašome, vokiečių pastabas)
Kodas:

/ / / GUID des Cypress USB Treibers

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

statinio const unsigned int XXX_LINE_MAGICNUMBER = 0x555A;/ / / Adresse des USB požymius

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

# define DEFAULT_TX_TRANSFER_SIZE 64/ / Rankenėlė auf den Gerätetreiber holen

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

jei (hwDeviceInfo! = INVALID_HANDLE_VALUE)

(

/ / DevInterfaceData Struktur vorbereiten

SP_DEVICE_INTERFACE_DATA devInterfaceData;

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

while ((modules.size () <XXX_MAX_MODULES) & & (SetupDiEnumDeviceInterfaces (hwDeviceInfo, 0, (LPGUID) & CYUSBDRV_GUID (DWORD) modules.size (), ir 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 ();

jei (errorCode! = ERROR_INSUFFICIENT_BUFFER)

(

perror ( "KLAIDA: SetupDiGetDeviceInterfaceDetail () [1] nesėkmingas -");

printf ( "Klaidos kodas:% d (0x% X) \ n" errorCode, errorCode);

FreeModuleList ();

grįžti ERR_XXX_SETUPAPI;

)

)

reservedLength = requiredLength;

deviceInterfaceDetailData = (PSP_INTERFACE_DEVICE_DETAIL_DATA) new char [reservedLength];

memset (deviceInterfaceDetailData, 0, reservedLength);

deviceInterfaceDetailData-> cbSize = sizeof (SP_DEVICE_INTERFACE_DETAIL_DATA);/ / Plačiau abfragen

realLength = reservedLength;

jei (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: SetupDiGetDeviceInterfaceDetail nepavyko su kodu" <<klaida << "\" "<<errorMessage (klaidos) <<" \ "" <<std:: endl;

FreeModuleList ();

grįžti ERR_XXX_SETUPAPI;

)/ / Für deviceInterfaceDetailData reservierten Speicher freigeben

ištrinti deviceInterfaceDetailData;

deviceInterfaceDetailData = NULL;

)/ / Auflistung beenden

SetupDiDestroyDeviceInfoList (hwDeviceInfo);/ / Fertig

grįžti ERR_XXX_OK;/ / Gerätetreiber nicht vorhanden -> ERGO keine modulis

) Else

(

grįžti ERR_XXX_NODRIVER;

)
 
Perdangos sakoma nėra gerai dokumentuojami, bet jie veikia.Jūs niekada padaryti geriau nei maždaug 15 MB / sec mano patirtis su standartinėmis blokuoja skaityti skambučius, ir gausite sunkus paliekančių bet norma virš ~ 6 MB / sek.

Aš panaudojo šį kodą gauti iki 32 MByte / s iš Cypress FX2.Ji veiks dienos metu be paliekančių 10 MByte / s (su 16KB aparatūros FIFO).

Kodas:S32 ADC_acquire (tuščia)

(

Perdangos inOv [QSIZE] / / 32 mano atveju

statinio U8 * Buff [QSIZE];

U8 * kontekstuose [QSIZE];BulkInPipe4-> SetXferSize (Nbytes); / / 65536 mano atvejuADC_enable_acquisition (1) / / (taikant specifines)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);assert (NSAMPLES == (xfer_size / 4));už (S32 i = 0; i <QSIZE; i )

(

Buff = (U8 *) malloc (xfer_size);

assert (Buff ! = NULL);memset (& inOv , 0, sizeof (inOv ));

inOv . hEvent = createEvent (NULL, false, false, null);kontekste = BulkInPipe4-> BeginDataXfer (Buff , xfer_size, & inOv );

)printf ( "Priimančiąsias duomenis \ n \ n");S64 start = mono_time_uS ();

S64 praėjo = 0;

S64 bytes = 0;S32 bufnum = 0;S32 Rezultatas = 0;ir (;)

(

praėjo = mono_time_uS () - pradžia;jei (_kbhit ())

(

Rezultatas = (_getch ()! = 27);

break;

)/ / Palaukite šį xfer užpildytiif (! BulkInPipe4-> WaitForXfer (& inOv [bufnum], 1000))

(

ADC_enable_acquisition (0);

BulkInPipe4-> Atšaukti ();

assert (0);

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

)LONG rLen = xfer_size;if (! BulkInPipe4-> FinishDataXfer (Buff [bufnum], rLen, & inOv [bufnum], kontekstą [bufnum]))

(

ADC_enable_acquisition (0);

show_last_error ();

exit (1);

)/ / Proceso Nbytes duomenų Buff [bufnum]U8 * src = Buff [bufnum];

/ / .../ / Pakartotinai perdavimaskontekste [bufnum] = BulkInPipe4-> BeginDataXfer (Buff [bufnum], xfer_size, & inOv [bufnum]);bufnum = (bufnum 1)% QSIZE;

bytes = rLen;

)ADC_enable_acquisition (0);

flush (0);jei (praėjo)

(

printf ( "\ n \ n% I64d baitų,% I64d usec =% I64d baitų / sek,

baitų,

praėjo,

baitų * 1000000 / praėjo);

)/ / ValymasBulkInPipe4-> Atšaukti ();už (S32 i = 0; i <QSIZE; i )

(

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

(

BulkInPipe4-> Atšaukti ();

WaitForSingleObject (inOv . HEvent, infinite);

)LONG rLen = xfer_size;

BulkInPipe4-> FinishDataXfer (Buff , rLen, & inOv , kontekstą );CloseHandle (inOv . HEvent);nemokamai (Buff );

Buff = NULL;

)return rezultatas;

)

 

Welcome to EDABoard.com

Sponsor

Back
Top