chinacool 发表于 2022-3-4 15:53:30

rt-thread os 未移植finsh组件又想监测线程状态处理办法



在使用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 pristatus      sp   stack size max used left tickerror\r\n", maxlen, item_title);
    rt_kprintf("-------- ---------- ---------- -------------------------- ---\r\n");


        for(i=0; i < sizeof(thread_obj)/sizeof(thread_obj); 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");

}


效果:








snakeemail 发表于 2022-3-5 18:53:32

哈哈哈,上周刚把finsh删了,还想着怎么解决呢?
页: [1]
查看完整版本: rt-thread os 未移植finsh组件又想监测线程状态处理办法