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模块的 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