|
在使用RTT系统时,有个finsh组件, 移植这个组件后,就能像u-boot或LINUX中操作shell终端一样的感觉,很方便好用,但有时并不想或没有必要或硬件条件有限而未移植finsh组件,
但又想监测系统各个线程状态,而且能实现FINSHl输出的效果咋办了?
下面是FINSH组件输出的效果:
通过命令list_thread 可能查询各个线程状态,那就在代码中搜索list_thread,在cmd.c文件中可查到:
当使用这个命令时要使能FINSH宏,但我又没有移植这个组件,聪明的你一定想到了,把这个函数截减到自已的代码中去就可以 了:
//截减自内核组件函数:list_thread(). /cmd.c
void my_list_thread(void)
{
rt_uint8_t stat, i=0;
rt_uint8_t *ptr=RT_NULL;
// 添加你要监测的线程
rt_thread_t thread=RT_NULL, thread_obj[] = {tid_lcd_modbus,
tid_lcd_display,
tid_hw_info_collect,
tid_process,
}; //在此增加线程句柄
const char *item_title = "thread";
int maxlen = RT_NAME_MAX;
rt_kprintf("-------- --- ------- ---------- ---------- ------ ---------- ---\r\n");
rt_kprintf("%-*.s pri status sp stack size max used left tick error\r\n", maxlen, item_title);
rt_kprintf("-------- --- ------- ---------- ---------- ------ ---------- ---\r\n");
for(i=0; i < sizeof(thread_obj)/sizeof(thread_obj[0]); i++){
thread = thread_obj;
rt_kprintf("%-*.*s %3d ", maxlen, RT_NAME_MAX, thread->name, thread->current_priority);
stat = (thread->stat & RT_THREAD_STAT_MASK);
if (stat == RT_THREAD_READY) rt_kprintf(" ready ");
else if (stat == RT_THREAD_SUSPEND) rt_kprintf(" suspend");
else if (stat == RT_THREAD_INIT) rt_kprintf(" init ");
else if (stat == RT_THREAD_CLOSE) rt_kprintf(" close ");
else if (stat == RT_THREAD_RUNNING) rt_kprintf(" running");
ptr = (rt_uint8_t *)thread->stack_addr;
while (*ptr == '#')ptr ++;
rt_kprintf(" 0x%08x 0x%08x %02d%% 0x%08x %03d\n",
thread->stack_size + ((rt_ubase_t)thread->stack_addr - (rt_ubase_t)thread->sp),
thread->stack_size,
(thread->stack_size - ((rt_ubase_t) ptr - (rt_ubase_t) thread->stack_addr)) * 100 / thread->stack_size,
thread->remaining_tick,
thread->error);
}
rt_kprintf ("\n\n");
}
效果:
|
|