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.

[参考译文] CC3135:函数_SlDrvWaitForPoolObj 中的阻塞

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1379734/cc3135-blocking-in-function-_sldrvwaitforpoolobj

器件型号:CC3135

工具与软件:

大家好、 我是一名新使用 CC3135模块的 SimpleLink 用户。 我有一个新项目、它允许您打开两个器件之间的套接字。

(带 UART 通信接口) 没有操作系统

我最近注意到、服务器应用程序在源文件 sdk/source/ti/drivers/net/wifi/source/driver.c 下的* SlDrvWaitForPoolObj*函数内随机崩溃
在 while 中、当调用 sl_Recv ()函数时。  根据我所观察到的情况、突出显示的条件仍然为真、代码保持在这里。 挂起元素的地址(0x0)。

我不明白在这个函数中为什么会阻止它。

有人知道吗?

我提前感谢您。

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

    您好!

    "待定元素的地址"是什么意思?

    您能否共享应用的代码片段?

    Shlomi

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

    您好、感谢您的回复。
    在此环路中、有线路

    /* wait for action to be free */
    (void)_SlDrvSyncObjWaitForever(&g_pCB->ObjPool[CurrObjIndex].SyncObj);


    或 g_pcb->ObjPool[Current ObjIndex]。 SyncObj 为空。

    这两个设备通过 Modbus TCP 进行通信。

    最大的问题是误差在6到20个小时之间随机发生

    我插入了使用的函数:

    int16_t wireless_simplelink_init(char *ssid, char *pass, uint8_t channel) {
        
        int16_t sl = sl_WifiConfig();
        
        if (sl >= 0)
        {
            if(ssid != NULL) 
            {
                // printf("\r\nsl_Start");
                sl_Start(NULL, NULL, NULL);
                
                // ssid string of 32 characters
                sl = sl_WlanSet(SL_WLAN_CFG_AP_ID, SL_WLAN_AP_OPT_SSID, strlen(ssid), (const uint8_t *)ssid);
                
                // pass string of 64 characters
                if(pass != NULL) sl = sl_WlanSet(SL_WLAN_CFG_AP_ID, SL_WLAN_AP_OPT_PASSWORD, strlen(pass), (const uint8_t *)pass);
                
                _u8 val = SL_WLAN_SEC_TYPE_WPA;
                sl = sl_WlanSet(SL_WLAN_CFG_AP_ID, SL_WLAN_AP_OPT_SECURITY_TYPE, 1, (_u8 *)&val);
                
                val = channel ? channel : 1;
                sl = sl_WlanSet(SL_WLAN_CFG_AP_ID, SL_WLAN_AP_OPT_CHANNEL, 1, (_u8 *)&val);
                
                val = 1; //_u8 Enabled5GStatus = 1;
                sl = sl_WlanSet(SL_WLAN_CFG_GENERAL_PARAM_ID, SL_WLAN_GENERAL_PARAM_OPT_ENABLE_5G, sizeof (_u8), (_u8 *)&val);
                
                _u16 max_ap_sta_aging = 10; // (seconds) Set Max station aging time - default is 60 seconds
                sl_WlanSet(SL_WLAN_CFG_AP_ID, SL_WLAN_AP_OPT_MAX_STA_AGING, sizeof(max_ap_sta_aging), (_u8 *)&max_ap_sta_aging);
                
                /* For changes to take affect, we restart the NWP
                 */
                sl = sl_Stop(200);
                
                sl = sl_Start(NULL, NULL, NULL);
            }
            
            if (sl < 0) {
                sl = -1;
            }
        } else {
            #if defined(_DEBUGINITPRINTF)
            _DEBUGINITPRINTF("\r\nsl_WifiConfig failed: %i", sl);
            #endif
        }
        
        return sl;
    }
    int16_t wireless_simplelink_Open(void) {
        // printf("\r\nsl_Start");
        int16_t sl = sl_Start(NULL, NULL, NULL);
    
        cc3135Module.cc3135_socket = sl_Socket(SL_AF_INET, SL_SOCK_STREAM, 0);
        SlSockNonblocking_t nonBlocking = {.NonBlockingEnabled = 1};
        sl_SetSockOpt(cc3135Module.cc3135_socket, SL_SOL_SOCKET, SL_SO_NONBLOCKING, &nonBlocking,
                sizeof (SlSockNonblocking_t));
    
        /* create socket */
        SlSockAddrIn_t LocalAddr;
        LocalAddr.sin_family = SL_AF_INET;
        LocalAddr.sin_port = sl_Htons(((uint16_t) 2000));
        LocalAddr.sin_addr.s_addr = sl_Htonl(SL_IPV4_VAL(200, 200, 200, 1));
        /* Bind socket to local port */
        // printf("\r\nsl_Bind");
        sl_Bind(cc3135Module.cc3135_socket, (const SlSockAddr_t *) &LocalAddr, sizeof (SlSockAddrIn_t));
    
        /* Listen on the socket. Ready to accept a connection */
        // printf("\r\nsl_Listen");
        sl_Listen(cc3135Module.cc3135_socket, 0);
    
        wirelessModule.token = interruptDispatcher_addCb(wireless_simplelink_accept, &wirelessModule, INT_1S);
        wireless_simplelink_stop_accept();
        
        return sl;
    }
    int16_t wireless_simplelink_send(const uint8_t *buf, uint8_t len) {
        int16_t ret = sl_Send(cc3135Module.cc3135_activeSocket, buf, len, 0);
    
        if (ret < 0) {
            wireless_simplelink_device_disconnected(false);
        }
        
        return ret;
    }
    int16_t wireless_simplelink_recv(uint8_t *buf, uint8_t len) {
    
        int16_t ret = sl_Recv(cc3135Module.cc3135_activeSocket, buf, len, 0);
            
        if (ret == 0) {
            wireless_simplelink_device_disconnected(false);
        }
    }

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

    您好!

    如果 SyncObj 为 NULL、那么您可能会卡住。

    听起来在某个地方存在内存损坏现象。

    SyncObj 全部在初始化期间静态设定并且应该具有有效内存地址。

    此处最好的方法可能是尝试添加一个数据观察点、并在其中一个池对象获得 NULL 时捕获

    BTW、如果在非阻塞模式下工作、send/recv 可能会收到 EAGAIN 错误、这意味着再次尝试、并因任何类型的错误而中止、因此您可能想要更改该错误。

    此致、

    Shlomi