收藏官网首页
查看: 3801|回复: 0

[经验分享] 使用vTaskGetRunTimeStats函数查看各任务cpu占用率

106

主题

107

帖子

7264

积分

论坛元老

Rank: 8Rank: 8

积分
7264
跳转到指定楼层
楼主
 楼主| 发表于 2023-8-6 00:50:54 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
免费使用STM32、APP自动代码生成工具
本帖最后由 mmuyu 于 2023-8-6 00:52 编辑

    vTaskGetRunTimeStats()是freertos提供的一个api,利用此api可以得知各个任务的运行时间和运行时间对内核时间的占比,因此可以很方便得知各个任务的cpu利用率。此函数返回的是字符串,以类似表格的形式输出各个任务的时间。
要使用此函数,我们需要先在cubemx开启一些功能,我们可以看freertos的开发者文档了解需要配置哪些宏。

从图中可以知道要开启,configGENERATE_RUN_TIME_STATS  和 configUSE_STATS_FORMATTING_FUNCTIONS。
接下来,我们可以在cubemx启用这两个配置。

启用完成后,我们还需要在freertosconfig.h里定义两个宏portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()和portGET_RUN_TIME_COUNTER_VALUE() 第一个用于初始化时基,或者说初始化一个定时器用于生成高精度的计数,要求要比freertos的tick高10到20倍,第二个是用于返回当前的时间
因此我们要为第一个宏定义一个初始化定时器的功能,第二个宏则是定时器当前的计数值。
freertos的心跳是1000hz,因此我们要配置一个20khz的定时器用于生成时基,刚好tim1没用到,可以利用tim1来生成。
启用定时器一,预分频72-1,重装载50-1 这样就得到一个20khz的中断功能

然后到中断管理里启用中断

在生成代码里勾选生成使能tim1中断


接下来就是编写代码了,宏定义cubemx已经帮我们配置好了,我们只需要实现两个函数即可。

我们需要在freertos.c里实现这两个函数,这两个函数是宏定义的外部函数

第一个是初始化时基或者初始化计数值,第二个是返回当前的计数值,我们可以用hal库的定时器初始化和返回定时器的值实现,但是会麻烦一点,因为要包含比较多的头文件。那么我们就写一个中断的计数值来实现。
定义一个run_time变量,使用u long类型

实现两个方法,第一个是将变量初始化为0,第二个是返回变量的值,变量的值的更新我们在中断回调里实现。
找到中断回调函数,使用外部变量的方式更新我们的变量

再创建一个任务用于打印占用信息

最后,烧录代码,看串口输出

可以看出,在数据点发生变动的时候,机智云业务函数会占用多点cpu,其中idle是空闲时间,也就是说我们还剩余很多算力可以留给我们做其他事情。

微信截图_20230806004325.png (16.95 KB, 下载次数: 124)

微信截图_20230806004325.png
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

加入Q群 返回顶部

版权与免责声明 © 2006-2024 Gizwits IoT Technology Co., Ltd. ( 粤ICP备11090211号 )

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