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