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.

[参考译文] CC3220SF:HTTP 服务器所有线程都被阻止、偶尔出现错误

Guru**** 2484615 points
Other Parts Discussed in Thread: CC3220SF, SYSCONFIG

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1270287/cc3220sf-http-server-all-threads-blocked-bug-apears-sporadically

器件型号:CC3220SF
主题中讨论的其他器件: SysConfig

你好

我在定制电路板上使用 CC3220sf 与 MCU 器件。 cc3220sf (更多文本 wifi 设备)正在基于带 TIRTOS 的便携式示例中的 http 服务器。 MCU 和 WIFI 器件通过 UART 连接。
由于该板通过了 SDK 5、20的 WIFI 认证、因此我们正在使用该 SDK。

问题如下:
我从 wifi 设备连接并打开一个页面。 服务器会返回该页面以及打开该页面所需的所有脚本和图像。 加载 js 后、它会自动发送请求让 Wi-Fi 器件和 MCU 器件进入 UART 通信。 大约每10或20次就有1次,此请求就会失败。 如果发生这种情况,通过 http 服务器的所有请求都将失败。 我们可以获取文件和图像、
我可以重新加载该页面、但 httpServerThread 中的 mq_receive 不会触发。

一旦发生这种错误、在对象视图中可以看到5个线程。 空闲任务正在运行且永不停止、.httpServerThread 在 Task_sleep(2)上被阻止、我在代码中找不到它。
在发生预期事件时 UART TX 线程被阻止。 UART RX 任务在"Unknown "(?)上被阻止、应在 UART Rx 上等待中断(阻止从驱动程序调用 UART2_READ)时阻止、但未知器件可能可疑。 在一个信号量上 sl_Task 被阻止。 我在任何地方都找不到 sl_Task 源代码的 TI RTOS 实现、您能告诉我在 SDK 中的什么位置找到它吗?

所有的任务都没有明确的被阻止、我们无法确定原因。 如果不透露太多的细节,因为我不确定我允许分享什么, UART TX 线程将不会触发没有从 httpServerThread 接收数据. 如果 MCU 未从 Wifi 设备接收到数据、则不会触发 UART RX 线程。 对 http 服务器的所有请求大小相对较小、并且在加载时自动且连续发生、一个接一个。 我们可以看到、第一个请求永远不会触发 mq_receive、但由于错误的零星和不可预测性质、很难确认这一点。

刷新页面会重新加载该页面、但 httpServer 请求仍不会通过。 要使其脱离此受电状态、唯一的方法是将其断电然后再接通。

所有硬件初始化都是使用 Code composer 12中的 SysConfig GUI 完成的。
总而言之,我觉得网络处理器和 M4在 CC3220SF 上的通信有故障,但一直无法找出原因(两个多星期了)。 它显然我缺少一些关键的信息来修复它。

请告知

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

    要添加一些问题:如何自动发送文件? 网络处理器是否会处理此问题?

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

    更新:我发现任务 SLEEP 实际上来自 Network_if_InitDriver 函数、也就是最后一个 else 块。
    该器件以 AP 模式启动、但每当发生此错误时、都不会设置 STATUS_BIT_IP_AQUEST 的 g_ulStatus 位
    此特定位的 SET_STATUS_BIT 仅在 SimpleLinkNetAppEventHandler 中调用、我不会在代码中的任何位置进行明确调用、并且在我基于该操作的服务器代码中的任何位置都找不到它。

    错误仍然是零星的,发生在每一个在10或20重新启动。 请告知

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

    是的、网络处理器处理对文件系统的直接访问。

    仅当在 ROM 或文件系统中找不到匹配项时、它才会将请求转发给主机(详情请参阅 编程人员指南第9章的详细信息)

    然后,它应该由 SimpleLinkNetAppRequestEventHandler ()接收-如果您没有更改代码,应该会在那里打印("[HTTP 服务器任务] NetApp Request received.")。 您能看到这个吗?

    sl_Task 在主机驱动程序中实现(在 source/ti/drivers/net/WIFI/source/spawn.c 中(请参阅 _SlInternalSpawnTaskEntry)。

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

    如果  IP 地址丢失(应在 SimpleLinkNetAppEventHandler 中处理标志、您可以在其中添加日志消息)-您可能会在网络中遇到问题。 但原因不清楚。  

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

    Kobi、感谢您的答复、我有更多信息。 我在您提到的位置找到了 sl_Task。
    显示驱动程序和这种 UART 用法目前在定制板上不可用、因为它已连接到 MCU 器件、我可以尝试从 LaunchXL 板运行它并报告我的发现、因为我们现在知道 UART 任务本身不是问题。

    为了便于参考、我使用 TI Simplelink Academy 修改了可移植示例

    您能否确认一些内容:sl_Task 是主处理器和网络处理器之间通信的负责人? 大多数 Network_if 函数都由 sl_Task 触发?

    我对 http 服务器线程有疑问:
    依次调用 sl_Start 和 sl_Stop、然后清除 Network_IF_ResetMCUStateMachine 中的状态位、再在 Network_IF_InitDriver 中再次调用 sl_Start。 网络处理器多次启动的原因是什么?(据我所知、sl_Start 是什么功能?)

    根据我所见、调用了 SimpleLinkNetAppEventHandler、并发生 IPv4事件、设置了 STATUS_BIT_IP_AQUIRED、前提是假设这是第一个 sl_Start 的结果。 然后返回 ResetMCUStateMachine。 之后、当错误不发生且一切正常时、会再次设置 STATUS_BIT_IP_AQUIRED。 但是、当错误发生时、不再设置该位、且 IP 地址(网关和站点)读为0。 Im 完全不知道为什么会发生这种情况。

    但是、SSID 仍然可以通过任一方式开始广播、我可以连接到它。 如前所述、仍然可以从文件系统中获取文件、但所有服务器请求始终无法到达服务器

    由于器件处于 AP 模式、因此 STATUS_BIT_IP_AIL 的确切含义是什么?

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

    sl_Task 处理  从 NWP 到主机的通信(命令响应、异步事件和 Rx 数据)。 该线程将调用所有异步事件处理程序。

    主机命令(和数据)在调用方(即应用)的线程上下文中执行(每个命令块直到收到即时响应、像"sl_Receive"这样的阻止命令 将阻塞、直到发生相关事件、例如将发生数据接收)。  

    器件的某些配置(特别是 NetApp 服务配置)将不会发生、直到 NWP 被重置-从而导致 sl_Stop/sl_Start。

    您可以在 程序员指南 (特别是附录 B.1)中阅读相关内容。

    在 AP 模式下-  当 AP 正常工作时、STATUS_BIT_IP_AIL 将立即返回。

    我需要查看一些日志来帮助解决确切的问题、但此处的信息应该可以帮助您检查应用程序代码以消除可能的竞态条件。  

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

    因此、我想我对此有一个意外的意想不到的解决方法。

    因为我们使用了保留温度互斥量和温度线程的可移植示例声明、以及这两个线程的参数初始化。 Hovewer 线程甚至没有创建(定义甚至缺失, temperature.c 甚至不是项目的一部分),并且线程在 ROV 中不可见。

    删除这些声明和参数初始化似乎已修复问题。 我没有解释,我希望可能有一个 Gurus 这样做,也许是一些我不知道的 TIRTOS。 不确定它是否解决了,或者我只是使这个错误更加不常见,但到目前为止,它没有保留。 无论哪种方法、我都会将该线程标记为已解决