硬汉嵌入式论坛

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

[RL-RTX] RTX操作系统下增加CPU使用率

  [复制链接]

36

主题

1445

回帖

1553

积分

至尊会员

积分
1553
发表于 2019-6-12 17:07:04 | 显示全部楼层 |阅读模式
在RTX操作系统下增加CPU使用率,直接使用的是硬汉的例程里面的,但是有一点疑问,看下图: tcp.jpg
这是在空闲任务里面计数,从而计算CPU的使用率。但是测试发现这个计数必须__set_PRIMASK(1);和__set_PRIMASK(0);开关中断,否则计算出来的就非常离谱。那么我想问下这个一直开关中断会不会有啥影响呢?会不会影响实时性?有没有其他方法计算CPU使用率呢?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106422
QQ
发表于 2019-6-13 10:10:44 | 显示全部楼层
1、基本不影响,这个开关中断的时间非常短,可以忽略。

2、有别的解决办法,你可以用原子操作。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106422
QQ
发表于 2019-6-13 10:12:46 | 显示全部楼层
RTX5这里提供了一批API,你可以搞出来用用


回复

使用道具 举报

36

主题

1445

回帖

1553

积分

至尊会员

积分
1553
 楼主| 发表于 2019-6-13 12:30:34 | 显示全部楼层
eric2013 发表于 2019-6-13 10:12
RTX5这里提供了一批API,你可以搞出来用用

谢谢老大。
回复

使用道具 举报

3

主题

105

回帖

114

积分

初级会员

积分
114
发表于 2019-6-20 11:34:00 | 显示全部楼层
楼主看看我给RTX增加CPU使用率的方法,简单高效:
在os_idle_demon函数所在文件中定义如下代码:
  1. volatile U32 os_idleCnt = 0;
  2. __task void os_idle_demon(void)
  3. {
  4.   /* The idle demon is a system task, running when no other task is ready */
  5.   /* to run. The 'os_xxx' function calls are not allowed from this task.  */

  6.   for (;;) {
  7.     /* HERE: include optional user code to be executed when no task runs.*/
  8.     os_idleCnt++;
  9.   }
  10. }

  11. static U32 os_idleMax = 0;
  12. void os_cpu_usage_startup(void)
  13. {
  14.   U32 cnt0 = 0;

  15.   os_dly_wait(1);
  16.   cnt0 = os_idleCnt;
  17.   os_dly_wait(50);
  18.   cnt0 = os_idleCnt - cnt0;
  19.   os_idleMax = cnt0;
  20. }

  21. U8 os_cpu_usage(void)
  22. {
  23.   static U32 last_tick = 0;
  24.   static U32 last_cnt = 0;
  25.   U32 cnt, ticks;

  26.   if (last_cnt == 0) {
  27.     last_cnt = os_idleCnt | 1;
  28.     last_tick = os_time;
  29.     return 0;
  30.   }
  31.   cnt = os_idleCnt - last_cnt;
  32.   ticks = os_time - last_tick;
  33.   last_cnt = os_idleCnt | 1;
  34.   last_tick = os_time;
  35.   if (ticks == 0) {
  36.     return 0;
  37.   }

  38.   cnt = cnt * 50 / ticks;
  39.   cnt = (os_idleMax - cnt) * 100 / os_idleMax;
  40.   return (U8)cnt;
  41. }
复制代码
其中以下两个函数导出供外部调用即可:
  1. void   os_cpu_usage_startup(void);
  2. U8     os_cpu_usage(void);
复制代码
然后在第一个线程(即启动线程)中调用os_cpu_usage_startup函数,例如:
  1. static void __ThreadStartup(void)
  2. {
  3.   // CPU使用率接口
  4.   os_cpu_usage_startup();
  5.   // 其它系统加载和初始化
  6. }
复制代码
之后,就可以在某一个线程中,周期性的调用os_cpu_usage函数来获得CPU使用率了。使用率是取值[0,100]的整数。

