添加AT^PMVETOGET获取投票信息,AT^TASKSWITCHPRINT开启task切换打印
author孙春阳 <snickersun@163.com>
Wed, 15 Oct 2025 11:13:58 +0000 (19:13 +0800)
committer孙春阳 <snickersun@163.com>
Wed, 15 Oct 2025 11:13:58 +0000 (19:13 +0800)
code/sdk/application/wstp/at_service/app/app_at_process.c
code/sdk/application/wstp/at_service/app/app_cmd_manager.c
code/sdk/application/wstp/at_service/app/app_msg_manager.h
code/sdk/kernel/liteos/liteos_v207.1.0/Huawei_LiteOS/kernel/base/include/los_task_pri.h
code/sdk/kernel/liteos/liteos_v207.1.0/Huawei_LiteOS/kernel/base/sched/sched_sq/los_sched.c

index 25d054a..e839528 100644 (file)
@@ -1267,6 +1267,38 @@ static void pm_print_veto_info(void)
     }\r
 }\r
 \r
+static void pm_print_active_veto_info(void)\r
+{\r
+    uint8_t i = 0;\r
+    uint8_t active_count = 0;\r
+    pm_veto_t *pm_veto_ptr = pm_veto_get_info();\r
+    \r
+    wstp_print("========== PM Active Veto Info ==========\r\n");\r
+    wstp_print("Total votes: %d\r\n", pm_veto_ptr->veto_counts.total_counts);\r
+    \r
+    if (pm_veto_ptr->veto_counts.total_counts == 0) {\r
+        wstp_print("No active votes.\r\n");\r
+    } else {\r
+        wstp_print("Active votes:\r\n");\r
+        for (i = 0; i < PM_ID_MAX; i++) {\r
+            if (pm_veto_ptr->veto_counts.sub_counts[i] > 0) {\r
+                wstp_print("  [%d] %s: %d vote(s)\r\n", \r
+                           i, \r
+                           get_pm_id_name(i), \r
+                           pm_veto_ptr->veto_counts.sub_counts[i]);\r
+                active_count++;\r
+            }\r
+        }\r
+        wstp_print("Total active modules: %d\r\n", active_count);\r
+    }\r
+    \r
+    if (pm_veto_ptr->veto_timeout_timestamp > 0) {\r
+        wstp_print("Veto timeout timestamp: %llu ms\r\n", pm_veto_ptr->veto_timeout_timestamp);\r
+    }\r
+    \r
+    wstp_print("========================================\r\n");\r
+}\r
+\r
 static void lpc_print_veto_info(void)\r
 {\r
     uint8_t i = 0;\r
@@ -1289,6 +1321,36 @@ uint32_t mcu_pm_dfx_mode(uint8_t *para, uint32_t para_len)
     return ERRCODE_SUCC;\r
 }\r
 \r
