STM32 USB HOST Lib Isochronous Transfer

Gast #5646098
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

Eine eigene Frage? Dieser Thread ist über 7 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.