回复

使用道具 举报

3

主题

105

回帖

114

积分

初级会员

积分
114
发表于 2019-6-20 11:42:11 | 显示全部楼层
以上实现方法,不需要原子操作;是生产者消费者模型,只有一处写,另一处只读,不需要互斥或原子操作。
回复

使用道具 举报

3

主题

105

回帖

114

积分

初级会员

积分
114
发表于 2019-6-20 11:43:48 | 显示全部楼层
如果提示没有os_time定义,就加入这句就行,因为RTX实际上有这个变量:
  1. extern volatile U32 os_time;      // 从rt_Time.o模块导出
复制代码
回复

使用道具 举报

36

主题

1445

回帖

1553

积分

至尊会员

积分
1553
 楼主| 发表于 2019-6-21 10:49:58 | 显示全部楼层
公仆 发表于 2019-6-20 11:43
如果提示没有os_time定义,就加入这句就行,因为RTX实际上有这个变量:

感谢
回复

使用道具 举报

2

主题

28

回帖

34

积分

新手上路

积分
34
发表于 2020-4-21 18:17:29 | 显示全部楼层
eric2013 发表于 2019-6-13 10:12
RTX5这里提供了一批API,你可以搞出来用用

硬汉大佬,这几个函数我看了,原子操作不支持m0级别的MCU,目前我用的就是M0,有没有其他的函数实现原子操作不用关开中断。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106422
QQ
发表于 2020-4-21 18:25:45 | 显示全部楼层
终极菜鸟 发表于 2020-4-21 18:17
硬汉大佬,这几个函数我看了,原子操作不支持m0级别的MCU,目前我用的就是M0,有没有其他的函数实现原子 ...

那得换个思路了,暂时我这里没有实现思路了。
回复

使用道具 举报

2

主题

28

回帖

34

积分

新手上路

积分
34
发表于 2020-4-22 10:26:45 | 显示全部楼层
eric2013 发表于 2020-4-21 18:25
那得换个思路了,暂时我这里没有实现思路了。

顺便问下你,RTX我用keil 自带的那个CMSIS RTOS RTOS2都感觉怪怪的,过度封装,你一般实际用原版的RTX,还是用封装过的。还是考虑以后代码的继承性。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106422
QQ
发表于 2020-4-22 10:35:52 | 显示全部楼层
终极菜鸟 发表于 2020-4-22 10:26
顺便问下你,RTX我用keil 自带的那个CMSIS RTOS RTOS2都感觉怪怪的,过度封装,你一般实际用原版的RTX, ...

rtx5用带封装的。

rtx4用原始版本。
回复

使用道具 举报

2

主题

17

回帖

23

积分

新手上路

积分
23
发表于 2021-1-15 17:38:01 | 显示全部楼层
如何查看某个任务的 CPU 使用率 ?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106422
QQ
发表于 2021-1-16 13:04:38 | 显示全部楼层
aqua2013 发表于 2021-1-15 17:38
如何查看某个任务的 CPU 使用率 ?

RTX5查看比较方便。

RTX4没有做这种方式。
回复

使用道具 举报

7

主题

18

回帖

39

积分

新手上路

积分
39
发表于 2021-1-16 16:15:14 | 显示全部楼层
硬汉大佬,RTX5不仿真的情况下打印每个任务的使用率和时间能实现吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106422
QQ
发表于 2021-1-17 08:10:56 | 显示全部楼层
pokemonds 发表于 2021-1-16 16:15
硬汉大佬,RTX5不仿真的情况下打印每个任务的使用率和时间能实现吗?

可以,得需要用户自己封装个API,从相应的结构体变量里面获取相关数据。
回复

使用道具 举报

12

主题

176

回帖

212

积分

高级会员

积分
212
发表于 2022-7-8 16:18:32 | 显示全部楼层
eric2013 发表于 2021-1-17 08:10
可以,得需要用户自己封装个API,从相应的结构体变量里面获取相关数据。

