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.

[参考译文] SIMPLELINK-CC32XX-SDK:在不同任务中、recv 和 accept 之间的竞争状态会导致 CC32XX 驱动程序崩溃

Guru**** 2553450 points


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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1126263/simplelink-cc32xx-sdk-race-condition-between-recv-and-accept-in-different-tasks-makes-crash-cc32xx-driver

器件型号:SIMPLELINK-CC32XX-SDK

重现错误的步骤:

-下载 https://gentil.com/tmp/bug-cc32xx.zip
-使用您的 SSID/密码更新 credentials.h
-编译项目并在 LaunchPad-CC3235SF 上运行
-在 PC 上编译 trigger.c (gcc trigger.c)并运行./a.out
-在 UART 控制台中看到驱动程序出现故障

伪代码:

01静态空任务 Client_(UArg0、UArgarg1){
02 while (1){
03 semaphore_pend (sem、BIOS_wait_forever);
04
05 //this line 是一种权变措施
06 //Task_sleep (_10ms);
07 int n = recv (ClientSocket、buf、sizeof (buf)、0);
08 printf ("接收%d\r\n"、n);
09 Close (ClientSocket);
10}
11}
12.
13 void server (int port){
14 //此行会产生问题
15 int ss = socket (AF_iNet、SOCK_STREAM、0);
16.
17 int ServerSocket = socket (AF_iNet、SOCK_STREAM、0);
18 int ret = BIND (ServerSocket、(struct sockadr *)&server_address、sizeof (server_address));
19 ret =侦听(ServerSocket、16);
20 while (1){
21 ClientSocket =接受(ServerSocket、NULL、NULL);
22 if (ClientSocket <= 0){
23 printf ("错误接受%d\r\n"、ClientSocket);
24次返回;
25}否则
26 Semaphore_post (SEM);
27}
28}


问题出在第06行和第14行。

近况如何?
CC32XX 会打开第一个套接字。
CC32XX 会打开第二个套接字、绑定并侦听它。
CC32XX 接受连接、并在单独的任务中使用 recv 接收数据。
这会导致 CC32xx 驱动程序崩溃:
[ERROR]-致命错误:检测到驱动程序中止

似乎接受和选择之间存在竞争条件。 CC32XX 内核似乎在第一个数据包之前操作套接字。 如果在一个单独的任务中数据的接收被触发得太快、并且在原始任务中被触发接受、则驱动程序中会出现问题。

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

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

我希望 TI 能够识别该错误。 提前感谢。

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

    您好、Greg、

    我们将对此进行研究、并尽快返回给您。

    BR、

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

    我无法打开 zip 文件。 您可以将其上传到此主题吗?

     以下行是否与错误相关? (代码中未使用"ss"):

    int ss = socket(AF_INET, SOCK_STREAM, 0);

    这是否一致? (每次 从第一个接受的套接字开始时都会发生什么情况?)

    您是否在 SimpleLinkFatalErrorEventHandler 发生时尝试检查调用栈(例如通过设置断点)?