• 十、空闲任务及其钩子函数


    1、空闲任务的介绍

    (1)一个良好的程序,它的任务都是事件驱动的:平时大部分时间处于阻塞状态。

    (2)有可能我们自己创建的所有任务都无法执行,但是调度器必须能找到一个可以运行的任务。所以,我们要提供空闲任务。

    (3)在使用vTaskStartScheduler()函数来创建、启动调度器时,这个函数内部会创建空闲任务:

    • 空闲任务优先级为0:它不能阻碍用户任务运行。
    • 空闲任务要么处于就绪态,要么处于运行态,永远不会阻塞。

    (4)空闲任务的优先级为0,这意味着一旦某个用户的任务变为就绪态,那么空闲任务马上被切换出去,让这个用户任务运行。在这种情况下,我们说用户任务“抢占”(pre-empt)了空闲任务,这是由调度器实现的。

    (5)需要注意的是:如果使用vTaskDelete() 来删除任务,那么你就要确保空闲任务有机会执行,否则就无法释放被删除任务的内存。

    (6)我们可以添加一个空闲任务的钩子函数(Idle Task Hook Functions),空闲任务的循环每执行一次,就会调用一次钩子函数。钩子函数的作用有这些:

    • 执行一些低优先级的、后台的、需要连续执行的函数。
    • 测量系统的空闲时间:空闲任务能被执行就意味着所有的高优先级任务都停止了,所以测量空闲任务占据的时间,就可以算出处理器占用率。
    • 让系统进入省电模式:空闲任务能被执行就意味着没有更重要的事情要做,当然可以进入省电模式了。

    (7)空闲任务的钩子函数的限制:

    • 不能导致空闲任务进入阻塞状态、暂停状态。
    • 如果你会使用vTaskDelete()来删除任务,那么钩子函数要非常高效地执行。如果空闲任务一直卡在钩子函数里的话,它就无法释放内存。

    2、使用钩子函数的前提

    (1)在 FreeRTOS\Source\tasks.c 中,可以看到如下代码,所以前提就是:

    • 把这个宏定义为1:configUSE_IDLE_HOOK
    • 实现 vApplicationIdleHook 函数。

    (2)configUSE_IDLE_HOOK 这个宏在 FreeRTOSConfig.h 文件中定义或修改。

    3、任务内存的清理

    (1)使用xTaskCreate创建任务,分配TCB和栈;在vTaskDelete中删除任务,但不一定是在vTaskDelete中释放TCB和栈。

    (2)对于自杀的任务,由空闲任务来清理内存。(自杀的人,死人不能清理自己的尸体)

    (3)对于被杀的任务,在vTaskDelete函数内部清理内存。(凶手调用这个函数,由凶手清理尸体)

    (4)在空闲任务中,不用进行什么操作,只要保证空闲任务有可以执行的机会。空闲任务会自动清理自杀任务的内存。

  • 相关阅读:
    Multisim14 逻辑分析仪的使用教程(打开&关闭+详细具体)
    数据结构 1.1 初学数据结构
    R语言dplyr包filter函数过滤dataframe数据中指定数据列的内容为(等于指定向量中的其中一个)在指定列表中的数据行
    C语言程序设计笔记(浙大翁恺版) 第五周:循环控制
    Shell及Linux三剑客grep、sed、awk
    面试:自定义view / viewgroup 相关问题
    【项目实战】自主实现 HTTP 项目(三)——请求读取与解析以及报文处理
    手写数组方法之数组静态方法
    【0基础学算法】快速排序(超详细讲解+私人笔记+源码)
    GLSL ES着色器 精度限定字
  • 原文地址:https://blog.csdn.net/weixin_42727214/article/details/133465574