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.

[参考译文] LAUNCHXL-CC3235S:任务的传输速度和连续执行

Guru**** 2487425 points
Other Parts Discussed in Thread: LAUNCHXL-CC3235S

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1200910/launchxl-cc3235s-transmission-speed-and-continuous-execution-of-a-task

器件型号:LAUNCHXL-CC3235S

您好、TI 团队:

我正在开发一个应用程序、旨在执行以下操作:

  • 将一个 LaunchXL-CC3235S 配置为接入点、另一个配置为基站。  
  • 在 AP 和 STA (全双工、双向)之间连续传输数据。

对于这两项要求、我开发了附加应用。 同样、我面临以下问题:

  1. 变速箱速度似乎很慢。 我几乎每秒会收到一条消息。 对此可以做些什么吗? 我的最低要求是4 Mbps。 如何提高数据速率?如何验证数据速率是否相同?  
  2. 程序中的 socket_task 具有随机执行。 有时发送577条消息、有时发送5444、有时发送389条消息。 (我尝试了三次迭代)这应该是连续的。 正如我已经写入的两个计数器、它应该运行50000 x 50000次而不停止或切换。 我无法理解为什么程序会停止当前执行并切换回 MAIN_Thread 任务?

e2e.ti.com/.../AP_5F00_28Feb2023_5F00_main_5F00_FreeRTOS.c

e2e.ti.com/.../AP_5F00_28Feb2023_5F00_platform.c

e2e.ti.com/.../STA_5F00_28Feb2023_5F00_main_5F00_FreeRTOS.c

e2e.ti.com/.../STA_5F00_28Feb2023_5F00_platform.c

请告诉我、如果需要我提供有关此方面的任何其他信息。

此致、

