STM32CubeMX学习笔记(37)——FreeRTOS实时操作系统使用(CPU使用率统计)

一、FreeRTOS简介

FreeRTOS 是一个可裁剪、可剥夺型的多任务内核,而且没有任务数限制。FreeRTOS 提供了实时操作系统所需的所有功能,包括资源管理、同步、任务通信等。

FreeRTOS 是用 C 和汇编来写的,其中绝大部分都是用 C 语言编写的,只有极少数的与处理器密切相关的部分代码才是用汇编写的,FreeRTOS 结构简洁,可读性很强!最主要的是非常适合初次接触嵌入式实时操作系统学生、嵌入式系统开发人员和爱好者学习。

最新版本 V9.0.0(2016年),尽管现在 FreeRTOS 的版本已经更新到 V10.4.1 了,但是我们还是选择 V9.0.0,因为内核很稳定,并且网上资料很多,因为 V10.0.0 版本之后是亚马逊收购了FreeRTOS之后才出来的版本,主要添加了一些云端组件,一般采用 V9.0.0 版本足以。

  • FreeRTOS官网:http://www.freertos.org/
  • 代码托管网站:https://sourceforge.net/projects/freertos/files/FreeRTOS/

二、新建工程

1. 打开 STM32CubeMX 软件,点击“新建工程”

STM32CubeMX学习笔记(37)——FreeRTOS实时操作系统使用(CPU使用率统计)

3. 配置时钟
RCC 设置,选择 HSE(外部高速时钟) 为 Crystal/Ceramic Resonator(晶振/陶瓷谐振器)

STM32CubeMX学习笔记(37)——FreeRTOS实时操作系统使用(CPU使用率统计)

4. 配置调试模式
非常重要的一步,否则会造成第一次烧录程序后续无法识别调试器
SYS 设置,选择 Debug 为 Serial Wire

STM32CubeMX学习笔记(37)——FreeRTOS实时操作系统使用(CPU使用率统计)

在基于STM32 HAL的项目中,一般需要维护的 “时基” 主要有2个:

  1. HAL的时基,SYS Timebase Source
  2. OS的时基(仅在使用OS的情况下才考虑)

