#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 // 处理线程栈大小
/* 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;
+
/* 内部函数声明 */
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);
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;
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) {
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
// 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;
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{