Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 35 additions & 17 deletions components/finsh/cmd.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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]));
Expand All @@ -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
Expand Down Expand Up @@ -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 ++;
Expand All @@ -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
}
}
Expand Down
2 changes: 2 additions & 0 deletions include/rtdef.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
15 changes: 12 additions & 3 deletions src/scheduler_mp.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)&current_thread->sp,
(rt_ubase_t)&to_thread->sp, to_thread);
}
Expand Down Expand Up @@ -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)&current_thread->sp,
(rt_ubase_t)&to_thread->sp, to_thread);
}
Expand Down Expand Up @@ -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)&current_thread->sp,
(rt_ubase_t)&to_thread->sp, to_thread);
}
Expand Down
11 changes: 8 additions & 3 deletions src/scheduler_up.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down Expand Up @@ -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);
}
Expand Down