+uint32_t mcu_pm_veto_get(uint8_t *para, uint32_t para_len)\r
+{\r
+    unused(para);\r
+    unused(para_len);\r
+\r
+    pm_print_active_veto_info();\r
+    return ERRCODE_SUCC;\r
+}\r
+\r
+uint32_t mcu_task_switch_print_ctrl(uint8_t *para, uint32_t para_len)\r
+{\r
+    unused(para_len);\r
+    \r
+    if (para == NULL) {\r
+        wstp_print("Usage: AT^TASKSWITCHPRINT=<0|1>\r\n");\r
+        wstp_print("  0: Disable task switch print\r\n");\r
+        wstp_print("  1: Enable task switch print\r\n");\r
+        return ERRCODE_FAIL;\r
+    }\r
+\r
+    uint32_t enable = atoi((char*)para);\r
+    \r
+    extern void OsTaskSwitchPrintSetEnable(uint32_t enable);\r
+    OsTaskSwitchPrintSetEnable(enable);\r
+    \r
+    wstp_print("Task switch print %s\r\n", enable ? "enabled" : "disabled");\r
+    \r
+    return ERRCODE_SUCC;\r
+}\r
+\r
 uint32_t mcu_pm_cldo1_power_down(uint8_t *para, uint32_t para_len)\r
 {\r
     unused(para);\r
@@ -2762,6 +2824,8 @@ static const app_process_table g_app_funcs[] = {
     { PMMODESET,            mcu_pm_req_mode },\r
     { PMMODEUSR,            mcu_set_pm_req_mode_usr},\r
     { PMMODEGET,            mcu_pm_dfx_mode },\r
+    { PMVETOGET,            mcu_pm_veto_get },\r
+    { TASKSWITCHPRINT,      mcu_task_switch_print_ctrl },\r
     { GETCURSEC,            mcu_dfx_get_cur_second},\r
     { LCDFILL,              lcd_fill },\r
     { GETIDS,               get_ids },\r
index 9c80140..1bc3008 100644 (file)
@@ -387,6 +387,28 @@ static uint32_t app_test_pm_dfx_mode(uint8_t *para, uint32_t para_len, char *str
     return ERRCODE_SUCC;\r
 }\r
 \r
+static uint32_t app_test_pm_veto_get(uint8_t *para, uint32_t para_len, char *str_cmd)\r
+{\r
+    unused(str_cmd);\r
+    if (para == NULL) {\r
+        return ERRCODE_FAIL;\r
+    }\r
+\r
+    app_pkg_msg_send(PMVETOGET, DIAG_CONTROL_FALSE, para, para_len);\r
+    return ERRCODE_SUCC;\r
+}\r
+\r
+static uint32_t app_test_task_switch_print(uint8_t *para, uint32_t para_len, char *str_cmd)\r
+{\r
+    unused(str_cmd);\r
+    if (para == NULL) {\r
+        return ERRCODE_FAIL;\r
+    }\r
+\r
+    app_pkg_msg_send(TASKSWITCHPRINT, DIAG_CONTROL_FALSE, para, para_len);\r
+    return ERRCODE_SUCC;\r
+}\r
+\r
 static uint32_t app_test_pm_lcd_off(uint8_t *para, uint32_t para_len, char *str_cmd)\r
 {\r
     unused(str_cmd);\r
@@ -1118,6 +1140,8 @@ static const at_cmd_table_t g_app_cmd[] = {
     { "AT^PMMODE",       app_test_pm_req_mode,              "" },\r
     { "AT^PMMODESETUSR", app_test_set_pm_req_mode,          "" },\r
     { "AT^PMMODEGET",    app_test_pm_dfx_mode,              "" },\r
+    { "AT^PMVETOGET",    app_test_pm_veto_get,              "" },\r
+    { "AT^TASKSWITCHPRINT", app_test_task_switch_print,     "" },\r
     { "AT^GETCURSEC",    app_get_cur_second,                "" },\r
     { "AT^LCDFILL",      app_test_lcd_fill,                 "" },\r
     { "AT^LCDLIGHT",     app_test_lcd_light,                "" },\r
index 4456e83..286ac96 100644 (file)
@@ -117,6 +117,8 @@ typedef enum {
     SCHEDSTART          = 0x56,\r
     SCHEDSTOP           = 0x57,\r
     SDIOTEST            = 0x58,\r
+    PMVETOGET           = 0x59,  // 新增:获取PM投票信息\r
+    TASKSWITCHPRINT     = 0x5A,  // 新增:控制任务切换打印\r
     MSG_ID_MAX_BUTT,\r
 } app_msg_id;\r
 \r
index 8d9e396..b671e1d 100644 (file)
@@ -136,6 +136,10 @@ extern UINT32 OsShellCmdDumpTask(INT32 argc, const CHAR **argv);
 #define OS_ALL_TASK_MASK  0xFFFFFFFF
 extern UINT32 OsDbgTskInfoGet(UINT32 taskId);
 extern UINT32 OsGetIdleTaskId(VOID);
+
+/* Task switch print control */
+extern UINT32 OsTaskSwitchPrintIsEnabled(VOID);
+extern VOID OsTaskSwitchPrintSetEnable(UINT32 enable);
 extern CHAR *OsCurTaskNameGet(VOID);
 extern VOID OsTaskAdd2TimerList(LosTaskCB *taskCB, UINT32 timeout);
 extern VOID OsTimerListDelete(LosTaskCB *taskCB);
index 8bfe315..537023e 100644 (file)
 #include "los_perf_pri.h"
 #endif
 
+/* 全局变量:控制任务切换打印开关(默认关闭)*/
+static volatile UINT32 g_taskSwitchPrintEnable = 0;
+
+/* 获取任务切换打印开关状态 */
+UINT32 OsTaskSwitchPrintIsEnabled(VOID)
+{
+    return g_taskSwitchPrintEnable;
+}
+
+/* 设置任务切换打印开关 */
+VOID OsTaskSwitchPrintSetEnable(UINT32 enable)
+{
+    g_taskSwitchPrintEnable = enable ? 1 : 0;
+    if (enable) {
+        printf("[TASK_SWITCH] Task switch print enabled\n");
+    } else {
+        printf("[TASK_SWITCH] Task switch print disabled\n");
+    }
+}
+
 VOID OsSchedResched(VOID)
 {
     LosTaskCB *runTask = NULL;
@@ -72,6 +92,15 @@ VOID OsSchedResched(VOID)
     newTask->currCpu = ArchCurrCpuid();
 #endif
 
+    /* 任务切换打印(由全局开关控制)*/
+    if (g_taskSwitchPrintEnable) {
+        const char *runTaskName = (runTask->taskName != NULL) ? runTask->taskName : "NULL";
+        const char *newTaskName = (newTask->taskName != NULL) ? newTask->taskName : "NULL";
+        printf("[TASK_SWITCH] %s(ID:%u) -> %s(ID:%u)\n", 
+              runTaskName, runTask->taskId, 
+              newTaskName, newTask->taskId);
+    }
+
     OsTaskTimeUpdateHook(runTask->taskId);
 
 #ifdef LOSCFG_KERNEL_CPUP