请选择 进入手机版 | 继续访问电脑版

硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1313|回复: 1
收起左侧

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

[复制链接]

27

主题

95

回帖

181

积分

初级会员

积分
181
发表于 2022-3-4 15:53:30 | 显示全部楼层 |阅读模式


在使用RTT系统时,有个finsh组件, 移植这个组件后,就能像u-boot或LINUX中操作shell终端一样的感觉,很方便好用,但有时并不想或没有必要或硬件条件有限而未移植finsh组件,
但又想监测系统各个线程状态,而且能实现FINSHl输出的效果咋办了?

下面是FINSH组件输出的效果:
11.jpg


通过命令list_thread  可能查询各个线程状态,那就在代码中搜索list_thread,在cmd.c文件中可查到:

image.png

当使用这个命令时要使能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");

}


效果:

image.png






回复

使用道具 举报

41

主题

214

回帖

337

积分

高级会员

积分
337
发表于 2022-3-5 18:53:32 | 显示全部楼层
哈哈哈,上周刚把finsh删了,还想着怎么解决呢?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-3-29 08:39 , Processed in 0.192860 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表