硬汉嵌入式论坛

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

[ThreadX全家桶] 提供一段显示线程信息的代码

[复制链接]

7

主题

28

回帖

49

积分

初级会员

积分
49
发表于 2023-6-30 16:37:00 | 显示全部楼层 |阅读模式

看了一下硬汉哥的代码,实现了一下,但最大使用栈的大小用
[C] 纯文本查看 复制代码
tx_thread_stack_highest_ptr
怎么都算不对,因此自己实现了一下,主要原理是 ThreadX 用 0xEF 填充栈,此外,暂不清楚 ThreadX 如何显示线程的错误状态,此处暂时用000代替。


[C] 纯文本查看 复制代码

static inline void object_split(int len, char *ch)
{
    while (len--) tx_kprintf("%s", ch);
}

/**
  * @brief  list thread info
  * @param  None
  * @retval None
  */
static void ps(void)
{
    TX_THREAD      *thread = &shell_thread;
    UCHAR stat;
	uint8_t *ptr;
    int maxlen = TX_NAME_MAX;
	
    /* Print Title */
    tx_kprintf("\r\n");
	object_split(maxlen, "=");
    tx_kprintf("==============================================================================\r\n");
	tx_kprintf("cpu usage = %5.2f%%\r\n", cpu_usage);
    object_split(maxlen, "=");
    tx_kprintf("==============================================================================\r\n");
    tx_kprintf("%-*s pri  status        sp     stack size  cur used  max used   cur tick  err\r\n", maxlen, "thread");
    object_split(maxlen, "-");
    tx_kprintf(" ---  --------- ---------- ----------  --------  --------  ---------- ---\r\n");

    /* Traversing Thread Control List */
    while (thread != (TX_THREAD *)0)
    {		
        tx_kprintf("%-*.*s %3d ", maxlen, maxlen, thread->tx_thread_name, thread->tx_thread_priority);
		
        stat = thread->tx_thread_state;
        if(stat == TX_READY)				tx_kprintf(" ready    ");
        else if(stat == TX_COMPLETED)		tx_kprintf(" complete ");
        else if(stat == TX_TERMINATED)		tx_kprintf(" terminate");
        else if(stat == TX_SUSPENDED)		tx_kprintf(" suspend  ");
        else if(stat == TX_SLEEP)			tx_kprintf(" sleep    ");

		ptr = (uint8_t *)thread->tx_thread_stack_start;
		while(*ptr == 0xEF) ++ptr;			// ThreadX Fill Stack With 0xEF
		
        tx_kprintf(" 0x%08x 0x%08x       %02d%%       %02d%%",
                   (ULONG)thread->tx_thread_stack_ptr,
                   thread->tx_thread_stack_size,
                   ((ULONG)thread->tx_thread_stack_end - (ULONG)thread->tx_thread_stack_ptr) * 100 / thread->tx_thread_stack_size,
                   ((ULONG)thread->tx_thread_stack_end - (ULONG)ptr) * 100 / thread->tx_thread_stack_size);
        if(thread->tx_thread_time_slice == 0)	tx_kprintf("  Preemptive");
        else	tx_kprintf("  0x%08x", thread->tx_thread_time_slice);
        tx_kprintf(" %03d\r\n", 000);
		
        thread = thread->tx_thread_created_next;
        if(thread == &shell_thread) break;
    }
}


回复

使用道具 举报

7

主题

28

回帖

49

积分

初级会员

积分
49
 楼主| 发表于 2023-6-30 16:42:34 | 显示全部楼层
此外,其实此处线程信息应该在另一个较高等级线程中,不断读取,类似CPU Usage的读取,否则就会像以下打印出来的一样,shell始终是ready,其他内容一直是suspend或sleep
QQ截图20230630164213.jpg
回复

使用道具 举报

7

主题

28

回帖

49

积分

初级会员

积分
49
 楼主| 发表于 2023-6-30 16:47:19 | 显示全部楼层
此外,按照硬汉哥的教程移植了一下cpu usage的使用率,但打印出来一直是nan,检查了一下原始的被除数delat_to_time一直0,不知道大家能否给个头绪?
QQ截图20230630164213.jpg
回复

使用道具 举报

7

主题

28

回帖

49

积分

初级会员

积分
49
 楼主| 发表于 2023-6-30 16:52:59 | 显示全部楼层
参考的是ThreadX全家桶系列第16章的内容,但不知道为什么,这些统计参数都是0
回复

使用道具 举报

19

主题

243

回帖

300

积分

高级会员

积分
300
发表于 2023-6-30 17:52:42 | 显示全部楼层
内核启动后再手动初始化DWT一遍

[C] 纯文本查看 复制代码
    //寄存器基地址
    #define    DWT_CR    *(uint32_t*)0xE0001000
    #define    DWT_CYCCNT    *(uint32_t*)0xE0001004
    #define    DEM_CR    *(uint32_t*)0xE000EDFC
     
    //定义需使能位
    #define    DEM_CR_TRCENA    (1<<24)
    #define    DWT_CR_CYCCNTENA    (1<<0)

      DEM_CR |= (uint32_t)DEM_CR_TRCENA;
      DWT_CYCCNT = (uint32_t)0u;
      DWT_CR |= (uint32_t)DWT_CR_CYCCNTENA;

回复

使用道具 举报

7

主题

28

回帖

49

积分

初级会员

积分
49
 楼主| 发表于 2023-6-30 19:32:27 | 显示全部楼层
tovinz 发表于 2023-6-30 17:52
内核启动后再手动初始化DWT一遍

[mw_shl_code=c,true]

不行耶,算出来变成100%了
回复

使用道具 举报

7

主题

28

回帖

49

积分

初级会员

积分
49
 楼主| 发表于 2023-6-30 19:39:05 | 显示全部楼层
发现这些参数都不带的
QQ截图20230630193828.jpg
回复

使用道具 举报

7

主题

28

回帖

49

积分

初级会员

积分
49
 楼主| 发表于 2023-6-30 20:15:27 | 显示全部楼层
这个线程居然是NULL的,这个if被跳过了
QQ截图20230630193828.jpg
回复

使用道具 举报

7

主题

28

回帖

49

积分

初级会员

积分
49
 楼主| 发表于 2023-6-30 20:16:04 | 显示全部楼层
我开始怀疑是不是threadx版本太高了不兼容
回复

使用道具 举报

7

主题

28

回帖

49

积分

初级会员

积分
49
 楼主| 发表于 2023-6-30 21:55:49 | 显示全部楼层
好像审核不过。。。。因为积分太低了么
回复

使用道具 举报

7

主题

28

回帖

49

积分

初级会员

积分
49
 楼主| 发表于 2023-7-1 14:51:17 | 显示全部楼层
验证了一下问题
1、再手动初始化DWT一遍有效
2、由于移植了letter-shell,shell为最低线程一直在后台运行未阻塞,因此导致cpu占用率始终为100%
3、计划添加letter-shell的线程阻塞功能
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-2 07:21 , Processed in 0.191431 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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