0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

freeRTOS中空闲任务的作用

CHANBAEK 来源:嵌入式之入坑笔记 作者:嵌入式之入坑笔记 2023-07-04 15:16 次阅读

嵌入式实时操作系统中,都会有空闲任务的存在,这个任务是伴随着操作系统启动之后而存在的。正常情况来说,系统不挂掉,空闲任务都会一直存在。

freeRTOS 调度器启动时,自动创建空闲任务,以确保系统中始终存在一个能够运行的任务。 它是以最低优先级创建,以确保如果有更高的优先级的任务处于准备就绪状态,则空闲任务不使用任何 CPU 时间,让渡出CPU的使用权给到更高优先级的就绪任务去执行。

freeRTOS中创建空闲任务的代码如下:

xTaskCreate( prvIdleTask,
             configIDLE_TASK_NAME,
             configMINIMAL_STACK_SIZE,
             ( void * ) NULL,
             portPRIVILEGE_BIT,                                     
             &xIdleTaskHandle );

空闲任务的作用:

(1)释放内存

如果一个任务删除另外的任务,那个被删除的任务的TCB块和堆栈空间会被马上释放掉;

如果一个任务自己删除了自己,那么这个删除自身的任务的TCB块和堆栈空间是由空闲任务进行回收的,空闲任务会去查询有没有自己删除自己的任务,如果有就会去回收这个任务的TCB块和堆栈空间。如下:

图片

(2)处理空闲优先级任务

在freeRTOS中,如果使用抢占式的调度方式,具有相同优先级的任务是通过时间片的方式获取CPU使用权限的。通过时间片共享同一个优先级的多个任务,如果共享的优先级大于空闲优先级,并假设没有更高优先级的任务,这些任务应该获得相同的处理器时间。

但是在空闲任务优先级相同的情况下,这点是有些不同的。

如果有与空闲任务相同的优先级的其他任务,在宏 configIDLE_SHOULD_YIELD 为1时,空闲任务是不必等到时间片耗尽再进行任务切换的。意思是:时间片轮转到空闲任务执行时,如果这个时候检查到还有其他的任务处于就绪状态,空闲任务就直接把cpu执行权交给其他的任务,而不需要等待空闲任务的时间片使用完。

当然,这种情况是需要满足下面的条件才能够实现的:

1)系统调度方式使用的是抢占式的方式
2)有与空闲任务相同优先级的其他任务
3)宏 configIDLE_SHOULD_YIELD 设置为 1

如下例所示:

假设有三个任务A、B、C,他们的任务优先级与空闲任务I相同,并且宏 configIDLE_SHOULD_YIELD 为 1,那么任务A、B、C、I 的执行如下图演示:

图片

假设上下文切换周期性的发生在T0、T1…T6时刻,当T2时刻是空闲任务执行,然后发现任务A处于就绪,空闲任务I就会把cpu使用权让给任务A。但是这个时候下,任务A执行的时间片变短,因为空闲任务I占据了一部分的时间。这样相比之下,任务A比任务B、C的执行时间就变短了。

有什么办法解决这个问题吗?可以按照下面的方法考虑一下:

1)将跟空闲任务优先级相同的其他任务使用空闲钩子函数实现;
2)用户任务的任务优先级大于空闲任务的优先级;
3)设置 configIDLE_SHOULD_YIELD 为 0,不让空闲任务让出cpu使用权;

(3)执行空闲任务钩子函数

空闲任务钩本质就是一个函数,这个函数需要用户去实现,但是RTOS中规定了函数的名字和参数。如下:

voidvApplicationIdleHook(void);

这个钩子函数在每个空闲任务周期都会被调用。

要使用这个钩子函数的话,还需要再FreeRTOSConfig.h文件中将一个宏置 1,如下:

#define configUSE_IDLE_HOOK 1

特别要注意的是:空闲任务的钩子函数里面不可以调用会引起阻塞的API,比如消息队列、vTaskDelay()、消息邮箱、信号量之类的。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5017

    文章

    18497

    浏览量

    293259
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10548

    浏览量

    207667
  • 内存
    +关注

    关注

    8

    文章

    2800

    浏览量

    73125
  • 操作系统
    +关注

    关注

    37

    文章

    6407

    浏览量

    122316
  • FreeRTOS
    +关注

    关注

    12

    文章

    474

    浏览量

    61522
