• 【FreeRTOS】15 空闲任务(实例:CPU利用率统计)


    本节我们来讲讲FreeRTOS自带的一个特殊的任务——空闲任务。

    先讲空闲任务的作用,然后结合空闲任务的特性,实现一个CPU利用率统计的例程。

    1)空闲任务的功能

    在freeRTOS中,空闲任务是自带的一个任务,是系统后台自动创建的;顾名思义,它是在处理器空闲的时候才运行的一个任务,也就是当所有用户任务都不在运行态时,它才会被运行;它的优先级永远最低。

    我们知道,在裸机程序中,主函数中一般有个无限循环,在循环中依据各种条件去执行用户程序,如果没有用户程序需要执行,CPU它也会在无限循环里空转。空闲任务在RTOS中的作用,就相当于没有任务需要执行时CPU的空转。

    实际上,在空闲任务中,也可以插入一些有用的操作,例如:上一节我们讲过的低功耗模式,就是利用了当其他任务都没有在运行时,会进入空闲任务,那么就可以在空闲任务中开启低功耗模式;另外,如果某个任务要调用vTaskDelete()删除自己,那么这个任务的任务控制块TCB、任务堆栈等等,就需要在别的任务里释放,这些释放功能最好就是放在空闲任务中。

    2)空闲任务的钩子函数

    由于空闲任务是freeRTOS自动创建的,它的任务函数是在tack.c文件中:

    但是实际上,我们完全可以不关心它是怎么实现的。如果我们想在空闲任务运行时,执行一些特定的功能,可以使用空闲任务的钩子函数。我们只需要知道如何使用它的钩子函数就可以了。

    这里解释一下什么是钩子函数,“钩子”实际上是hook这个单词翻译过来的,字面意思很不好理解,而实际上,钩子函数其实就是个回调函数。钩子函数在空闲任务中被调用了,用户可以通过实现回调函数的方式,将自己需要执行的功能,插入到空闲任务中执行。

    在空闲任务的实现函数中,可以找到调用了一个vApplicationIdleHook()函数,这就是它的钩子函数:

    用户只要重写这个函数,就可以把想要执行的功能插入到空闲任务中执行。

    3)编程实例——利用空闲任务统计CPU利用率

    我们利用空闲任务的特性,来编写一个计算CPU利用率的程序。

    前面已经讲过,空闲任务是在其他“有用”的任务都不执行的时候才执行的,那么我们统计一段已知时间长度内空闲任务占用的时间,就知道了CPU的“空闲率”,同时也就知道了CPU的使用率。

    先使用cubemx建立工程,注意选择使能空闲任务的钩子函数功能:

    或者生成keil工程后,在FreeRTOSConfig.h文件中修改configUSE_IDLE_HOOK宏为1:

    可以看到freertos.c文件中,生成了钩子函数,但是内部是空的,需要用户编写:

    我们在钩子函数里添加CPU利用率统计的代码,分三部分来实现:

    第一步,是在首次进入空闲函数时,关闭任务调度,让空闲任务独占CPU,记录100个时钟节拍内的累加计数。这样我们就知道了在100个时钟节拍内,CPU总共能累加多少值,这个值也代表了100个时钟周期的总时间,我们存在total_count变量中:

    第二步,在空闲任务中,记录每100个时钟节拍内的累加计数,这是实时的、空闲任务占用的CPU时间,我们存放在count中:

    最后一步就是利用100个节拍内空闲任务占用的时间、总时间来计算CPU利用率,计算结果只保留了百分数的整数,存放在cpu_usage中:

    实现完上述代码后,我们可以在用户任务中编写代码占用一些CPU时间测试一下。

    各个函数中,均只调用延时函数,在Task02任务中再添加一个打印CPU占用率的语句:

    (这里插个小知识,c语言打印%时,实际需要输入两个%%)

    程序的运行结果如下:

    可以看到,CPU利用率在2%左右,因为打印输出、任务切换调度消耗了部分CPU的时间。

    将Task02修改为以下形式,使用HAL_Delay()占用一段时间的CPU:

    改后的程序的运行结果如下:

    可以看到,CPU占用率提高到了21%

    好了,本节的内容就到这里了。

     

  • 相关阅读:
    每个人都可以用的开源微信机器人
    数据结构之算法基础
    ADO.NET之SqlDataAdpter对象
    JAVA基础——day06
    计算机网络TCP篇①
    多线程的概念(多线程的代码实现)
    剑指offer专项突击版第22天
    第二讲 Linear Model
    在 Apache Tomcat 中配置双向 SSL
    【洛谷题解】P1441 砝码称重
  • 原文地址:https://blog.csdn.net/little_grapes/article/details/126313437