This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TM4C1294KCPDT:USB 环形缓冲器问题

Guru**** 2224720 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/784426/tm4c1294kcpdt-usb-ring-buffer-question

器件型号:TM4C1294KCPDT

您好!  

  我尝试使用 USB 环形缓冲器 来处理通过 CAN 传入的一些数据。 我可以将其初始化为我喜欢的任何大小(我需要大约512)、一切都很好。 但是、如果我尝试添加超过64的数据、我会遇到错误。  

是否在某个地方有一个硬限制编码、以防止索引超过63?  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Patrick:

     您能不能显示您的代码、在这里、您可以将环形缓冲区大小指定为512、以及如何将数据添加到环形缓冲区。 如需了解更多相关信息、我们的 USB 专家可以更轻松地发表评论。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的。 我要这么做。

    但是现在 USBRingBuffer?没有硬性限制。 它就像任何其他数据结构一样、仅受存储器和智能编程的限制?

    任何溢出、流量不足、索引问题等 都可能与代码相关。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Patrick:
    Ring 缓冲区应该是一个基于软件的数据结构,它使用固定大小的缓冲区。 大小应受内存量的限制。

    您是否尝试将 USB 环形缓冲器实现方案重复用于 CAN 数据接收? 昨天晚上我没有仔细阅读您的问题。 如果是这种情况、您需要自行进行一些调试。 我不建议您将 USB 环形缓冲器重复用于其他外设、因为我们没有看到任何人这样做。 如果您可以让它用于其他出色的外设、并且您可以与社区分享。 尽管如此、在应用中处理环形缓冲器可能会更容易。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    最后回到这个问题

    //declarations

    #define Rb_size 64
    uint8_t incoming_message[RB_SIZE];
    tUSBRingBufObject Incoming_traffy_buffer;

    在 main I run 中:

     USBRingBufInit (&Incoming_traffer_buffer、Incoming_message、rb_size);

    写入缓冲器的示例是  

     USBRingBufWrite (&Incoming_traffect_buffer、(incoming.pui8MsgData+1)、(incoming.ui32MsgLen-1));

    读数的一个示例是:

    USBRingBufRead (&Incoming_traffer_buffer、ReadServiceResponse、Incoming_message_length);

     

    写入和读取在一个事务中完成。 即请求数据、从机器获取数据、放入缓冲区、从缓冲区读取数据并执行操作。  

    在我需要接受一些更大的任务之前、环形缓冲器使它变得非常容易。 只要上述#define Rb_size 为64或更小、我就没有问题

    将其提高到65或更高、所有这些都崩溃。 我认为上述说法没有任何根本错误。 如果有任何帮助,将不胜感激。  

    患者

     

     

     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Pat:
    您是否可以尝试增大堆栈大小、或许是当前堆栈大小的两倍? 您会看到有什么不同吗? 您的堆栈大小是多少?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    已经尝试过。 运气差。  

    我只是总结我的代码中发生了一些更阴险的事情。 一些边界错误、内存泄漏等  

    必须尝试重写。 可能是 USBRingBuffer 的结束。 嗯  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Patrick:
    请务必与社区分享您的发现和新解决方案。 我相信这将使寻求相同解决方案的人受益。 我现在将关闭该线程。 如果您有新问题、请打开一个新主题。 当您有要与社区共享的新解决方案时、您可以稍后回复此主题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Patrick:

    [引用 user="Patrick murphy"] CAB 只是总结我的代码中发生了一些更阴险的事情。 某些边界错误、内存泄漏等[/引用]

    正如 Charles 似乎建议的那样、请使用(ringbuffer.c) driverlib 工具文件夹。 USBRingBuffer()链接到 USB 库层,并在支持64字节数据包的复合 USB 设备结构之间进行网格化。 另一个缓冲模块可以轻松处理512字节数据包  ;-)