mmuyu 发表于 2023-8-6 00:50:54

使用vTaskGetRunTimeStats函数查看各任务cpu占用率

本帖最后由 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是空闲时间,也就是说我们还剩余很多算力可以留给我们做其他事情。
页: [1]
查看完整版本: 使用vTaskGetRunTimeStats函数查看各任务cpu占用率