H C 特里维迪

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

    除了上面提到的问题、我还有一个问题、如下所示:

    我可以用 FreeRTOS 任务替换 spawn_thread 吗? 如果是,如何?  

    此致、

    H C 特里维迪

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

    您好!

    我建议您看看 SDK 中的示例。

    具体来说、您可以在 network_terminal 示例中查看 UDP 或 TCP 客户端和服务器。

    在您的代码中、似乎您在使用 UDP (原因何在?) 而不是更可靠的 TCP。 此外,SOCKET_CONNECT()通常用于 TCP 中。 这就是为什么我要问的原因。

    声称您无法完成完整的50000次循环意味着崩溃。 您能否调试应用并检测应用发生的位置/时间?

    看起来你的套接字任务()有2048字节的堆栈大小,而你定义了一个1460字节的接收缓冲区(并且有更多的变量和调用)。 最好是将接收缓冲区移到函数之外、或者至少增大堆栈大小、以免发生堆栈溢出。

    此致、

    Shlomi.

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

    感谢你的评分

    我建议您看一下 SDK 中的示例。

    我已经参考了 SDK 中针对 UDP Echo 提供的示例。 与示例相关的更改如下:

    • 整个示例基于 POSIX 线程。 我已将其中的大部分修改为 FreeRTOS 任务。  
    • 该示例使用的是 BSD 套接字、而我使用的是 simplelink 套接字。
    • 该示例实现了回显接收到的数据包的 Echo 任务。 我将生成我自己的计数器并传输数据。
    在您的代码中,您似乎在使用 UDP (有什么原因?) 而不是更可靠的 TCP。 此外,SOCKET_CONNECT()通常用于 TCP 中。 这就是我问的原因。

    我想使用 UDP 协议作为我考虑的终端应用、它是视频传输。 socket_connect ()函数是因为我使用的是 TI 文档 SWRU455中指定的面向连接的 UDP 协议。 因此、我将使用 sendto 命令、而不是使用 sendto 命令。  

    无法完成50000个周期的声明意味着崩溃。 您可以调试应用程序并检测应用程序发生的位置/时间吗?

    如何调试? 我尝试运行代码4次。 发布此查询后、我第四次运行代码时、它达到了5990值。 然后、它切换回 main_thread 并停留在 while (1)语句上。 我的 socket_task 的优先级高于 main_thread。 在这种情况下、逻辑上不应切换回 main_thread、除非 vTaskDelay 有益。 是这样吗?

    似乎你的套接字任务()有2048字节的堆栈大小,而你定义了1460字节的接收缓冲区(还有更多的变量和调用)。 最好是您可以将接收缓冲区移到函数之外、或者至少增加堆栈大小、这样就不会发生堆栈溢出。

    我先来看一下、大家知道增加堆栈大小是否会有所不同。 如果是、则说明金额。

    除了上面提到的问题、我还有一个问题、如下所示:

    我可以用 FreeRTOS 任务替换 spawn_thread 吗? 如果是,如何?  

    [/报价]

    此外、您对此有什么想法吗?

    此致、

    H C 特里维迪

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我将给它一个机会,让你知道,增加堆栈大小是否会有差异。 如果是、则显示金额。

    您好 Shlomi:

    我尝试将 socket_task 的栈大小增加到4096、并检查了结果。 计数器值上升到7900、然后切换回 MAIN_Thread。 您是否仍然认为层叠大小仍然是一个问题?

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

    您好!

    很难辨别导致应用程序停止工作的原因及其卡住的地方。

    4096字节的堆栈大小应该足够、因此我不会这么做。

    为了知道如何调试以及它卡住的地方、我会使用 IDE 一步一步地运行、看看它什么时候卡住(以及发生这种情况时调用堆栈是什么)。

    使用 FreeRTOS 进行调试会有点困难(使用 TIRTOS 时、可以通过 ROV 进行更好的调试)。

    Shlomi.

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

    您好 Shlomi:

    我已经在代码运行时逐步检查。 然而,这种行为是完全随机的! 有时在512消息传输时停止、有时在9970时停止、有时在5990等 我还针对 FreeRTOS 提供的各种钩子程序编写了代码、以便对是否有程序进行调试。 然而,这也没有任何帮助。

    我还尝试了另外一件事。 我使用 FreeRTOS 创建了队列。 从任务向队列传递值并在套接字任务中获取值。 这也产生了相同的结果。 一段时间后、任务执行停止并返回到主线程 while (1)语句。 我根本不明白是什么导致任务返回到主线程。  

    您能建议一些权变措施吗?

    此致、

    H C 特里维迪

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

    您好!

    我无法解释为什么它会在没有调试的情况下保留 while (1)。

    是否修改了两侧(基站和 AP)的堆栈大小?

    也许只是为了测试看看,如果你移动到 TCP 或甚至单向工作会发生什么,即一侧只发送,另一侧接收。

    此致、

    Shlomi.

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

    您好 Shlomi:

    是的、我已经修改了 AP 端和 STA 端的堆栈大小。

    也许只是为了测试,看看如果您迁移到 TCP 或甚至是单向工作,即一方只发送,另一方接收,会发生什么情况。

    说得好。 我将尝试一下。

    此致、

    H C 特里维迪

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

    你提到它到主线程的 wile (1)、例如、它是否在套接字线程上打印"Out of infinite loop"? 我想了解您是缓慢地离开任务(按顺序)、还是因为某种原因而导致任务崩溃、而没有任何合理的轨道。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    例如,它是否在套接字线程上打印"Out of infinite loop"?

    您好 Shlomi、它不会打印"在套接字外发送和接收无限循环!!" 它直接切换到主线程。

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

    至少就任务优先级而言、看起来没关系、因为 socket_task 的优先级是4、这个优先级比 MAIN_Thread 的优先级高1。

    在这种情况下、任务崩溃(内存溢出或其他原因)、或者任务仍在运行但未获取时隙。

    我可以在 freeRTOSconfig.h 上看到 include_eTaskGetState 已设置、因此您可以请求任务状态(您需要查看 FreeRTOS 文档)。

    可以先将 include_xTaskGetSchedulerState 设置为1,然后在代码中使用 xTaskGetSchedulerState,这样就可以用来获取该状态。

    Shlomi.

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

    我可以在 freeRTOSconfig.h 上看到 include_eTaskGetState 已设置、因此您可以请求任务状态(您需要查看 FreeRTOS 文档)。

    可以先将 include_xTaskGetSchedulerState 设置为1,然后在代码中使用 xTaskGetSchedulerState,这样就可以用来获取该状态。

    [/报价]

    我将尝试整合这一点、并告诉您。  

    此外,我尝试传输只(和左接收部分注释),它起作用。 如果您希望了解、我可以在这里分享代码供您参考。  

    此外、在任何情况下、您对如何将 FreeRTOS 和 TCP 库整合到 CCS 工作区有什么想法吗? 我介绍了一些基于 FreeRTOS 的 UDP 实现和套接字任务实现、似乎要简单得多。 它们在阻塞模式下使用 sl_recv 等效功能。 因此、任务执行会变得简单得多。  

    谢谢

    H C 特里维迪

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

    好的、谢谢。 请告诉我。

    奇怪的是 TX 只起作用。 由于 RX 缺省情况下处于阻塞模式,这意味着如果另一端不发送,那么任务应该等待 sl_Recv ()调用。

    你可以做的另一个实验是工作在非阻塞,所以如果没有什么等待 sl_Recv (),你应该得到一个错误 EAGAIN ,然后再次调用 sl_Recv (),通过这种方式,任务将始终在它得到时间时执行。

    不确定最后一个问题。

    Shlomi.

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

    您好 Shlomi:

    我认为我的代码是有效的。 现在、它同时连续发送和接收数据。  

    我仍然不清楚如何实施 MCS (调制和编码技术)以及如何配置传输和接收的数据速率。 您能帮助吗?

    此致、

    H C 特里维迪

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

    您好!

    您能详细说明一下具体意思吗?

    您是否指控制 Wi-Fi MCS 速率(如 MCS0-MCS7)的方法?

    在这种情况下、没有办法控制它、因为它是自动设置为固件速率调整的一部分(根据链路条件、重新传输等)。

    Shlomi.

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

    您好 Shlomi:

    您是不是指控制 Wi-Fi MCS 速率(如 MCS0-MCS7)的方法?

    是的、我的意思完全相同。  

    如果是这种情况,则无法控制它,因为它自动设置为固件速率调整的一部分(根据链路条件、重新传输等)。

    我认为这是关于吞吐量。 但在开始时、您应该能够根据802.11 b/g/n 协议设置调制方案和信息速率。 配置与协议和 MCS 相关的设备后、应定义基本信息速率。 信息速率应根据环境条件、链路条件和其他参数而有所不同(低于我们最初设置的速率)。

    供参考:

    https://community.cisco.com/t5/wireless-mobility-knowledge-base/802-11ac-mcs-rates/ta-p/3155920

    https://d2cpnw0u24fjm4.cloudfront.net/wp-content/uploads/MCS-Index-802.11n-and-802.11ac.pdf

    此外、在 simplelink 套接字 API 中、定义了一些枚举、例如 SL_SOCK_TX_RATE_1M 和许多其他枚举。  

    此致、

    H C 特里维迪

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

    您好!

    我知道 MCS 速率、但并不意味着我们有 API 来强制指定速率。

    您将讨论的定义是、绕过 Wi-Fi MAC 层并直接在 Wi-Fi 无线电(收发器模式)上工作、然后您可以控制特定速率。

    但当您连接到 AP 时、它不会处于工作模式。

    Shlomi.

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

    您好 Shlomi:

    即使我的 CC3235本身是 AP、此功能也不可用吗?

    Br

    H C 特里维迪

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

    您好!

    很遗憾、它不存在。 即使在 Linux 中,您也可以选择11n/11a ,是/否,但不是特定的价格。

    Shlomi.

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

    您好!

    那么、如果是无线视频通信系统、其中 CC3235将以1Mbps 的速率从摄像头接收数据、如果 CC3235以其他速率无线传输、那就不会有任何问题了?

    特里韦迪

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

    尊敬的 Trivedi:

    如果 WiFi 与当前 UDP 吞吐量一起高于1Mbps、则所有吞吐量都是可以的。 但如果吞吐量 较低、则不起作用。

    当然、从 CC3235读取视频流的客户端(软件)需要具有自己的缓冲区。 对于本地网络的视频流、最好使用 UDP、甚至在多个客户端的情况下使用 UDP 多播。 RTP 很常用。

    1月

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

    你好,Jane,

    我仅使用基于 UDP 协议的流媒体、客户端也仅使用 CC3235。 如果我将两个器件都放置在消声室中、距离为1m 的视线内、我是否能够预测/测量/计算近似的信息速率/吞吐量?  

    特里韦迪

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

    尊敬的 Trivedi:

    当然可以。 您知道通过 UDP 发送了多少数据以及发送间隔是什么。 但最好在客户端进行测量。

    1月

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

    抱歉、Jan、我仍然不明白。 我来解释一下我所做的工作。

    1. 我将一个 CC3235配置为 AP、另一个配置为 STA。  
    2. 然后我创建了两个逐个运行的 FreeRTOS 任务。 发送任务将计数器传输(从现在开始)到 STA、接收任务接收 STA 发送的消息。
    3. 发送后,假设50计数,我介绍 vTaskDelay (500). 这将为传输任务的执行带来500个周期的延迟。

    在这种情况下、

    1. 如何计算吞吐量?
    2. 如何在客户端/STA 端执行测量?

    此致、

    特里韦迪

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

    尊敬的 Trivedi:

    您知道发送了多少字节(服务器端)或接收了多少字节(客户端)。 您知道间隔时间(第一个数据包和最后一个数据包之间的时间)。  因此您可以计算吞吐量。 在客户端进行测量时、如果 UDP 数据包具有某种数据包 ID (数据包编号)、则可以计算数据包丢失率。

    1月