From df8eda8eccc6fd342268c63268220c598145664f Mon Sep 17 00:00:00 2001 From: =?utf8?q?=E5=AD=99=E6=98=A5=E9=98=B3?= Date: Tue, 23 Dec 2025 19:27:16 +0800 Subject: [PATCH] =?utf8?q?=E4=BC=98=E5=8C=96=E4=BF=A1=E5=8F=B7=E6=9B=B4?= =?utf8?q?=E6=96=B0=E6=8C=87=E4=BB=A4=E6=89=A7=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../lwip/lwip_adapter/liteos/src/arch/sio.c | 42 +++++++++++++++---- .../4g/cat1Service/Service/cat1_server.c | 16 +++++-- 2 files changed, 47 insertions(+), 11 deletions(-) diff --git a/code/sdk/open_source/openharmony/third_party/lwip/lwip_adapter/liteos/src/arch/sio.c b/code/sdk/open_source/openharmony/third_party/lwip/lwip_adapter/liteos/src/arch/sio.c index 3fb708d62..158819d48 100644 --- a/code/sdk/open_source/openharmony/third_party/lwip/lwip_adapter/liteos/src/arch/sio.c +++ b/code/sdk/open_source/openharmony/third_party/lwip/lwip_adapter/liteos/src/arch/sio.c @@ -62,7 +62,7 @@ #define SIO_PING_PONG_TIMEOUT_MS 30 // buffer超时时间(30ms) /* SIO中断消息队列配置 */ -#define SIO_IRQ_MSG_QUEUE_SIZE 16 // 队列深度 +#define SIO_IRQ_MSG_QUEUE_SIZE 32 // 队列深度(从16增加到32,减少队列满的情况) #define SIO_IRQ_PROCESS_TASK_PRIO 24 // 处理线程优先级 #define SIO_IRQ_PROCESS_STACK_SIZE 4096 // 处理线程栈大小 @@ -175,9 +175,13 @@ static void (*g_sio_data_callback)(const uint8_t *data, uint32_t len) = NULL; /* CAT1投票管理:记录最后接收数据的时间,用于idle检测 */ static uint32_t g_sio_last_rx_time_ms = 0; static bool g_sio_cat1_vote_added = false; +static volatile bool g_sio_cat1_vote_needed = false; // 标志:需要在处理线程中添加CAT1投票 #define SIO_CAT1_VOTE_IDLE_MS 10000 // 10秒idle后移除投票 #endif +/* 统计打印标志:需要在独立线程中打印统计信息 */ +static volatile bool g_sio_stats_print_needed = false; + /* 内部函数声明 */ @@ -244,6 +248,15 @@ static void sio_irq_process_thread(void *arg) buffer->state = SIO_BUFFER_STATE_PROCESSING; +#ifdef SUPPORT_CAT1_SERVICE + // ✅ 优先级1优化:在处理线程中执行CAT1投票管理(避免在中断中执行) + if (g_sio_cat1_vote_needed) { + cat1_api_add_cat1_vote(); + g_sio_cat1_vote_needed = false; + g_sio_cat1_vote_added = true; + } +#endif + // 如果设置了数据回调,调用它(给SLIP使用) if (g_sio_data_callback != NULL) { g_sio_data_callback(buffer->data, msg.length); @@ -251,6 +264,12 @@ static void sio_irq_process_thread(void *arg) g_sio_stats.total_bytes_processed += msg.length; + // ✅ 优先级2优化:在处理线程中检查并打印统计信息(避免在定时器回调中阻塞) + if (g_sio_stats_print_needed) { + sio_print_stats(); + g_sio_stats_print_needed = false; + } + // 释放buffer buffer->state = SIO_BUFFER_STATE_EMPTY; buffer->write_pos = 0; @@ -316,10 +335,11 @@ static void sio_timeout_timer_callback(unsigned long arg) timer_call_count, g_sio_interrupt_enabled, g_sio_timer_running); } - // 每333次(约10秒)打印一次完整统计信息 + // ✅ 优先级2优化:定时器中只设置标志,不直接打印(避免阻塞定时器线程) + // 每333次(约10秒)设置打印标志 // 30ms * 333 ≈ 10秒 if ((timer_call_count % 333) == 0 && g_sio_debug_enabled) { - sio_print_stats(); + g_sio_stats_print_needed = true; // 只设置标志,不直接打印 } if (!g_sio_interrupt_enabled || !g_sio_timer_running) { @@ -439,11 +459,11 @@ static void sio_uart_rx_interrupt_handler(const void *buffer, uint16_t length, b g_sio_stats.total_bytes_received += length; #ifdef SUPPORT_CAT1_SERVICE - // ✅ CAT1投票管理:收到数据时,更新接收时间并添加投票 + // ✅ 优先级1优化:中断中只设置标志,不直接调用投票函数(避免在中断中执行可能涉及锁的操作) g_sio_last_rx_time_ms = g_sio_timer_timestamp_ms; if (!g_sio_cat1_vote_added) { - cat1_api_add_cat1_vote(); - g_sio_cat1_vote_added = true; + g_sio_cat1_vote_needed = true; // 只设置标志,由处理线程执行 + g_sio_cat1_vote_added = true; // 防止重复设置标志 } #endif @@ -840,7 +860,15 @@ errcode_t sio_interrupt_disable(void) // 6. 清零统计 memset(&g_sio_stats, 0, sizeof(sio_stats_t)); - +#ifdef SUPPORT_CAT1_SERVICE + // 重置CAT1投票相关标志 + g_sio_cat1_vote_needed = false; + g_sio_cat1_vote_added = false; + g_sio_last_rx_time_ms = 0; +#endif + + // 重置统计打印标志 + g_sio_stats_print_needed = false; g_sio_interrupt_enabled = false; g_sio_irq_process_task = 0; diff --git a/code/sdk/zhihui/4g/cat1Service/Service/cat1_server.c b/code/sdk/zhihui/4g/cat1Service/Service/cat1_server.c index 80daedc7e..d2a9f7a02 100644 --- a/code/sdk/zhihui/4g/cat1Service/Service/cat1_server.c +++ b/code/sdk/zhihui/4g/cat1Service/Service/cat1_server.c @@ -1502,12 +1502,20 @@ static void time_sync_func(void) cat1_gettime(); #endif static uint8_t g_signal_already_updated = 0; - static uint8_t g_ws_idle = 1; //ToDo:此处应该从系统中获取业务是否执行,只有空闲状态才可以更新。 - if (cat1_api_need_update_signal() && (g_signal_already_updated == 0 || g_ws_idle == 1) ) + static uint8_t g_ws_idle = 0; //ToDo:此处应该从系统中获取业务是否执行,只有空闲状态才可以更新。 + static uint8_t need_update_signal = 0; + need_update_signal = cat1_api_need_update_signal(); + cat1_print_info("g_signal_already_updated %d , g_ws_idle %d, need_update_signal %d\n", + g_signal_already_updated, g_ws_idle, need_update_signal); + + if (need_update_signal && (g_signal_already_updated == 0 || g_ws_idle == 1) ) { - cat1_getsignal(); + // cat1_getsignal(); + cat1_cmd_send(CMD_4G_GET_SIGNAL,NULL,0); + #ifdef BOARD_LEINIAO - cat1_gettime(); + // cat1_gettime(); + cat1_cmd_send(CMD_4G_GET_TIME,NULL,0); #endif g_signal_already_updated = 1;//已经更新过信号,设置标志位,防止多次更新,符合条件(屏幕亮起)只需要更新一次。 }else{ -- 2.17.1