而这些 “时基” 该去如何维护,主要分为两种情况考虑:

  • 裸机运行
    可以通过 (滴答定时器)或 ()定时器 的方式来维护 ,也就是HAL库中的 ,这是HAL库中维护的一个全局变量。在裸机运行的情况下,我们一般选择默认的 (滴答定时器) 方式即可,也就是直接放在 中断服务函数中来维护。

  • 带OS运行
    前面提到的 是STM32的HAL库中的新增部分,主要用于实现 以及作为各种 timeout 的时钟基准。

    在使用了OS(操作系统)之后,OS的运行也需要一个时钟基准(简称“时基”),来对任务和时间等进行管理。而OS的这个 时基 一般也都是通过 (滴答定时器) 来维护的,这时就需要考虑 “HAL的时基” 和 “OS的时基” 是否要共用 (滴答定时器) 了。

    如果共用SysTick,当我们在CubeMX中选择启用FreeRTOS之后,在生成代码时,CubeMX一定会报如下提示:

    STM32CubeMX学习笔记(37)——FreeRTOS实时操作系统使用(CPU使用率统计)

    STM32CubeMX学习笔记(37)——FreeRTOS实时操作系统使用(CPU使用率统计)

    4.3 创建任务Task

    在 进行配置。

    我们创建三个测试任务。

    STM32CubeMX学习笔记(37)——FreeRTOS实时操作系统使用(CPU使用率统计)
    • Task Name: 任务名称
    • Priority: 优先级,在 FreeRTOS 中,数值越大优先级越高,0 代表最低优先级
    • Stack Size (Words): 堆栈大小,单位为字,在32位处理器(STM32),一个字等于4字节,如果传入512那么任务大小为512*4字节
    • Entry Function: 入口函数
    • Code Generation Option: 代码生成选项
    • Parameter: 任务入口函数形参,不用的时候配置为0或NULL即可
    • Allocation: 分配方式: 动态内存创建
    • Buffer Name: 缓冲区名称
    • Conrol Block Name: 控制块名称

    五、TIM6基本定时器

    5.1 参数配置

    在 中选择 设置,并勾选 激活

    STM32CubeMX学习笔记(37)——FreeRTOS实时操作系统使用(CPU使用率统计)

    定时器溢出时间:

    Tout = 1 / (Tclk / (psc + 1)) (arr + 1)

    • 定时器时钟Tclk:72MHz
    • 预分频器psc:71
    • 自动重装载寄存器arr:49
    • Prescaler(时钟预分频数):72-1
    • Counter Mode(计数模式):Up(向上计数模式)
    • Counter Period(自动重装载值):50-1
    • auto-reload-preload(自动重装载):Enable(使能)
    • TRGO Parameters(触发输出):不使能
      STM32CubeMX学习笔记(37)——FreeRTOS实时操作系统使用(CPU使用率统计)

      六、UART串口打印

      查看 STM32CubeMX学习笔记(6)——USART串口使用

      七、生成代码

      输入项目名和项目路径

      STM32CubeMX学习笔记(37)——FreeRTOS实时操作系统使用(CPU使用率统计)
      每个外设生成独立的 文件
      不勾:所有初始化代码都生成在 main.c
      勾选:初始化代码生成在对应的外设文件。 如 GPIO 初始化代码生成在 gpio.c 中。
      STM32CubeMX学习笔记(37)——FreeRTOS实时操作系统使用(CPU使用率统计)

      八、CPU利用率统计

      8.1 基本概念

      CPU 使用率其实就是系统运行的程序占用的 CPU 资源,表示机器在某段时间程序运行的情况,如果这段时间中,程序一直在占用 CPU 的使用权,那么可以人为 CPU 的利用率是 100%。CPU 的利用率越高,说明机器在这个时间上运行了很多程序,反之较少。利用率的高低与 CPU 强弱有直接关系,就像一段一模一样的程序,如果使用运算速度很慢的 CPU,它可能要运行 1000ms,而使用很运算速度很快的 CPU 可能只需要 10ms,那么在 1000ms 这段时间中,前者的 CPU 利用率就是 100%,而后者的 CPU 利用率只有 1%,因为 1000ms 内前者都在使用 CPU 做运算,而后者只使用 10ms 的时间做运算,剩下的时间 CPU 可以做其他事情。

      FreeRTOS 是多任务操作系统,对 CPU 都是分时使用的:比如 A 任务占用 10ms,然后 B 任务占用 30ms,然后空闲 60ms,再又是 A 任务占 10ms,B 任务占 30ms,空闲 60ms;

      8.2 FreeRTOS进行CPU利用率统计

      在调试的时候很有必要得到当前系统的 CPU 利用率相关信息,但是在产品发布的时候,就可以把 CPU 利用率统计这个功能去掉,因为使用任何功能的时候,都是需要消耗系统资源的,FreeRTOS 是使用一个外部的变量进行统计时间的,并且消耗一个高精度的定时器,其用于定时的精度是系统时钟节拍的 10-20 倍,比如当前系统时钟节拍是 1000HZ,那么定时器的计数节拍就要是 10000-20000HZ。而且 FreeRTOS 进行 CPU 利用率统计的时候,也有一定缺陷,因为它没有对进行 CPU 利用率统计时间的变量做溢出保护,我们使用的是 32 位变量来系统运行的时间计数值,而按 20000HZ 的中断频率计算,每进入一中断就是 50us,变量加一,最大支持计数时间:2^32 * 50us / 3600s = 59.6 分钟,运行时间超过了 59.6 分钟后统计的结果将不准确,除此之外整个系统一直响应定时器 50us 一次的中断会比较影响系统的性能。

      九、示例

      9.1 CPU 利用率统计实验

      CPU 利用率实验是是在 FreeRTOS 中创建了三个任务,其中两个任务是普通任务,另
      一个任务通过 和 获取 CPU 利用率与任务相关信息并通过串口打印出来。

      修改main.c

      来源:Leung_ManWah

      声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年3月5日
下一篇 2022年3月5日

相关推荐