From 5e85ac8faebe6ffdb8988a9b736d352508f3fc9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=92=99=E8=92=99plus?= Date: Thu, 24 Sep 2026 16:11:10 +0800 Subject: [PATCH 1/3] =?UTF-8?q?[drivers][ipc]=20=E7=A7=BB=E9=99=A4=20SCons?= =?UTF-8?q?cript=20=E4=B8=AD=E5=86=97=E4=BD=99=E7=9A=84=20=5F=5FRT=5FIPC?= =?UTF-8?q?=5FSOURCE=5F=5F=20=E5=AE=8F=E5=AE=9A=E4=B9=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/drivers/ipc/SConscript | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/drivers/ipc/SConscript b/components/drivers/ipc/SConscript index 892701733c59..51215156ae35 100644 --- a/components/drivers/ipc/SConscript +++ b/components/drivers/ipc/SConscript @@ -13,7 +13,7 @@ if not GetDepend('RT_USING_SMP'): else: SrcRemove(src, 'completion_up.c') -group = DefineGroup('DeviceDrivers', src, depend = ['RT_USING_DEVICE_IPC'], CPPPATH = CPPPATH, LOCAL_CPPDEFINES=['__RT_IPC_SOURCE__']) +group = DefineGroup('DeviceDrivers', src, depend = ['RT_USING_DEVICE_IPC'], CPPPATH = CPPPATH) list = os.listdir(cwd) for item in list: From 313f8d985445de3caba3559ed8bfe31c24d9cd10 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 2/3] =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=BA=BF=E7=A8=8B?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E8=BE=93=E5=87=BA=EF=BC=8C=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?CPU=E4=BD=BF=E7=94=A8=E7=8E=87=E8=B7=9F=E8=B8=AA=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=EF=BC=8C=E8=B0=83=E6=95=B4=E8=BE=93=E5=87=BA=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/finsh/cmd.c | 40 ++++++++++++++++++++++++++++++++-------- include/rtdef.h | 2 ++ src/scheduler_mp.c | 15 ++++++++++++--- src/scheduler_up.c | 11 ++++++++--- 4 files changed, 54 insertions(+), 14 deletions(-) diff --git a/components/finsh/cmd.c b/components/finsh/cmd.c index a9b6979e53d8..a81d280e6659 100644 --- a/components/finsh/cmd.c +++ b/components/finsh/cmd.c @@ -221,7 +221,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])); @@ -230,22 +232,40 @@ 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_kprintf("usage count last time"); +#endif + rt_kprintf("\n"); object_split(maxlen); - rt_kprintf(" --- ---- --- ------- ---------- ---------- ------ ---------- -------"); - rt_kprintf(" "); + rt_kprintf(" --- ---- --- ------- ---------- ---------- ------ ---------- ------- "); object_split(tcb_strlen); rt_kprintf(" "); +#ifdef RT_USING_CPU_USAGE_TRACER object_split(usage_strlen); + rt_kprintf(" "); + object_split(8); + rt_kprintf(" "); + object_split(10); +#endif rt_kprintf("\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_kprintf("\n"); object_split(maxlen); - rt_kprintf(" --- ------- ---------- ---------- ------ ---------- -------"); - rt_kprintf(" "); + rt_kprintf(" --- ------- ---------- ---------- ------ ---------- ------- "); object_split(tcb_strlen); rt_kprintf(" "); +#ifdef RT_USING_CPU_USAGE_TRACER object_split(usage_strlen); + rt_kprintf(" "); + object_split(8); + rt_kprintf(" "); + object_split(10); +#endif rt_kprintf("\n"); #endif /*RT_USING_SMP*/ @@ -310,6 +330,10 @@ long list_thread(void) thread->remaining_tick, rt_strerror(thread->error), thread); +#ifdef RT_USING_CPU_USAGE_TRACER + 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 ++; @@ -323,9 +347,9 @@ long list_thread(void) thread); #endif #ifdef RT_USING_CPU_USAGE_TRACER - rt_kprintf(" %3d%%\n", rt_thread_get_usage(thread)); + rt_kprintf(" %3d%%%8d%10d", rt_thread_get_usage(thread), thread->ctx_count, thread->ctx_last_time); #else - rt_kprintf(" N/A\n"); + rt_kprintf("\n"); #endif } } diff --git a/include/rtdef.h b/include/rtdef.h index 3833f87f2e96..ff0a1b117abd 100644 --- a/include/rtdef.h +++ b/include/rtdef.h @@ -937,6 +937,8 @@ struct rt_thread rt_ubase_t system_time; /**< Ticks on system */ rt_ubase_t total_time_prev; /**< Previous total ticks snapshot */ rt_uint8_t cpu_usage; /**< Recent CPU usage in percent */ + 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 4bcbafad6dd6..7d894d9b76c7 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 8560166fd17b..624c7875e15a 100644 --- a/src/scheduler_up.c +++ b/src/scheduler_up.c @@ -359,10 +359,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); @@ -390,7 +392,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); } From 0e12e694655b184f033cce1f17872a0419156bc0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=92=99=E8=92=99plus?= Date: Thu, 17 Sep 2026 10:58:44 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E4=BC=98=E5=8C=96CPU=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E7=8E=87=E8=B7=9F=E8=B8=AA=E5=8A=9F=E8=83=BD=EF=BC=8C=E8=B0=83?= =?UTF-8?q?=E6=95=B4=E7=9B=B8=E5=85=B3=E6=95=B0=E6=8D=AE=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E4=BB=A5=E6=94=AF=E6=8C=81=E6=9B=B4=E9=AB=98=E7=B2=BE=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/finsh/cmd.c | 6 ++++-- include/rtdef.h | 2 +- include/rtthread.h | 2 +- src/kservice.c | 12 ++++++++---- 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/components/finsh/cmd.c b/components/finsh/cmd.c index a81d280e6659..66f42f9a0a9a 100644 --- a/components/finsh/cmd.c +++ b/components/finsh/cmd.c @@ -331,7 +331,8 @@ long list_thread(void) rt_strerror(thread->error), thread); #ifdef RT_USING_CPU_USAGE_TRACER - rt_kprintf(" %3d%%%8d%10d", rt_thread_get_usage(thread), thread->ctx_count, thread->ctx_last_time); + uint16_t usage = rt_thread_get_usage(thread); + rt_kprintf(" %2hu.%1hu%%%8d%10d", usage / 10, usage % 10, thread->ctx_count, thread->ctx_last_time); #endif rt_kprintf(" \n"); #else @@ -347,7 +348,8 @@ long list_thread(void) thread); #endif #ifdef RT_USING_CPU_USAGE_TRACER - rt_kprintf(" %3d%%%8d%10d", rt_thread_get_usage(thread), thread->ctx_count, thread->ctx_last_time); + uint16_t usage = rt_thread_get_usage(thread); + rt_kprintf(" %2hu.%1hu%%%8d%10d", usage / 10, usage % 10, thread->ctx_count, thread->ctx_last_time); #else rt_kprintf("\n"); #endif diff --git a/include/rtdef.h b/include/rtdef.h index ff0a1b117abd..81235b651f8a 100644 --- a/include/rtdef.h +++ b/include/rtdef.h @@ -936,7 +936,7 @@ struct rt_thread rt_ubase_t user_time; /**< Ticks on user */ rt_ubase_t system_time; /**< Ticks on system */ rt_ubase_t total_time_prev; /**< Previous total ticks snapshot */ - rt_uint8_t cpu_usage; /**< Recent CPU usage in percent */ + rt_ubase_t cpu_usage; /**< Recent CPU usage in percent */ rt_ubase_t ctx_last_time; /**< Last context switch time */ rt_ubase_t ctx_count; /**< Context switch count */ #endif /* RT_USING_CPU_USAGE_TRACER */ diff --git a/include/rtthread.h b/include/rtthread.h index 177ea877831e..b1000b9d750c 100644 --- a/include/rtthread.h +++ b/include/rtthread.h @@ -170,7 +170,7 @@ void rt_thread_wakeup_set(struct rt_thread *thread, rt_wakeup_func_t func, void* #endif /* RT_USING_SMART */ rt_err_t rt_thread_get_name(rt_thread_t thread, char *name, rt_uint8_t name_size); #ifdef RT_USING_CPU_USAGE_TRACER -rt_uint8_t rt_thread_get_usage(rt_thread_t thread); +rt_uint16_t rt_thread_get_usage(rt_thread_t thread); #endif /* RT_USING_CPU_USAGE_TRACER */ #ifdef RT_USING_SIGNALS void rt_thread_alloc_sig(rt_thread_t tid); diff --git a/src/kservice.c b/src/kservice.c index 02396203d0fc..0d70b32e9a3b 100644 --- a/src/kservice.c +++ b/src/kservice.c @@ -674,8 +674,12 @@ static void _cpu_usage_refresh_threads(rt_uint64_t total_delta) if (total_delta > 0U) { - rt_uint64_t usage = (thread_delta * 100U) / total_delta; - t->cpu_usage = (rt_uint8_t)(usage > 100U ? 100U : usage); + rt_uint64_t usage = (thread_delta * 1000U) / total_delta; + t->cpu_usage = (rt_uint16_t)(usage > 1000U ? 1000U : usage); + if (t->cpu_usage == 0 && usage > 0) + { + t->cpu_usage = 1U; + } } else { @@ -731,9 +735,9 @@ static void _cpu_usage_update(void) * @note Sampling interval can be tuned with RT_CPU_USAGE_CALC_INTERVAL_MS. * @note If thread is NULL, an assertion will be triggered in debug builds. */ -rt_uint8_t rt_thread_get_usage(rt_thread_t thread) +rt_uint16_t rt_thread_get_usage(rt_thread_t thread) { - rt_uint8_t usage; + rt_uint16_t usage; RT_ASSERT(thread != RT_NULL);