请硬汉细说一下大致的思路吧,谢谢
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106422
QQ
发表于 2022-7-9 10:40:38 | 显示全部楼层
gallop020142 发表于 2022-7-8 16:18
请硬汉细说一下大致的思路吧,谢谢

任务都有个任务控制块结构体变量。

所有创建的任务有一个列表,将所有这种任务控制块结构体连接起来。然后你可以可以将所有这些任务控制块里面的结构体程序信息打印出来,这个就是任务相关的信息。
回复

使用道具 举报

12

主题

176

回帖

212

积分

高级会员

积分
212
发表于 2022-7-9 11:51:36 | 显示全部楼层
eric2013 发表于 2022-7-9 10:40
任务都有个任务控制块结构体变量。

所有创建的任务有一个列表,将所有这种任务控制块结构体连接起来。 ...

您是指 osThreadAttr_t 这个结构体是吧?根据threadid可以获得任务是否在运行。
但是怎么统计各任务的cpu利用率呢?没想明白任务的怎么计算。
您之前计算cpu利用率是在 osRtxIdleThread 里面统计空闲时的计数值,这样计算的是总的cpu利用率。

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106422
QQ
发表于 2022-7-10 01:07:27 | 显示全部楼层
gallop020142 发表于 2022-7-9 11:51
您是指 osThreadAttr_t 这个结构体是吧?根据threadid可以获得任务是否在运行。
但是怎么统计各任务的cp ...

1、不是,类似uCOS这样
image.png


2、这个在RTX4上我有做过案例,此贴可以参考
https://www.armbbs.cn/forum.php?mod=viewthread&tid=17330
回复

使用道具 举报

4

主题

164

回帖

176

积分

初级会员

积分
176
发表于 2022-8-6 19:50:59 | 显示全部楼层
eric2013 发表于 2019-6-13 10:10
1、基本不影响,这个开关中断的时间非常短,可以忽略。

2、有别的解决办法,你可以用原子操作。

这程序里没有别的地方给这个变量赋值,为什么需要原子操作或开关中断呢
回复

使用道具 举报

12

主题

176

回帖

212

积分

高级会员

积分
212
发表于 2022-9-3 16:03:36 | 显示全部楼层
eric2013 发表于 2022-7-10 01:07
1、不是,类似uCOS这样

关于每个任务的cpu利用率,请问您指的是利用 thread control block  osRtxThread_t 吗?
跟ucos例程类似,我通过定义一个指针 osRtxThread_t *p_tcb,来遍历,但是怎么找第一个 tcb呢?谢谢

Screenshot 2022-09-03 160205.jpg

回复

使用道具 举报

4

主题

164

回帖

176

积分

初级会员

积分
176
发表于 2022-9-6 08:56:50 | 显示全部楼层
eric2013 发表于 2019-6-13 10:12
RTX5这里提供了一批API,你可以搞出来用用

现在的RTX看不到线程最大堆栈使用值了吗
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106422
QQ
发表于 2022-9-7 01:22:35 | 显示全部楼层
yuanzhongda 发表于 2022-9-6 08:56
现在的RTX看不到线程最大堆栈使用值了吗

可以的,RTX5有个选项可以勾上的。
回复

使用道具 举报

4

主题

164

回帖

176

积分

初级会员

积分
176
发表于 2022-9-7 10:05:29 | 显示全部楼层
eric2013 发表于 2022-9-7 01:22
可以的,RTX5有个选项可以勾上的。

有吗,我更新了5.37之后就没看到了,我以为删除了,可以帮忙指一下在哪里吗
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106422
QQ
发表于 2022-9-8 12:05:46 | 显示全部楼层
yuanzhongda 发表于 2022-9-7 10:05
有吗,我更新了5.37之后就没看到了,我以为删除了,可以帮忙指一下在哪里吗

image.png
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 08:15 , Processed in 0.261580 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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