硬汉嵌入式论坛

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

[ThreadX全家桶] ThreadX的CPU利用率实现方式二:uCOS-II方案,简单好用

[复制链接]

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115892
QQ
发表于 2020-6-7 07:25:00 | 显示全部楼层 |阅读模式
还是这个方案好用,之前RTX4,我就是采用的这个方案:

具体实现可以看之前的二代示波器的RTX4版本:
http://www.armbbs.cn/forum.php?mod=viewthread&tid=45785





实测效果:
QQ截图20200607073150.png

回复

使用道具 举报

76

主题

237

回帖

465

积分

高级会员

积分
465
发表于 2020-6-7 07:44:40 | 显示全部楼层
ThreadX没有类似uCOSiii的统计任务?不能统计CPU使用率和每个任务的CPU使用率吗?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115892
QQ
 楼主| 发表于 2020-6-7 08:05:21 | 显示全部楼层
kokoromi 发表于 2020-6-7 07:44
ThreadX没有类似uCOSiii的统计任务?不能统计CPU使用率和每个任务的CPU使用率吗?

有,方式一,见另外一个帖子。
回复

使用道具 举报

0

主题

3

回帖

3

积分

新手上路

积分
3
发表于 2021-1-10 19:11:00 | 显示全部楼层
有个疑问,图片中的 IDLE 任务最高使用数怎么比当前使用还低?
回复

使用道具 举报

2

主题

9

回帖

15

积分

新手上路

积分
15
发表于 2024-7-12 14:10:34 | 显示全部楼层
硬汉哥,我对threadx的任务调度有些疑惑,想请教你一下。threadx是怎么从关掉systick中断且进入死循环的AppTaskIDLE切换到AppTaskIDLEAppTaskStart的?
这是实现threadx的cpu利用率显示的V7-3002_Threadx Kernel Template例程里AppTaskIDLE的代码。
VIAH}S9$K~I2@GL]1H0NBGL.png
回复

使用道具 举报

2

主题

9

回帖

15

积分

新手上路

积分
15
发表于 2024-7-12 14:12:16 | 显示全部楼层
??????
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115892
QQ
 楼主| 发表于 2024-7-13 09:11:22 | 显示全部楼层
arm.n 发表于 2024-7-12 14:10
硬汉哥,我对threadx的任务调度有些疑惑,想请教你一下。threadx是怎么从关掉systick中断且进入死循环的App ...
这个OSStatInit是最关键的。

[C] 纯文本查看 复制代码
/*
*********************************************************************************************************
* 函 数 名: AppTaskStatistic
* 功能说明: 统计任务,用于实现 CPU 利用率的统计。为了测试更加准确,可以开启注释调用的全局中断开关
* 形 参: thread_input 创建该任务时传递的形参
* 返 回 值: 无
* 优 先 级: 30
*********************************************************************************************************
*/
void OSStatInit (void)
{
OSStatRdy = FALSE;
 tx_thread_sleep(2u); /* 时钟同步 */
 //__disable_irq();
 OSIdleCtr = 0uL; /* 清空闲计数 */
//__enable_irq();
 tx_thread_sleep(100); /* 统计 100ms 内,最大空闲计数 */
 //__disable_irq();
 OSIdleCtrMax = OSIdleCtr; /* 保存最大空闲计数 *
 OSStatRdy = TRUE;
//__enable_irq();
}
static void AppTaskStat(ULONG thread_input)
{
(void)thread_input;
 while (OSStatRdy == FALSE) 
{
 tx_thread_sleep(200); /* 等待统计任务就绪 */
 }
 OSIdleCtrMax /= 100uL;
 if (OSIdleCtrMax == 0uL) 
{
 OSCPUUsage = 0u;
 }
 //__disable_irq();
 OSIdleCtr = OSIdleCtrMax * 100uL; /* 设置初始 CPU 利用率 0% */
//__enable_irq();
 for (;;) 
{
 // __disable_irq();
 OSIdleCtrRun = OSIdleCtr; /* 获得 100ms 内空闲计数 */
 OSIdleCtr = 0uL; /* 复位空闲计数 */
 // __enable_irq(); /* 计算 100ms 内的 CPU 利用率 */
 OSCPUUsage = (100uL - (float)OSIdleCtrRun / OSIdleCtrMax);
 tx_thread_sleep(100); /* 每 100ms 统计一次 */
 }



进入到启动任务后,其它任何任务都不要创建,先创建一个统计任务,不让执行。

启动任务延迟 100ms,延迟的这 100ms 时间基本都是空闲任务在执行,在空闲任务里面做 32 变量加 1 计算。我们就以这 100ms,变量计数的最大值作为 CPU 利用率的分母。

然后开启统计任务的执行,每 100ms 执行一次,统计即可。空闲任务此时的计数值作为分子。通过这种方式就实现了 CPU 利用率的统计。

回复

使用道具 举报

26

主题

137

回帖

215

积分

高级会员

积分
215
发表于 2024-8-8 02:05:47 | 显示全部楼层
有没有现在rtx6的统计方法?rtx4差别好像非常大
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115892
QQ
 楼主| 发表于 2024-8-8 09:05:36 | 显示全部楼层
ifree 发表于 2024-8-8 02:05
有没有现在rtx6的统计方法?rtx4差别好像非常大

RTX6 ? 你说的是RTX5吧
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-25 14:07 , Processed in 0.388764 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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