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.

[参考译文] CCS/TM4C1290NCPDT:TivaWare USB 回调函数执行上下文。

Guru**** 2538950 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/895105/ccs-tm4c1290ncpdt-tivaware-usb-callback-function-execution-context

器件型号:TM4C1290NCPDT

工具/软件:Code Composer Studio

你(们)好  我将使用 TivaWare 库实现 CDC USB 器件。

用户回调函数、例如 pfnCallback、uint32_t ControlHandler (...)、uint32_t TxHandler (...)、etc.running 是否处于中断上下文中?

谢谢、Doug

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

    Doug、您好!

    我不知道。 中断处理程序是 usbdenum.c 文件中的 USBDeviceIntHandlerInternal。 它不会更改任何回调。

    如果您需要一个正常工作的单端口 CDC 示例-我有一个示例、它今天在这里共享: http://e2e.ti.com/support/microcontrollers/other/f/908/p/894599/3309448#3309448

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

    您好、Ralph、

    感谢您的反馈和示例代码。  我的问题是:如果回调没有在中断上下文中运行、那么它如何获取程序计数器?  我不会定期调用任何 USB 函数来提供它。

    谢谢、Doug

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

    Doug、您好!

    我认为 USB 回调函数不需要程序计数器。 他们的名字可能不是很好。 这是很久以前开发的、命名规则并不总是符合现代标准。

    回调函数通常仅在发生某种情况时使用、以更改为其指定回调的数据。 例如、接口的回调用于更改接口配置的数据。 它不会在中断上运行、而只是每个更改该数据类型的 API、然后获取回调并为其更改数据。

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

    ???  要使任何程序运行它、当然、必须让程序计数器指向要运行的指令。

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

    Doug、您好!

    很抱歉、如果我不清楚、我的意思是他们不需要将 PC 从蓝色中取出、并且在将 PC 用于任何其他结构/缓冲器等函数内之前、不需要"给" PC。 所有这些都是在文献目录内发生的。 回调在函数中用于来回传递数据。 重点是没有需要考虑的中断上下文(可能超出在 ISR 中使用的范围、但如果我理解正确、这并不是问题所在)。 不确定这是否有道理、我不擅长解释 USB 库的工作原理、因为我没有设计它、它的架构是... 假设是"独特"、并保留它。

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

    你(们)好。

    除非我缺少某些内容,否则在非 RTOS 环境中,只有来自调用 main()的控制线程,以及在处理中断时发生的异步控制线程。

    我认为正在发生的情况是:芯片中的 USB 控制器为各种 USB 事件生成中断、还具有自己的"系统节拍"来定期运行堆栈、因此我认为回调必须在中断上下文中运行。  现在、我将假定情况如此、并使我的回调函数保持较短的状态、将传递数据和事件同步到我的"while (1)"循环、并在该"前景"过程中执行任何繁重的处理。

    如果有人知道、USB 回调是否在中断上下文中运行、这仍然是一个好消息。

    谢谢、Doug

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

    有人??  如果我的假设是正确的、那么文档中应该明确说明这一点。

    谢谢、Doug

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

    Doug、您好!

    对于在美国的 TI、我们今天是很好的周五假期、但我会尝试回答更多问题...

    根据我的解释、最初提出的问题是、列出的 USB 回调是否始终在 usblib 实现中的中断上下文下运行。  因此、我特别关注中断上下文术语、以思考是否直接从 usblib 内的中断中调用中断、而不从"典型应用"的角度进行查看。

    那么、让我们后退一步、分解库与应用。

    在 USB 库中、您提到的回调并不是在中断上下文下专门执行的。  USBDeviceIntHandlerInternal 中提供了一些用于断开、挂起、恢复、低功耗等的回调。

    在典型的 USB 应用中、多次使用中断来触发对 USB 缓冲器的读取/写入。 在这种情况下、您引用的回调将在中断上下文下处理。 这是在应用程序级别定义的、具体取决于您的实现。 您不必执行此操作、但大多数情况下、这是最佳方法、通常会推荐。 因此、在该设置中、是的、现在可以说回调是在中断上下文中处理的。

    很抱歉、我对您所询问的内容的理解不正确、但我从来没有很清楚、我们只是从应用角度谈论这一点、因为它在实施方面存在差异。

    关于文档、由于中断上下文基于应用程序、我个人看不到与此相关的文档空白、但我们可能必须同意不同意... 这是第一次出现这些问题。

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

    您好、Ralph、

    非常感谢您提供的信息、非常感谢。  享受您的周末!

    道格