STM32 USB HOST Lib Isochronous Transfer

Gast #5646098
Lesenswert?

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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren