RTX操作系统下增加CPU使用率
在RTX操作系统下增加CPU使用率,直接使用的是硬汉的例程里面的,但是有一点疑问,看下图:这是在空闲任务里面计数,从而计算CPU的使用率。但是测试发现这个计数必须__set_PRIMASK(1);和__set_PRIMASK(0);开关中断,否则计算出来的就非常离谱。那么我想问下这个一直开关中断会不会有啥影响呢?会不会影响实时性?有没有其他方法计算CPU使用率呢?
1、基本不影响,这个开关中断的时间非常短,可以忽略。
2、有别的解决办法,你可以用原子操作。 RTX5这里提供了一批API,你可以搞出来用用
https://img.anfulai.cn/dz/attachment/forum/201901/21/170412mcddjkzs9mid8cmm.jpg
eric2013 发表于 2019-6-13 10:12
RTX5这里提供了一批API,你可以搞出来用用
谢谢老大。 楼主看看我给RTX增加CPU使用率的方法,简单高效:
在os_idle_demon函数所在文件中定义如下代码:
volatile U32 os_idleCnt = 0;
__task void os_idle_demon(void)
{
/* The idle demon is a system task, running when no other task is ready */
/* to run. The 'os_xxx' function calls are not allowed from this task.*/
for (;;) {
/* HERE: include optional user code to be executed when no task runs.*/
os_idleCnt++;
}
}
static U32 os_idleMax = 0;
void os_cpu_usage_startup(void)
{
U32 cnt0 = 0;
os_dly_wait(1);
cnt0 = os_idleCnt;
os_dly_wait(50);
cnt0 = os_idleCnt - cnt0;
os_idleMax = cnt0;
}
U8 os_cpu_usage(void)
{
static U32 last_tick = 0;
static U32 last_cnt = 0;
U32 cnt, ticks;
if (last_cnt == 0) {
last_cnt = os_idleCnt | 1;
last_tick = os_time;
return 0;
}
cnt = os_idleCnt - last_cnt;
ticks = os_time - last_tick;
last_cnt = os_idleCnt | 1;
last_tick = os_time;
if (ticks == 0) {
return 0;
}
cnt = cnt * 50 / ticks;
cnt = (os_idleMax - cnt) * 100 / os_idleMax;
return (U8)cnt;
}其中以下两个函数导出供外部调用即可:
void os_cpu_usage_startup(void);
U8 os_cpu_usage(void);然后在第一个线程(即启动线程)中调用os_cpu_usage_startup函数,例如:
static void __ThreadStartup(void)
{
// CPU使用率接口
os_cpu_usage_startup();
// 其它系统加载和初始化
}之后,就可以在某一个线程中,周期性的调用os_cpu_usage函数来获得CPU使用率了。使用率是取值的整数。
以上实现方法,不需要原子操作;是生产者消费者模型,只有一处写,另一处只读,不需要互斥或原子操作。 如果提示没有os_time定义,就加入这句就行,因为RTX实际上有这个变量:
extern volatile U32 os_time; // 从rt_Time.o模块导出 公仆 发表于 2019-6-20 11:43
如果提示没有os_time定义,就加入这句就行,因为RTX实际上有这个变量:
感谢 eric2013 发表于 2019-6-13 10:12
RTX5这里提供了一批API,你可以搞出来用用
硬汉大佬,这几个函数我看了,原子操作不支持m0级别的MCU,目前我用的就是M0,有没有其他的函数实现原子操作不用关开中断。 终极菜鸟 发表于 2020-4-21 18:17
硬汉大佬,这几个函数我看了,原子操作不支持m0级别的MCU,目前我用的就是M0,有没有其他的函数实现原子 ...
那得换个思路了,暂时我这里没有实现思路了。 eric2013 发表于 2020-4-21 18:25
那得换个思路了,暂时我这里没有实现思路了。
顺便问下你,RTX我用keil 自带的那个CMSIS RTOS RTOS2都感觉怪怪的,过度封装,你一般实际用原版的RTX,还是用封装过的。还是考虑以后代码的继承性。 终极菜鸟 发表于 2020-4-22 10:26
顺便问下你,RTX我用keil 自带的那个CMSIS RTOS RTOS2都感觉怪怪的,过度封装,你一般实际用原版的RTX, ...
rtx5用带封装的。
rtx4用原始版本。 如何查看某个任务的 CPU 使用率 ? aqua2013 发表于 2021-1-15 17:38
如何查看某个任务的 CPU 使用率 ?
RTX5查看比较方便。
RTX4没有做这种方式。 硬汉大佬,RTX5不仿真的情况下打印每个任务的使用率和时间能实现吗? pokemonds 发表于 2021-1-16 16:15
硬汉大佬,RTX5不仿真的情况下打印每个任务的使用率和时间能实现吗?
可以,得需要用户自己封装个API,从相应的结构体变量里面获取相关数据。 eric2013 发表于 2021-1-17 08:10
可以,得需要用户自己封装个API,从相应的结构体变量里面获取相关数据。
请硬汉细说一下大致的思路吧,谢谢 gallop020142 发表于 2022-7-8 16:18
请硬汉细说一下大致的思路吧,谢谢
任务都有个任务控制块结构体变量。
所有创建的任务有一个列表,将所有这种任务控制块结构体连接起来。然后你可以可以将所有这些任务控制块里面的结构体程序信息打印出来,这个就是任务相关的信息。 eric2013 发表于 2022-7-9 10:40
任务都有个任务控制块结构体变量。
所有创建的任务有一个列表,将所有这种任务控制块结构体连接起来。 ...
您是指 osThreadAttr_t 这个结构体是吧?根据threadid可以获得任务是否在运行。
但是怎么统计各任务的cpu利用率呢?没想明白任务的怎么计算。
您之前计算cpu利用率是在 osRtxIdleThread 里面统计空闲时的计数值,这样计算的是总的cpu利用率。
gallop020142 发表于 2022-7-9 11:51
您是指 osThreadAttr_t 这个结构体是吧?根据threadid可以获得任务是否在运行。
但是怎么统计各任务的cp ...
1、不是,类似uCOS这样
2、这个在RTX4上我有做过案例,此贴可以参考
https://www.armbbs.cn/forum.php?mod=viewthread&tid=17330
eric2013 发表于 2019-6-13 10:10
1、基本不影响,这个开关中断的时间非常短,可以忽略。
2、有别的解决办法,你可以用原子操作。
这程序里没有别的地方给这个变量赋值,为什么需要原子操作或开关中断呢
eric2013 发表于 2022-7-10 01:07
1、不是,类似uCOS这样
关于每个任务的cpu利用率,请问您指的是利用 thread control blockosRtxThread_t 吗?
跟ucos例程类似,我通过定义一个指针 osRtxThread_t *p_tcb,来遍历,但是怎么找第一个 tcb呢?谢谢
eric2013 发表于 2019-6-13 10:12
RTX5这里提供了一批API,你可以搞出来用用
现在的RTX看不到线程最大堆栈使用值了吗 yuanzhongda 发表于 2022-9-6 08:56
现在的RTX看不到线程最大堆栈使用值了吗
可以的,RTX5有个选项可以勾上的。 eric2013 发表于 2022-9-7 01:22
可以的,RTX5有个选项可以勾上的。
有吗,我更新了5.37之后就没看到了,我以为删除了,可以帮忙指一下在哪里吗 yuanzhongda 发表于 2022-9-7 10:05
有吗,我更新了5.37之后就没看到了,我以为删除了,可以帮忙指一下在哪里吗
页:
[1]