|
本帖最后由 偶尔也很菜 于 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没测试,这两个不思进取的编译器我已经放弃了。
- /**********************************************************************************************************************************************
- * Description: Start任务
- * Input: thread_input:创建该任务时传递的形参
- * Output: None
- * Comment: None
- ***********************************************************************************************************************************************/
- __NO_RETURN static void AppTaskStart(ULONG thread_input) {
- EXECUTION_TIME TolTime, IdleTime, deltaTolTime, deltaIdleTime;
- EXECUTION_TIME idle_total_time;
- EXECUTION_TIME isr_total_time;
- EXECUTION_TIME thread_total_time;
- u32 uiConunt = 0;
- (void)thread_input;
- HAL_ResumeTick(); // 内核开启后,恢复HAL里的时间基准
- // 读取3个总时间
- _tx_execution_thread_total_time_get(&thread_total_time);
- _tx_execution_idle_time_get(&idle_total_time);
- _tx_execution_isr_time_get(&isr_total_time);
- IdleTime = idle_total_time;
- TolTime = thread_total_time + isr_total_time + idle_total_time;
- while (TRUE) {
- // 读取3个总时间
- _tx_execution_thread_total_time_get(&thread_total_time);
- _tx_execution_idle_time_get(&idle_total_time);
- _tx_execution_isr_time_get(&isr_total_time);
- if (++uiConunt == 200) {
- uiConunt = 0;
- deltaIdleTime = idle_total_time - IdleTime;
- deltaTolTime = thread_total_time + isr_total_time + idle_total_time - TolTime;
- OSCPUUsage = (double)deltaIdleTime / deltaTolTime;
- OSCPUUsage = 100 - OSCPUUsage * 100;
- IdleTime = idle_total_time;
- TolTime = thread_total_time + isr_total_time + idle_total_time;
- } else {
- }
- tx_thread_sleep(1);
- }
- }
复制代码- /***********************************************************************************************************************************************
- * Description: 将ThreadX任务信息通过串口打印出来
- * Input: None
- * Output: None
- * Comment: None
- ***********************************************************************************************************************************************/
- static void DispTaskInfo(void) {
- TX_THREAD * p_tcb;
- EXECUTION_TIME idle_total_time;
- EXECUTION_TIME isr_total_time;
- EXECUTION_TIME thread_total_time;
- float thread_cpu_usage;
- EXECUTION_TIME thread_cpu_time;
- char thread_state[20];
- double temp;
- UINT i;
- CHAR * name;
- ULONG available;
- ULONG fragments;
- TX_THREAD * first_suspended;
- ULONG suspended_count;
- TX_BYTE_POOL *next_pool;
- UINT status;
- p_tcb = &AppTaskStartTCB;
- // 读取3个总时间
- _tx_execution_thread_total_time_get(&thread_total_time);
- _tx_execution_idle_time_get(&idle_total_time);
- _tx_execution_isr_time_get(&isr_total_time);
- // 先清屏
- App_Printf("\033[2J");
- App_Printf("\33[30m==================================================================================================================================================\r\n");
- i = 0;
- while (p_tcb != (TX_THREAD *)0) {
- i++;
- p_tcb = p_tcb->tx_thread_created_next;
- if (p_tcb == &AppTaskStartTCB) {
- break;
- }
- }
- // 任务总数
- App_Printf("\33[36m Total Thread = %d ", i);
- // CPU使用率。<20%绿色,<40%黄色,>40%红色。可自行修改。
复制代码- /***********************************************************************************************************************************************
- * Description: 线程安全的printf方式
- * Input: None
- * Output:
- *同printf的参数,在C中,当无法列出传递函数的所有实参的类型和数目时,可以用省略号指定参数表
- * Comment: None
- ***********************************************************************************************************************************************/
- static void App_Printf(const char *fmt, ...) {
- char buf_str[200 + 1]; // 特别注意,如果printf的变量较多,注意此局部变量的大小是否够用
- va_list v_args;
- va_start(v_args, fmt);
- (void)vsnprintf((char *)&buf_str[0], (size_t)sizeof(buf_str), (char const *)fmt, v_args);
- va_end(v_args);
- tx_mutex_get(&MuxPrintf, TX_WAIT_FOREVER); // 互斥操作,保证线程安全
- printf("%s", buf_str);
- tx_mutex_put(&MuxPrintf);
- }
复制代码
|
-
效果如图所示
-
-
1.c
9.83 KB, 下载次数: 74
评分
-
查看全部评分
|