From: hcj <1224667075@qq.com> Date: Fri, 1 Aug 2025 03:26:03 +0000 (+0800) Subject: 修改ai线程启动限制,防止因操作过快导致的线程锁死问题 X-Git-Url: http://git.snicker.com.cn/css/static/gitweb.css?a=commitdiff_plain;h=8ab41447ae5ffc3672221ea18770a3a33f4d1472;p=mirrors%2FFD230.git 修改ai线程启动限制,防止因操作过快导致的线程锁死问题 --- diff --git a/code/sdk/drivers/peripheral/slip/cat1Service/cat1_ai_server.cpp b/code/sdk/drivers/peripheral/slip/cat1Service/cat1_ai_server.cpp index 3c6823ee6..0247e7d34 100644 --- a/code/sdk/drivers/peripheral/slip/cat1Service/cat1_ai_server.cpp +++ b/code/sdk/drivers/peripheral/slip/cat1Service/cat1_ai_server.cpp @@ -56,7 +56,7 @@ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ - +#include "cmsis_os2.h" #include "bk_websocket.h" #include @@ -106,6 +106,12 @@ WebSocketClient *chat_client=NULL; WebSocketClient *tts_client=NULL; +static int asr_client_ping=0; + +static int tts_client_ping=0; + +static int chat_client_ping=0; + errcode_t chat_server_init(void); @@ -527,7 +533,7 @@ void bk_websocket_demo(void *data) { // uapi_start_tts_single_txt("2025英超夏季转会窗分阶段开启第一阶段2025å¹´6月1日至2025å¹´6月11日凌晨2:00北京时间第二阶段常规夏窗2025å¹´6月16日至2025å¹´9月2日凌晨2:00北京时间本贴将持续更新2025年夏窗以曼联转会相关为主的新闻和消息。"); } - + printf("chat_client succ"); // send_ai_txt(1,"你是谁"); set_ai_chat_service_init_flag(1); @@ -541,7 +547,15 @@ void bk_websocket_demo(void *data) { printf("disconnect_server chat_client"); break; } - chat_result_analysis(recv_buf); + if(type==WS_PONG) + { + chat_client_ping=0; + } + else + { + chat_result_analysis(recv_buf); + } + if(chat_reconnect==1) { break; @@ -559,7 +573,12 @@ void bk_websocket_demo(void *data) { goto char_reconnet; } is_bk_websocket_chat=0; - return ; + + chat_client_ping=0; + + // osThreadExit(); + printf("bk_websocket_demo end\r\n"); + return; } } @@ -575,27 +594,48 @@ void bk_websocket_demo(void *data) { #define CAT1_SERVICE_TASK_PRIO 5 +app_task_definition_t chat_taskcfg={0}; +// typedef enum { +// osThreadInactive = 0, ///< Inactive. +// osThreadReady = 1, ///< Ready. +// osThreadRunning = 2, ///< Running. +// osThreadBlocked = 3, ///< Blocked. +// osThreadTerminated = 4, ///< Terminated. +// osThreadError = -1, ///< Error. +// osThreadReserved = 0x7FFFFFFF ///< Prevents enum down-size compiler optimization. +// } osThreadState_t; errcode_t chat_server_init(void) { - if(chat_client || is_bk_websocket_chat) + int osThreadGetState_t= osThreadGetState(chat_taskcfg.task_handle); + + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"chat osThreadGetState_t %d!\r\n",osThreadGetState_t); + if(osThreadGetState_t!=osThreadReady && osThreadGetState_t!=osThreadError && osThreadGetState_t !=osThreadInactive) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"osThreadGetState is %d!\r\n",osThreadGetState_t); + return ERRCODE_FAIL; + } + + if(chat_client || is_bk_websocket_chat ) { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"cat1_tcp_server_init is connet!\r\n"); return ERRCODE_FAIL; } WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"cat1_tcp_server_init !\r\n"); - app_task_definition_t taskcfg={0}; - taskcfg.create_queue_handle = NULL; - taskcfg.attr.name="chat_server_init"; - taskcfg.attr.priority = TASK_PRIORITY_APP; - taskcfg.attr.stack_size = 0x1000; - taskcfg.func = bk_websocket_demo; - taskcfg.use_mem = USE_EXTEND_MEM; + + chat_taskcfg.create_queue_handle = NULL; + chat_taskcfg.attr.name="chat_server_init"; + chat_taskcfg.attr.priority = TASK_PRIORITY_APP; + chat_taskcfg.attr.stack_size = 0x1000; + chat_taskcfg.func = bk_websocket_demo; + chat_taskcfg.use_mem = USE_EXTEND_MEM; + + - errcode_t ret=uapi_create_osThread_custom(&taskcfg); + errcode_t ret=uapi_create_osThread_custom(&chat_taskcfg); if(ret != ERRCODE_SUCC) @@ -832,7 +872,7 @@ const char* ws_snicker_test_server_url="ws://110.42.224.129:8910/asr/ws"; int g_test_server_index = 0; //0 正式版本, 1 测试版本, 2 Snicker 服务器测试版本 -static int asr_client_ping=0; + int asr_client_sockfd_last_id=-1; @@ -985,9 +1025,19 @@ void bk_websocket_asr(void *data) { } + app_task_definition_t asr_taskcfg={0}; errcode_t asr_server_init(void) { + int osThreadGetState_t= osThreadGetState(asr_taskcfg.task_handle); + + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"chat osThreadGetState_t %d!\r\n",osThreadGetState_t); + if(osThreadGetState_t!=osThreadReady && osThreadGetState_t!=osThreadError && osThreadGetState_t !=osThreadInactive) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"osThreadGetState is %s!\r\n",osThreadGetState_t); + return ERRCODE_FAIL; + } + if(is_bk_websocket_asr || asr_client!=NULL) { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"cat1_tcp_server_init is connet!\r\n"); @@ -996,15 +1046,15 @@ errcode_t asr_server_init(void) WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"asr_server_init !\r\n"); - app_task_definition_t taskcfg={0}; - taskcfg.create_queue_handle = NULL; - taskcfg.attr.name="asr_server_init"; - taskcfg.attr.priority = TASK_PRIORITY_APP; - taskcfg.attr.stack_size = 0x1000; - taskcfg.func = bk_websocket_asr; - taskcfg.use_mem = USE_EXTEND_MEM; + + asr_taskcfg.create_queue_handle = NULL; + asr_taskcfg.attr.name="asr_server_init"; + asr_taskcfg.attr.priority = TASK_PRIORITY_APP; + asr_taskcfg.attr.stack_size = 0x1000; + asr_taskcfg.func = bk_websocket_asr; + asr_taskcfg.use_mem = USE_EXTEND_MEM; - errcode_t ret=uapi_create_osThread_custom(&taskcfg); + errcode_t ret=uapi_create_osThread_custom(&asr_taskcfg); if(ret != ERRCODE_SUCC) @@ -1264,7 +1314,7 @@ void bk_websocket_tts(void *data) { } else { - printf("tts_client init_websocket_client succ \r\n"); + printf("tts_client init_websocket_client succ \r\n"); break; } } @@ -1324,6 +1374,10 @@ void bk_websocket_tts(void *data) { bk_websocket_tts_tick=0; // tts_paly(); } + if(type==WS_PONG) + { + tts_client_ping=0; + } // aer_result_analysis(asr_recv_buf); } @@ -1345,30 +1399,42 @@ void bk_websocket_tts(void *data) { } tts_reconnect=0; } - // return; + } - is_bk_websocket_tts=0; + is_bk_websocket_tts=0; + tts_client_ping=0; + return; } +app_task_definition_t tts_taskcfg={0}; errcode_t tts_server_init(void) { + int osThreadGetState_t= osThreadGetState(tts_taskcfg.task_handle); + + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"tts osThreadGetState_t %d!\r\n",osThreadGetState_t); + if(osThreadGetState_t!=osThreadReady && osThreadGetState_t!=osThreadError && osThreadGetState_t !=osThreadInactive) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"osThreadGetState is %d!\r\n",osThreadGetState_t); + return ERRCODE_FAIL; + } if(tts_client!=NULL || is_bk_websocket_tts) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"osThreadGetState is %d!\r\n",osThreadGetState_t); return ERRCODE_FAIL; } WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"tts_server_init !\r\n"); - app_task_definition_t taskcfg={0}; - taskcfg.create_queue_handle = NULL; - taskcfg.attr.name="tts_server_init"; - taskcfg.attr.priority = TASK_PRIORITY_APP; - taskcfg.attr.stack_size = 0x1000; - taskcfg.func = bk_websocket_tts; - taskcfg.use_mem = USE_EXTEND_MEM; + + tts_taskcfg.create_queue_handle = NULL; + tts_taskcfg.attr.name="tts_server_init"; + tts_taskcfg.attr.priority = TASK_PRIORITY_APP; + tts_taskcfg.attr.stack_size = 0x1000; + tts_taskcfg.func = bk_websocket_tts; + tts_taskcfg.use_mem = USE_EXTEND_MEM; - errcode_t ret=uapi_create_osThread_custom(&taskcfg); + errcode_t ret=uapi_create_osThread_custom(&tts_taskcfg); if(ret != ERRCODE_SUCC) @@ -1425,45 +1491,84 @@ int32_t uapi_tts_paly_stop(void) void asr_server_deinit(void) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"WS_CLOSE"); - send_websocket_message(asr_client,(uint8_t *)"WS_CLOSE",strlen("WS_CLOSE"),WS_CLOSE); + + if(send_websocket_message(asr_client,(uint8_t *)"WS_CLOSE",strlen("WS_CLOSE"),WS_CLOSE)) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"WS_CLOSE"); + } } void chat_server_deinit(void) { - send_websocket_message(chat_client,(uint8_t *)"WS_CLOSE",strlen("WS_CLOSE"),WS_CLOSE); + + if(send_websocket_message(chat_client,(uint8_t *)"WS_CLOSE",strlen("WS_CLOSE"),WS_CLOSE)) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"WS_CLOSE"); + } } void tts_server_deinit(void) { - send_websocket_message(tts_client,(uint8_t *)"WS_CLOSE",strlen("WS_CLOSE"),WS_CLOSE); - - + + if(send_websocket_message(tts_client,(uint8_t *)"WS_CLOSE",strlen("WS_CLOSE"),WS_CLOSE)) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"WS_CLOSE"); + } } static void time_sync_func(void) { -if(asr_client) + if(asr_client) { if(asr_client_ping) { - // asr_server_deinit(); - // lwip_close_websocket_client(asr_client); - // asr_client=NULL; + asr_server_deinit(); + lwip_close_websocket_client(asr_client); + asr_client=NULL; } else { - // if(0==send_websocket_message(asr_client,( const unsigned char *)"ping",strlen("ping"),WS_PING)) + if(0==send_websocket_message(asr_client,(uint8_t *)"ping",strlen("ping"),WS_PING)) { asr_client_ping=1; } - } - + } + if(chat_client) + { + if(chat_client_ping) + { + chat_server_deinit(); + lwip_close_websocket_client(chat_client); + chat_client=NULL; + } + else + { + if(0==send_websocket_message(chat_client,(uint8_t *)"ping",strlen("ping"),WS_PING)) + { + chat_client_ping=1; + } + } + } + if(tts_client) + { + if(tts_client_ping) + { + tts_server_deinit(); + lwip_close_websocket_client(tts_client); + tts_client=NULL; + } + else + { + if(0==send_websocket_message(tts_client,(uint8_t *)"ping",strlen("ping"),WS_PING)) + { + tts_client_ping=1; + } + } } } @@ -1480,7 +1585,7 @@ bool init_ai_task(uint8_t type) g_timer_time_sync = osTimerNew((osTimerFunc_t)time_sync_func, osTimerPeriodic, NULL, NULL); if (g_timer_time_sync == NULL) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"g_timer_time_sync create failed\n"); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"g_timer_time_sync create failed\n"); } type_ai=type; uapi_tts_paly_init(); diff --git a/code/sdk/drivers/peripheral/slip/cat1Service/cat1_ws.cpp b/code/sdk/drivers/peripheral/slip/cat1Service/cat1_ws.cpp index 201a2e93e..c3bb8444e 100644 --- a/code/sdk/drivers/peripheral/slip/cat1Service/cat1_ws.cpp +++ b/code/sdk/drivers/peripheral/slip/cat1Service/cat1_ws.cpp @@ -468,7 +468,7 @@ int send_websocket_message(WebSocketClient *client, uint8_t *message, size_t mes if(client==NULL||message==NULL ) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"send_websocket_message client or message is NULL\r\n"); + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"send_websocket_message client or message is NULL %s %s\r\n",client,message); return -1; } uint8_t* frame=( uint8_t *)aic_zalloc(message_len + 50); @@ -870,7 +870,7 @@ client_ERROR: void lwip_close_websocket_client(WebSocketClient *client) { if(client) { - printf("lwip_close_websocket_client "); + printf("lwip_close_websocket_client %s %s",client->host,client->path); lwip_shutdown(client->sockfd,SHUT_RDWR); bk_sleep(10); int err= lwip_close(client->sockfd);