From e830c51c076bfd610cb6371e2af3fbe9a4272537 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=92=99=E8=92=99plus?= Date: Fri, 12 Sep 2025 16:14:39 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=BA=BF=E7=A8=8B=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E8=BE=93=E5=87=BA=EF=BC=8C=E5=A2=9E=E5=8A=A0CPU?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E7=8E=87=E8=B7=9F=E8=B8=AA=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=EF=BC=8C=E8=B0=83=E6=95=B4=E8=BE=93=E5=87=BA=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/finsh/cmd.c | 52 ++++++++++++++++++++++++++++-------------- include/rtdef.h | 2 ++ src/scheduler_mp.c | 15 +++++++++--- src/scheduler_up.c | 11 ++++++--- 4 files changed, 57 insertions(+), 23 deletions(-) diff --git a/components/finsh/cmd.c b/components/finsh/cmd.c index 14086b83d6e..62b4b4f56dd 100644 --- a/components/finsh/cmd.c +++ b/components/finsh/cmd.c @@ -62,7 +62,7 @@ MSH_CMD_EXPORT(version, show RT-Thread version information); rt_inline void object_split(int len) { - while (len--) rt_kprintf("-"); + while (len--) rt_kputs("-"); } typedef struct @@ -165,7 +165,9 @@ long list_thread(void) rt_list_t *next = (rt_list_t *)RT_NULL; const char *item_title = "thread"; const size_t tcb_strlen = sizeof(void *) * 2 + 2; +#ifdef RT_USING_CPU_USAGE_TRACER const size_t usage_strlen = sizeof(void *) + 1; +#endif int maxlen; list_find_init(&find_arg, RT_Object_Class_Thread, obj_list, sizeof(obj_list) / sizeof(obj_list[0])); @@ -174,23 +176,41 @@ long list_thread(void) maxlen = RT_NAME_MAX; #ifdef RT_USING_SMP - rt_kprintf("%-*.*s cpu bind pri status sp stack size max used left tick error tcb addr usage\n", maxlen, maxlen, item_title); + rt_kprintf("%-*.*s cpu bind pri status sp stack size max used left tick error tcb addr ", maxlen, maxlen, item_title); +#ifdef RT_USING_CPU_USAGE_TRACER + rt_kputs("usage count last time"); +#endif + rt_kputs("\n"); object_split(maxlen); - rt_kprintf(" --- ---- --- ------- ---------- ---------- ------ ---------- -------"); - rt_kprintf(" "); + rt_kputs(" --- ---- --- ------- ---------- ---------- ------ ---------- ------- "); object_split(tcb_strlen); - rt_kprintf(" "); + rt_kputs(" "); +#ifdef RT_USING_CPU_USAGE_TRACER object_split(usage_strlen); - rt_kprintf("\n"); + rt_kputs(" "); + object_split(8); + rt_kputs(" "); + object_split(10); +#endif + rt_kputs("\n"); #else - rt_kprintf("%-*.*s pri status sp stack size max used left tick error tcb addr usage\n", maxlen, maxlen, item_title); + rt_kprintf("%-*.*s pri status sp stack size max used left tick error tcb addr ", maxlen, maxlen, item_title); +#ifdef RT_USING_CPU_USAGE_TRACER + rt_kputs("usage count last time"); +#endif + rt_kputs("\n"); object_split(maxlen); - rt_kprintf(" --- ------- ---------- ---------- ------ ---------- -------"); - rt_kprintf(" "); + rt_kputs(" --- ------- ---------- ---------- ------ ---------- ------- "); object_split(tcb_strlen); - rt_kprintf(" "); + rt_kputs(" "); +#ifdef RT_USING_CPU_USAGE_TRACER object_split(usage_strlen); - rt_kprintf("\n"); + rt_kputs(" "); + object_split(8); + rt_kputs(" "); + object_split(10); +#endif + rt_kputs("\n"); #endif /*RT_USING_SMP*/ do @@ -256,10 +276,9 @@ long list_thread(void) rt_strerror(thread->error), thread); #ifdef RT_USING_CPU_USAGE_TRACER - rt_kprintf(" %3d%%\n", rt_thread_get_usage(thread)); -#else - rt_kprintf(" N/A\n"); + rt_kprintf(" %3d%%%8d%10d", rt_thread_get_usage(thread), thread->ctx_count, thread->ctx_last_time); #endif + rt_kprintf(" \n"); #else ptr = (rt_uint8_t *)thread->stack_addr; while (*ptr == '#') ptr ++; @@ -272,10 +291,9 @@ long list_thread(void) rt_strerror(thread->error), thread); #ifdef RT_USING_CPU_USAGE_TRACER - rt_kprintf(" %3d%%\n", rt_thread_get_usage(thread)); -#else - rt_kprintf(" N/A\n"); + rt_kprintf(" %3d%%%8d%10d", rt_thread_get_usage(thread), thread->ctx_count, thread->ctx_last_time); #endif + rt_kputs("\n"); #endif } } diff --git a/include/rtdef.h b/include/rtdef.h index 2cfec3da0a7..f651efab2e6 100644 --- a/include/rtdef.h +++ b/include/rtdef.h @@ -940,6 +940,8 @@ struct rt_thread #ifdef RT_USING_CPU_USAGE_TRACER rt_ubase_t user_time; /**< Ticks on user */ rt_ubase_t system_time; /**< Ticks on system */ + rt_ubase_t ctx_last_time; /**< Last context switch time */ + rt_ubase_t ctx_count; /**< Context switch count */ #endif /* RT_USING_CPU_USAGE_TRACER */ #ifdef RT_USING_MEM_PROTECTION diff --git a/src/scheduler_mp.c b/src/scheduler_mp.c index c0a546cf08c..d70e1825eb9 100644 --- a/src/scheduler_mp.c +++ b/src/scheduler_mp.c @@ -879,7 +879,10 @@ rt_err_t rt_sched_unlock_n_resched(rt_sched_lock_level_t level) cpu_id, RT_SCHED_PRIV(to_thread).current_priority, RT_NAME_MAX, to_thread->parent.name, to_thread->sp, RT_NAME_MAX, current_thread->parent.name, current_thread->sp); - +#ifdef RT_USING_CPU_USAGE_TRACER + to_thread->ctx_count++; + to_thread->ctx_last_time = rt_tick_get(); +#endif rt_hw_context_switch((rt_ubase_t)¤t_thread->sp, (rt_ubase_t)&to_thread->sp, to_thread); } @@ -980,7 +983,10 @@ void rt_schedule(void) cpu_id, RT_SCHED_PRIV(to_thread).current_priority, RT_NAME_MAX, to_thread->parent.name, to_thread->sp, RT_NAME_MAX, current_thread->parent.name, current_thread->sp); - +#ifdef RT_USING_CPU_USAGE_TRACER + to_thread->ctx_count++; + to_thread->ctx_last_time = rt_tick_get(); +#endif rt_hw_context_switch((rt_ubase_t)¤t_thread->sp, (rt_ubase_t)&to_thread->sp, to_thread); } @@ -1065,7 +1071,10 @@ void rt_scheduler_do_irq_switch(void *context) cpu_id, RT_SCHED_PRIV(to_thread).current_priority, RT_NAME_MAX, to_thread->parent.name, to_thread->sp, RT_NAME_MAX, current_thread->parent.name, current_thread->sp); - +#ifdef RT_USING_CPU_USAGE_TRACER + to_thread->ctx_count++; + to_thread->ctx_last_time = rt_tick_get(); +#endif rt_hw_context_switch_interrupt(context, (rt_ubase_t)¤t_thread->sp, (rt_ubase_t)&to_thread->sp, to_thread); } diff --git a/src/scheduler_up.c b/src/scheduler_up.c index 8099d3d9f35..a1c0b6ece5f 100644 --- a/src/scheduler_up.c +++ b/src/scheduler_up.c @@ -355,10 +355,12 @@ void rt_schedule(void) extern void rt_thread_handle_sig(rt_bool_t clean_state); RT_OBJECT_HOOK_CALL(rt_scheduler_switch_hook, (from_thread)); - +#ifdef RT_USING_CPU_USAGE_TRACER + to_thread->ctx_count++; + to_thread->ctx_last_time = rt_tick_get(); +#endif rt_hw_context_switch((rt_uintptr_t)&from_thread->sp, (rt_uintptr_t)&to_thread->sp); - /* enable interrupt */ rt_hw_interrupt_enable(level); @@ -386,7 +388,10 @@ void rt_schedule(void) else { LOG_D("switch in interrupt"); - +#ifdef RT_USING_CPU_USAGE_TRACER + to_thread->ctx_count++; + to_thread->ctx_last_time = rt_tick_get(); +#endif rt_hw_context_switch_interrupt((rt_uintptr_t)&from_thread->sp, (rt_uintptr_t)&to_thread->sp, from_thread, to_thread); }