硬汉嵌入式论坛

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

[ThreadX全家桶] 改进一下ThreadX的任务数据显示(基于原装统计功能),增加任务当前状态、任务的CPU占比、任务按优先级排列等小功能

[复制链接]

4

主题

62

回帖

74

积分

初级会员

积分
74
QQ
发表于 2021-10-16 17:17:04 | 显示全部楼层 |阅读模式
本帖最后由 偶尔也很菜 于 2021-10-16 17:54 编辑

开始学习X全家桶了,回馈硬汉辛苦教程,改进了一下任务列表显示。主要增加了以下功能(数据基于ThreadX原装统计功能):
1. 增加清屏功能(不会一直滚动了)。
2. 增加各项的颜色区分(还有如CPU超出40%显示红色等功能)。
3. 任务列表按优先级从高到低排列。
4. 增加总任务数,以及各个任务的堆栈起始和结束地址(参考了IAR内置插件),并增加显示各任务的已使用堆栈占比项(这个很有用)。
5. 增加各个任务的CPU占比,包括各个任务之间的相对CPU占比,以及占总CPU比例。
6. 优化ThreadX中断、任务、空闲等时间显示格式,以时分秒毫秒格式显示更直观。
7. 增加各个任务的当前状态(运行、睡眠、等待某种对象等),以及各个任务的总切换次数。
8. 增加ThreadX的动态内存已使用占比(未用动态分配内存功能可以删除这行)。
9. 优化各个项的对齐,尽量体现美感。

做的花哨了点,代码很简单也没有过考虑效率问题,大家根据需要自行增减。另我只测试了Embeded Studio(虽然不支持中文显示),MDK和IAR没测试,这两个不思进取的编译器我已经放弃了。
  1. /**********************************************************************************************************************************************
  2. * Description: Start任务
  3. * Input:       thread_input:创建该任务时传递的形参
  4. * Output:      None
  5. * Comment:     None
  6. ***********************************************************************************************************************************************/
  7. __NO_RETURN static void AppTaskStart(ULONG thread_input) {
  8.     EXECUTION_TIME TolTime, IdleTime, deltaTolTime, deltaIdleTime;
  9.     EXECUTION_TIME idle_total_time;
  10.     EXECUTION_TIME isr_total_time;
  11.     EXECUTION_TIME thread_total_time;
  12.     u32            uiConunt = 0;


  13.     (void)thread_input;

  14.     HAL_ResumeTick();        // 内核开启后,恢复HAL里的时间基准

  15.     // 读取3个总时间
  16.     _tx_execution_thread_total_time_get(&thread_total_time);
  17.     _tx_execution_idle_time_get(&idle_total_time);
  18.     _tx_execution_isr_time_get(&isr_total_time);

  19.     IdleTime = idle_total_time;
  20.     TolTime  = thread_total_time + isr_total_time + idle_total_time;

  21.     while (TRUE) {
  22.         // 读取3个总时间
  23.         _tx_execution_thread_total_time_get(&thread_total_time);
  24.         _tx_execution_idle_time_get(&idle_total_time);
  25.         _tx_execution_isr_time_get(&isr_total_time);

  26.         if (++uiConunt == 200) {
  27.             uiConunt      = 0;
  28.             deltaIdleTime = idle_total_time - IdleTime;
  29.             deltaTolTime  = thread_total_time + isr_total_time + idle_total_time - TolTime;
  30.             OSCPUUsage    = (double)deltaIdleTime / deltaTolTime;
  31.             OSCPUUsage    = 100 - OSCPUUsage * 100;

  32.             IdleTime = idle_total_time;
  33.             TolTime  = thread_total_time + isr_total_time + idle_total_time;
  34.         } else {
  35.         }
  36.         tx_thread_sleep(1);
  37.     }
  38. }
复制代码
  1. /***********************************************************************************************************************************************
  2. * Description: 将ThreadX任务信息通过串口打印出来
  3. * Input:       None
  4. * Output:      None
  5. * Comment:     None
  6. ***********************************************************************************************************************************************/
  7. static void DispTaskInfo(void) {
  8.     TX_THREAD *    p_tcb;
  9.     EXECUTION_TIME idle_total_time;
  10.     EXECUTION_TIME isr_total_time;
  11.     EXECUTION_TIME thread_total_time;
  12.     float          thread_cpu_usage;
  13.     EXECUTION_TIME thread_cpu_time;
  14.     char           thread_state[20];
  15.     double         temp;
  16.     UINT           i;

  17.     CHAR *        name;
  18.     ULONG         available;
  19.     ULONG         fragments;
  20.     TX_THREAD *   first_suspended;
  21.     ULONG         suspended_count;
  22.     TX_BYTE_POOL *next_pool;
  23.     UINT          status;


  24.     p_tcb = &AppTaskStartTCB;
  25.     // 读取3个总时间
  26.     _tx_execution_thread_total_time_get(&thread_total_time);
  27.     _tx_execution_idle_time_get(&idle_total_time);
  28.     _tx_execution_isr_time_get(&isr_total_time);

  29.     // 先清屏
  30.     App_Printf("\033[2J");
  31.     App_Printf("\33[30m==================================================================================================================================================\r\n");
  32.     i = 0;
  33.     while (p_tcb != (TX_THREAD *)0) {
  34.         i++;
  35.         p_tcb = p_tcb->tx_thread_created_next;
  36.         if (p_tcb == &AppTaskStartTCB) {
  37.             break;
  38.         }
  39.     }
  40.     // 任务总数
  41.     App_Printf("\33[36m Total Thread = %d   ", i);
  42.     // CPU使用率。<20%绿色,<40%黄色,>40%红色。可自行修改。
复制代码
  1. /***********************************************************************************************************************************************
  2. * Description: 线程安全的printf方式
  3. * Input:       None
  4. * Output:
  5. *同printf的参数,在C中,当无法列出传递函数的所有实参的类型和数目时,可以用省略号指定参数表
  6. * Comment:     None
  7. ***********************************************************************************************************************************************/
  8. static void App_Printf(const char *fmt, ...) {
  9.     char    buf_str[200 + 1];        // 特别注意,如果printf的变量较多,注意此局部变量的大小是否够用
  10.     va_list v_args;


  11.     va_start(v_args, fmt);
  12.     (void)vsnprintf((char *)&buf_str[0], (size_t)sizeof(buf_str), (char const *)fmt, v_args);
  13.     va_end(v_args);

  14.     tx_mutex_get(&MuxPrintf, TX_WAIT_FOREVER);        // 互斥操作,保证线程安全
  15.     printf("%s", buf_str);
  16.     tx_mutex_put(&MuxPrintf);
  17. }
复制代码


效果如图所示

效果如图所示

1.c

9.83 KB, 下载次数: 74

评分

参与人数 1金币 +100 收起 理由
eric2013 + 100 很给力!

查看全部评分

回复

使用道具 举报

4

主题

62

回帖

74

积分

初级会员

积分
74
QQ
 楼主| 发表于 2021-10-16 17:55:02 | 显示全部楼层
不知道怎么回事代码贴不全,传了个C文件在最后。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115896
QQ
发表于 2021-10-16 19:45:24 | 显示全部楼层
非常感谢楼主分享,效果很直观
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2024-5-29 14:16:08 | 显示全部楼层
非常感谢楼主分享
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
发表于 2024-5-30 09:31:33 | 显示全部楼层
你好,请问怎么下载不了这个文件?谢谢解答
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-25 17:10 , Processed in 0.575745 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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