优化信号更新指令执行 2963/target/2 2965/1 2965/head
author孙春阳 <snickersun@163.com>
Tue, 23 Dec 2025 11:27:16 +0000 (19:27 +0800)
committer孙春阳 <snickersun@163.com>
Tue, 23 Dec 2025 11:27:16 +0000 (19:27 +0800)
code/sdk/open_source/openharmony/third_party/lwip/lwip_adapter/liteos/src/arch/sio.c
code/sdk/zhihui/4g/cat1Service/Service/cat1_server.c

index 3fb708d..158819d 100644 (file)
@@ -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;
index 80daedc..d2a9f7a 100644 (file)
@@ -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{