Hi
ertsmal zum Problem:
Ich nutze einen STM32F7 mit der USB Host lib und RTOS.
Daran angeschlossen ist eine Webcam die ihre Daten über den Isochronous
transfer schiebt.
Das funktioniert bisher auch zufriedenstellend.
USB_OTG_HS mit integriertem Phy im FULL SPeed mode
_HS weil ich den DMA Mode nutze !!
der _FS kann den leider hier nicht verwenden.
Was mich aber momentan ziemlich nervt ist die hohe CPU last von durchweg
80%
Das kommt uach nur daher weil der backgrndprocess
1 | case VIDEO_STREAM_PLAY:
|
2 | if((phost->Timer-pVideo->EpVideoStream.wTimer) >= pVideo->EpVideoStream.bInterval)
|
3 | {
|
4 | pVideo->EpVideoStream.wTimer = phost->Timer;
|
5 | if( USBH_LL_GetURBState(phost , pVideo->EpVideoStream.bPipe) == USBH_URB_DONE )
|
6 | {
|
7 | HandleReceivedFrame( pVideo ,
|
8 | DMA_USBH_Buffer,
|
9 | USBH_LL_GetLastXferSize(phost, pVideo->EpVideoStream.bPipe ));
|
10 |
|
11 | USBH_IsocReceiveData( phost ,
|
12 | DMA_USBH_Buffer,
|
13 | pVideo->EpVideoStream.wMaxPacketSize,
|
14 | pVideo->EpVideoStream.bPipe );
|
15 | }
|
16 | }
|
17 | osMessagePut ( phost->os_event, USBH_URB_EVENT, pVideo->EpVideoStream.bInterval);
|
18 | break;
|
speziell durch die zeile :
1 | osMessagePut ( phost->os_event, USBH_URB_EVENT, pVideo->EpVideoStream.bInterval);
|
quasi alle 1ms wiederholt aufgerufen wird.
zusätzlich zu dem URB event werden durch den RX complete interrupt
weitere messages erzeugt.
dadurch gibt es ca 1-4 events alle 1ms
Lasse ich die zyklische zeile weg, funktioniert der stream nicht 100%ig
durchweg.
Er steckt dann nach 1-2 bildern im USBH_URB_NOTREADY fest.
Wenn ich das versuche zu debuggen, stelle ich folgendes fest:
nach dem aufruf von:USBH_IsocReceiveData(..)
folgen ein paar SOF interrupts und einem HCD_HC_IN_IRQHandler interrupt
was dem RX complete entspricht.
1 | else if(hhcd->hc[chnum].ep_type == EP_TYPE_ISOC)
|
2 | {
|
3 | hhcd->hc[chnum].urb_state = URB_DONE;
|
4 | HAL_HCD_HC_NotifyURBChange_Callback(hhcd, chnum, URB_DONE );
|
5 | }
|
Das ganze macht mich madig.
Es sollte doch möglich seit das halbwegs effezient zu gestalten ohne den
kompletten USB kram neu zu schreiben.
Hat vieleicht jemand soetwas gemacht?
Oder hat einen Tip auf lager?