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.

[参考译文] CC3235SF:如何在 SlNetSock 中调试2005错误?

Guru**** 2550040 points
Other Parts Discussed in Thread: CC3235SF

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1125870/cc3235sf-how-to-debug-a-2005-error-in-slnetsock

器件型号:CC3235SF

我将一个与 POSIX 兼容的应用从 Linux 移植到 CC32xx。 它在 Linux 上运行良好。 在 CC3235SF Launchpad 上、在"接受"期间、我收到 一个 slnetsock 错误2005。

这意味着内核 slnet 逻辑在某种程度上失败了。 如何进一步调试? 如何获得有关正在发生的情况以及 slnet 内部的问题的更多信息?

该错误出现在以下 POSIX 逻辑期间:

套接字(...
绑定(...
监听(...
while (1){
客户端=接受(...
mycreatethread (...) //与客户端执行操作,包括创建不同的套接字

它在第 n 个客户端连接时发生。 我已经检查并调试了我的代码:我真的不认为我有 stackoverflow 或线程问题。 我的应用程序不会崩溃。slnetsock 不再工作。

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

    您好!

    没有错误代码2005、但我假设您看到错误-2005 (sl_api_aborted)、对吧? 您是否看到任何异步错误处理程序(SimpleLinkGeneralEventHandlerSimpleLinkFatalErrorEventHandler)? 您使用的 SDK 版本是什么? 您在设备内上传了什么 ServicePack 版本? 您使用什么 RTOS?

    BTW...您是否确定没有与存储器相关的问题(例如、无法分配存储器、堆碎片等)? 由于内存足够、与内存分配相关的错误可能会隐藏在 Linux 计算机上。

    或者、您可以捕获 NWP 日志并将其上传到此处、以便 TI 端进行分析。 更多信息、请参见第20章的 SWRU455

    1月

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

    是的、它是-2005错误。

    我真的确定我没有内存问题、因为我真的检查了两次(三次)检查了前面的所有内容。

    我的版本为:

    CCS 12.0.0.00009
    SIMPLELINK:6.10.00.05
    驱动程序:3.0.1.71
    MAC 31.3.7.0.1
    PHY 3.1.0.26
    NWP 4.13.0.2
    ROM 8738

    我 正在使用多个插座、这让我在芯片上感到困惑!  我尝试从简单的问题中提取出来:打开两个连续的套接字 会在套接 字在"接受"之后处理时产生问题(相同的逻辑在 Linux 上工作):

    int s1 = socket (AF_iNet、SOCK_STREAM、0);
    int s2 = socket (AF_iNet、SOCK_STREAM、0);
    绑定(...
    监听(...
    接受(...

    我还尝试:

    int s1= SlNetSock_create (AF_iNet、SOCK_STREAM、0、SLNETIF_ID_1、0);
    int s2 = SlNetSock_create (AF_iNet、SOCK_STREAM、0、SLNETIF_ID_2、0);

    执行以下操作后:

    SlNetif_add (SLNETIF_ID_x、"CC32xx"、(const SlNetif_Config_t *)和 SlNetIfConfigWifi、1);/x 为1至16

    我在 SimpleLink 中找不到处理多个套接字的示例。

    NWP 日志输出是否可读? ( pdf 显示"控制台输出应不可读。"我不确定如何解释)。

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

    您好!

    您的 SDK 版本和 ServicePack 看起来正常。 您是否看到通过异步处理程序报告的任何错误?

    如果不调试真实代码、很难说出您的错误。 但我非常确信、多个同时连接的客户端的 TCP 服务器在 CC32xx 器件上工作时不会出现任何问题。 我在现场拥有数千个具有此功能的器件。

    是的、NWP 日志是一个二进制文件、可通过 TI 专有工具进行解码。 如果您在此处上传捕获的 NWP 日志、TI 工程师可以检查是否存在明显错误。

    1月

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

    这是一个简单的20行示例、用于重现错误。 下载 https://gentil.com/tmp/bug-cc32xx.zip

    问题出在伪代码.c 的第3行和第12行:

    1静态 void * taskClient_(void * arg){
    2 //取消注释以解决方法
    3 //Task_sleep (_10ms);
    4 int n = recv (ClientSocket、buf、BUFSIZE、0);
    5 printf ("接收%d\r\n"、n);
    6关闭(ClientSocket);
    7返回0;
    8}
    9.
    10 void main(){
    11 //问题的原因
    12 int makeitfail = socket (AF_iNet、SOCK_STREAM、0);
    13 int ServerSocket = socket (AF_iNet、SOCK_STREAM、0);
    14 bind (ServerSocket、(struct sockaddr *)&server_address、sizeof (server_address));
    15 Listen (ServerSocket、SOMAXCONN);
    16 while (1){
    17 ClientSocket =接受(ServerSocket、NULL、NULL);
    18 pthread_create (&thread、&pAttrs、taskClient_、NULL);
    19}
    20}

    近况如何?
    设备打开第一个套接字。
    设备打开第二个套接字、绑定并侦听它。
    器件接受连接、并在新线程中使用 recv 立即接收数据。
    这会导致 CC32xx 驱动程序崩溃。

    如果不读取内核代码、很难说、但内核似乎在第一个数据包之前操纵套接字、如果触发接收速度太快、则驱动程序中会出现问题。

    如果您取消注释第3行并休眠10毫秒、一切都很好。

    如果您对第12行进行注释、一切都很好、因为只有一个套接字、并且在接收数据之前内核中可能没有对套接字进行"操作"。

    首先、我希望 TI 能够识别该错误。 请下载 https://gentil.com/tmp/bug-cc32xx.zip。 我在这个问题上浪费了几天时间。

    其次、我的问题是、我有一个更复杂的符合 POSIX 标准的应用程序、该应用程序会创建大量套接字、而 CC32xx 无法运行它、并且始终会崩溃。

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

    您好!

    遗憾的是、我没有为调试 TI-RTOS 7设置调试环境。 如需更深入的调试代码、请等待 TI 的回答。

    我快速查看了您的代码和一些提示(可能与您的问题无关):

    • 您不需要接受()中的错误代码,这可能会导致在客户端任务中使用无效的套接字句柄
    • 静态句柄(ClientSocket)和缓冲区(buf)将导致接受第二个套接字时出现问题
    • CC3235支持多达16个同步 crated 套接字、因此您无法使用 SOMAXCONN = 40
    • 我没有对代码进行深入检查、 但有人说、您可能对任务的优先级也有问题(您需要意识到 RTOS 调度程序的工作原理与 Linux 调度程序的工作原理不同)。
    • 在每个接受后创建新任务会浪费大量的周期、并且可能会由于内存碎片而导致堆问题。 更好的方法是在开始时创建所有客户端任务、并在接受后解除阻止任务(例如使用消息队列)。

    至少第一点是代码中的严重错误。 可能与您的问题无关、但肯定会导致代码崩溃。

    1月

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

    "至少第一点是您的代码中的严重错误。":TI 代码有一个严重缺陷、可在20行代码中显示、您告诉我我有严重错误!!! 开玩笑吗??? 真的吗?

    我已重新上传测试用例。 SOMAXCONN 已被置为16。 已选中接受退货。 在任何情况下、问题都会出现在第一个迭代中、接受不会在那里失败。

    为什么要讨论静态初始化? 在任何情况下、 如果我 睡觉、即使在第200次接受后也不会崩溃。

    测试用例在256KB 中消耗20KB 的静态存储器、并且您正在谈论堆碎片?????

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

    您好!

    不,我不开玩笑。 我将为您在此处提供的代码提供注释。 我如何知道您的"完整"代码不受该问题的影响? 正如我已经说过的、这些错误不太可能与您的问题有关、但仍需要解决。

    正如我说过的、我没有设置调试环境来调试您的代码。 我在我的应用程序中测试了代码的套接字部分(SDK 6.10、最新 ServicePack、TI-RTOS 6、XDCtools 3.51.3.28)、并且看不到任何驱动程序崩溃。 因此、请等待 TI 方的回答。

    • 我不理解你对堆的评论。 您已在链接器文件中设置32kB。 堆是从编译期间静态链接的.priheap 存储器段分配的。 我不知道如何将32kB 堆放入20kB 中。
    • 您的客户端任务分配2kB、SL_任务4kB。 让我们尝试打开13个客户端连接、您将脱离堆内存。 BTW...尽管这不是问题的原因、但将 POSIX 和本机 RTOS API 混合使用会使代码读取工作稍微复杂化。

    1月

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

    您不是来帮助您、而是来帮助您。

    我浪费了整整一周的时间来解决这个问题、我提供了一个有文件记录的错误、并提供了一个简单的案例来重现这个问题。

    您甚至还没有测试我的示例!!!

    您不是评论真正的问题、而是评论其他没有影响且与错误无关的问题。

    我只能将缓冲区大小设置为1个字节、我可以将接受待办事项设置为1、错误仍然存在。 那么、混合 TI-RTOS 和 POSIX 代码有什么问题:TI 是否禁止它? TI 是否禁止使用多个 pthread????

    我将重新打开有关此错误的干净线程。

    不再评论我的主题帖。 你在浪费我的时间并污染我的报告。 您显然不能在这里帮助客户。

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

    已在 以下位置打开了一份更干净的报告:e2e.ti.com/.../simplelink-cc32xx-sdk-race-condition-between-recv-and-accept-in-different-tasks-makes-crash-cc32xx-driver

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

    您好!

    我从未在这个论坛上遇到任何人、我回答了数千个最终用户的问题。 我已在我的环境中测试过您的用例(如上所述)、但未显示问题。 很抱歉、当我讨论您代码中的其他错误时、您很生气。 但我认为这个错误也很重要。 BTW...您从未回答过我关于异步处理程序的问题,我问过两次。 这个问题非常重要。 它可能表示驱动程序崩溃的原因或 sl_task()问题。

    从技术上讲、不禁止混合两个线程抽象层、但实际上在某些情况下、这可能会导致问题。 使用多个任务中的 SL_ API 不是问题。 使用从多个任务中选择并从异步处理程序调用 sl_ API 可能会有问题(但您在上面的代码中没有这样做)。

    1月