重现错误的步骤:
-下载 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 能够识别该错误。 提前感谢。