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 ab97aeb917da..cb73b6e53aef 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); }