Forum: Mikrocontroller und Digitale Elektronik STM32 USB HOST Lib Isochronous Transfer


von fsdf (Gast)


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?

von fsdf (Gast)


Lesenswert?

hi

niemand eine idee  wie man den stack RTOS freundlicher machen kann?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.