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.

[参考译文] 编译器/TM4C1294NCPDT:使用 LWIP 的线程问题

Guru**** 2595805 points
Other Parts Discussed in Thread: TM4C1294NCPDT

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/739000/compiler-tm4c1294ncpdt-threading-question-using-lwip

器件型号:TM4C1294NCPDT

工具/软件:TI C/C++编译器

大家好、我最近在 LWIP 用户论坛上发布了以下内容、但它看起来相当不活跃、因此我希望这里的人能够提供帮助:

我在 TI Tiva 微控制器(TM4C1294NCPDT)上使用 LWIP 进行 TCP/IP 通信。  TI 的 TivaWare 包中包含 LWIP 1.4.1。  我已经了解到 LWIP 不是线程安全的、但是、我不确定在我使用它的上下文中、它在单核 TI Tiva 微控制器上没有操作系统。

它看起来是在 SysTick 中断期间 LWIP 在 Tiva 上的工作方式、您调用 lwIPTimer 函数、为其提供了大量的处理时间。  然后、lwIPTimer 触发 Tiva 的以太网中断并在给定的时间内进行处理。
在 lwIPTimer 函数内、我可以在触发 Tiva 以太网中断的代码行上方看到以下注释:
  //
  //生成以太网中断。  这将执行实际工作
  //检查 lwIP 计时器并采取适当的操作。  这是
  //需要,因为 lwIP 不可重入,这允许对所有 lwIP 调用
  //放置在以太网中断处理程序内,以确保所有调用
  //进入 lwIP 来自相同的上下文,防止任何可重入性
  //问题。  将所有 lwIP 调用置于以太网中断处理程序中
  //避免使用互斥量以避免重新进入 lwIP。
  //
我的当前代码正在调用以太网中断处理程序的 tcp_write()和 tcp_output()*outside *。  我对 tcp_write()和 tcp_output()的调用发生在调用 lwIPTimer()之前的 SysTick 中断中。  这是否违反了上面注释中的建议?  我不确定、因为这些是"tcp_"调用、而不是"lwIP"调用。
是否有人可以澄清?  谢谢你。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

     此 LwIP wiki 链接介绍了如何在线程安全上下文中使用 LwIP。  

    我不是操作系统设计的专家、 通常线程安全意味 着以可保证多个线程同时安全执行的方式操作共享数据结构。

    下面是有关螺纹安全的附加链接。  

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

    [引用用户="Charles Tsaa"]

    线程安全通常是指 以可保证多个线程同时安全执行的方式对共享数据结构进行操作。

    [/报价]

    好的、但我要解决的一点是、如果在 LWIP 文档的上下文中将中断的执行视为单独的线程。  我已经看到了您提到的 LWIP Wiki 文档、对此并不完全清楚(至少对我来说)。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    如果 lwIP 内核一次只能由单个线程访问、那么我认为在您的情况下应该可以。 通常、这是通过让所有 lwIP 处理都由单个线程完成的、而器件驱动程序将数据包传递给该线程进行处理来实现的。

    对于特定于 LwIP 的内容、最好在 LwIP 论坛中提问。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用用户="Charles Tsaaaa">您好、
    如果 lwIP 内核一次只能由单个线程访问、那么我认为在您的情况下应该可以。 通常、这是通过让所有 lwIP 处理都由单个线程完成的、而器件驱动程序将数据包传递给该线程进行处理来实现的。
    [/报价]

    您好、Charles、感谢您提出的其他想法。  我很好奇、当您建议"器件驱动程序将数据包传递到单个 LWIP 线程"时、您说它们应该将数据传递到 LWIP 线程、并且数据应该存储在队列中(例如、在 LWIP 包装程序中) 然后、当 LWIP 中断正在处理时、应该发送队列中的数据?

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

    好的、感谢您提供的信息。  这不是对我的软件的一个微不足道的更改、但可以执行。  如果问题得到解决、我将执行此操作并报告。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    有几个 TivaWare 以太网示例。 我还建议您查看它们。 这些示例是非基于操作系统的、它们使用 LwIP 原始 API。