收藏 人收藏

    评论

    相关推荐

    FreeRTOS介绍与基础任务创建

    本篇介绍FreeRTOS与基础任务创建
    的头像 发表于 09-26 09:00 2016次阅读
    <b class='flag-5'>FreeRTOS</b>介绍与基础<b class='flag-5'>任务</b>创建

    FreeRTOS中的任务管理

    任务FreeRTOS 中最基本的调度单元,它是一段可执行的代码,可以独立运行。FreeRTOS 中的任务是基于优先级的抢占式调度,优先级高的任务
    的头像 发表于 11-27 17:03 524次阅读

    STM32__UCOSII系统启动过程中空闲任务和统计任务扮演怎样的角色?

    如题STM32__UCOSII系统启动过程中空闲任务和统计任务扮演怎样的角色
    发表于 05-08 07:37

    转:第10章 FreeRTOS任务管理

    10.8FreeRTOS任务删除10.9FreeRTOS任务挂起10.10FreeRTOS任务
    发表于 08-23 09:54

    总线细胞阵列中空闲细胞冗余数量研究

    总线细胞阵列中空闲细胞冗余数量研究_王涛
    发表于 01-07 21:39 0次下载

    Zynq中使用FreeRTOS空闲钩子函数时在SDK中的设置

    本文介绍zynq中使用FreeRTOS空闲钩子函数时在SDK中的设置和一些说明
    发表于 03-09 14:33 2437次阅读
    Zynq中使用<b class='flag-5'>FreeRTOS</b>的<b class='flag-5'>空闲</b>钩子函数时在SDK中的设置

    (一)FreeRTOS学习之FreeRTOS任务基础知识

    FreeRTOS学习之FreeRTOS任务基础知识转行小白一枚,通过博客记录自我学习,望更多博友多多指点,感激不尽!RTOS系统的核心就是任务管理,学习RTOS系统主要是为了使用RTO
    发表于 12-23 19:57 3次下载
    (一)<b class='flag-5'>FreeRTOS</b>学习之<b class='flag-5'>FreeRTOS</b><b class='flag-5'>任务</b>基础知识

    FreeRTOS任务详解

    详细讲解freeRTOS任务
    发表于 12-23 20:01 11次下载
    <b class='flag-5'>FreeRTOS</b>的<b class='flag-5'>任务</b>详解

    FreeRTOS高级篇11---空闲任务分析

    当RTOS调度器开始工作后,为了保证至少有一个任务在运行,空闲任务被自动创建,占用最低优先级(0优先级)。
    发表于 01-26 17:30 0次下载
    <b class='flag-5'>FreeRTOS</b>高级篇11---<b class='flag-5'>空闲</b><b class='flag-5'>任务</b>分析

    FreeRTOS高级篇2---FreeRTOS任务创建分析

    FreeRTOS基础系列《FreeRTOS系列第10篇---FreeRTOS任务创建和删除》中介绍了任务创建API函数xTaskCreat
    发表于 01-26 17:42 23次下载
    <b class='flag-5'>FreeRTOS</b>高级篇2---<b class='flag-5'>FreeRTOS</b><b class='flag-5'>任务</b>创建分析

    FreeRTOS系列第11篇---FreeRTOS任务控制

    FreeRTOS任务控制API函数主要实现任务延时、任务挂起、解除任务挂起、任务优先级获取和设置
    发表于 01-26 17:54 12次下载
    <b class='flag-5'>FreeRTOS</b>系列第11篇---<b class='flag-5'>FreeRTOS</b><b class='flag-5'>任务</b>控制

    freeRTOS任务

    freeRTOS系统的任务切换的具体过程最终都是在pendSV中断服务函数里面完成的。
    的头像 发表于 02-10 11:02 1200次阅读
    <b class='flag-5'>freeRTOS</b>的<b class='flag-5'>任务</b>

    FreeRTOS中的空闲任务是什么

    任务就会开始运行,空闲任务最重要的作用就是让处理器在无事可做的时候找点事做,防止处理器无聊,因此,空闲
    的头像 发表于 07-30 10:55 954次阅读

    FreeRTOS空闲任务低功耗模式

    一次进入低功耗模式。T2、T3 和 T4 这三个时刻都一样,反复的进入低功耗、退出低功耗,最理想的情况应该是从 T1 时刻就进入低功耗,然后在 T5 时刻退出。 在(2)中空闲任务只工作了两个时钟节拍,但是也执行了低功耗模式的进入和退出,显
    的头像 发表于 07-30 11:03 856次阅读

    FreeRTOS任务通知简介

    任务通知简介 任务通知在 FreeRTOS 中是一个可选的功能,要使用任务通知的话就需要将宏configUSE_TASK_NOTIFICATIONS 定义为 1。
    的头像 发表于 07-30 11:34 569次阅读