【问题标题】:ARM USB functions take too long to excecuteARM USB 函数执行时间过长
【发布时间】:2017-09-20 07:41:28
【问题描述】:

我刚开始研究XMC4500 microcontroller。我目前正在实现 USB CDC 通信,但遇到了问题。 在调用函数“USBD_VCOM_SendData”后,程序会等待一帧发送数据。 更准确地说,程序在“Endpoint_Write_Stream_LE”中的“usbd_endpoint_stream_xmc4000.c”文件中等待。它在“Endpoint_WaitUntilReady()”函数中等待端点准备就绪。

#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 微控制器上工作时,执行时间明显缩短。

以前有人解决过这个问题吗? 有没有办法将数据写入缓冲区,然后让外围设备处理事务而不需要处理器时间? 或者至少在端点准备好事务时触发中断。

【问题讨论】:

    标签: arm usb execution-time


    【解决方案1】:

    如果Endpoint_IsINReady() 返回真,则循环立即终止。也许您应该尝试在您的代码中运行该宏,并且仅在其计算结果为真时才向 USB 主机发送消息。

    此外,为了确保库不使用其阻塞行为,您必须考虑端点缓冲区一次可以容纳多少数据,并确保一次发送的数据不超过该数据. (如果需要,您可以制作自己的缓冲区并将其发送到 USB 库。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-19
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 2014-05-09
      • 1970-01-01
      • 2021-10-10
      相关资源
      最近更新 更多