2017-09-20 21 views
0

ちょうどXMC4500 microcontrollerで作業を開始しました。私は現在、USB CDC通信を実装しており、問題が発生しました。 関数 "USBD_VCOM_SendData"を呼び出した後、プログラムはデータを送信するフレームを待ちます。 より正確には、プログラムは "Endpoint_Write_Stream_LE"内の "usbd_endpoint_stream_xmc4000.c"ファイルで待機します。エンドポイントが「Endpoint_WaitUntilReady()」関数で準備されるのを待ちます。ARM USB関数の実行に時間がかかりすぎて

#define USB_STREAM_TIMEOUT_MS 100 


uint8_t Endpoint_WaitUntilReady(void) 
{ 
#if (USB_STREAM_TIMEOUT_MS < 0xFF) 
    uint8_t TimeoutMSRem = USB_STREAM_TIMEOUT_MS; 
#else 
    uint16_t TimeoutMSRem = USB_STREAM_TIMEOUT_MS; 
#endif 

uint16_t PreviousFrameNumber = USB_Device_GetFrameNumber(); 

    for (;;) 
    { 
     if (Endpoint_GetEndpointDirection() == ENDPOINT_DIR_IN) 
     { 
      if (Endpoint_IsINReady()) 
      { 
       return ENDPOINT_READYWAIT_NoError; 
      } 
     } 
     else 
     { 
      if (Endpoint_IsOUTReceived()) 
      { 
       return ENDPOINT_READYWAIT_NoError; 
      } 
     } 

     uint8_t USB_DeviceState_LCL = USB_DeviceState; 

     if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) 
     { 
      return ENDPOINT_READYWAIT_DeviceDisconnected; 
     } 
     else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) 
     { 
      return ENDPOINT_READYWAIT_BusSuspended; 
     } 
     else if (Endpoint_IsStalled()) 
     { 
      return ENDPOINT_READYWAIT_EndpointStalled; 
     } 

     uint16_t CurrentFrameNumber = USB_Device_GetFrameNumber(); 

     if (CurrentFrameNumber != PreviousFrameNumber) 
     { 
      PreviousFrameNumber = CurrentFrameNumber; 

      if (!(TimeoutMSRem--)) 
      { 
       return ENDPOINT_READYWAIT_Timeout; 
      } 
     } 
    }  
} 

この待機時間は約100〜150usで長くなります。私がSTM32マイクロコントローラで作業していたとき、実行時間はかなり短くなりました。

誰もこの問題に以前に悩まされていませんか? バッファにデータを書き込んで、周辺機器がプロセッサ時間を必要とせずにトランザクションを処理できる方法はありますか? 少なくとも、エンドポイントがトランザクションの準備ができたら割り込みをトリガーします。

答えて

0

Endpoint_IsINReady()がtrueを返した場合、ループは即座に終了します。おそらく、あなたのコードでそのマクロを実行しようとする必要があり、それが真であると評価された場合にのみUSBホストにメッセージを送ります。

また、ライブラリーがそのブロック動作を使用しないようにするには、エンドポイント・バッファーが一度に保持できるデータ量を考慮する必要があります。時間。 (あなたは自分のバッファを作り、必要に応じてUSBライブラリにそれを送ることができます)

関連する問題