返回顶部
首页 > 资讯 > 精选 >FreeRTOS空闲任务是什么
  • 874
分享到

FreeRTOS空闲任务是什么

2023-06-29 23:06:56 874人浏览 八月长安
摘要

本文小编为大家详细介绍“FreeRTOS空闲任务是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“FreeRTOS空闲任务是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。    &nb

本文小编为大家详细介绍“FreeRTOS空闲任务是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“FreeRTOS空闲任务是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

             当RTOS调度器开始工作后,为了保证至少有一个任务在运行,空闲任务被自动创建,占用最低优先级(0优先级)。

       xReturn = xTaskCreate( prvIdleTask,                         "IDLE",configMINIMAL_STACK_SIZE,                         (void * ) NULL,                         (tskIDLE_PRioRITY | portPRIVILEGE_BIT ),                         &xIdleTaskHandle);

             空闲任务是FreeRTOS不可缺少的任务,因为FreeRTOS设计要求必须至少有一个任务处于运行状态。我们来看一下空闲任务要做的工作。

    释放内存

             从V9.0版本开始,如果一个任务删除另外一个任务,被删除任务的堆栈和TCB立即释放。如果一个任务删除自己,则任务的堆栈和TCB和以前一样,通过空闲任务删除。所以空闲任务开始就会检查是否有任务删除了自己,如果有的话,空闲任务负责删除这个任务的TCB和堆栈空间。

    处理空闲优先级任务

             当使用抢占式内核,相同优先级的任务使用时间片方式获得CPU权限。如果有任务与空闲任务共享一个优先级,并且宏configIDLE_SHOULD_YIELD设置为1,那么空闲任务不必等到时间片耗尽再进行任务切换。

             所以空闲任务检查空闲优先级下的就绪列表中是否有多个任务,有的话则执行任务切换,让用户任务获得CPU权限。

             宏configIDLE_SHOULD_YIELD控制任务在空闲优先级中的行为。仅在满足下列条件后,才会起作用。

    使用抢占式内核调度用户任务使用空闲优先级。

            通过时间片共享同一个优先级的多个任务,如果共享的优先级大于空闲优先级,并假设没有更高优先级任务,这些任务应该获得相同的处理器时间。

            但如果共享空闲优先级时,情况会稍微有些不同。当configIDLE_SHOULD_YIELD为1时,其它共享空闲优先级的用户任务就绪时,空闲任务立刻让出CPU,用户任务运行,这样确保了能最快响应用户任务。处于这种模式下也会有不良效果(取决于你的程序需要),描述如下:

    FreeRTOS空闲任务是什么

          图中描述了四个处于空闲优先级的任务,任务A、B和C是用户任务,任务I是空闲任务。上下文切换周期性的发生在T0、T1…T6时刻。当用户任务运行时,空闲任务立刻让出CPU,但是,空闲任务已经消耗了当前时间片中的一定时间。这样的结果就是空闲任务I和用户任务A共享一个时间片。用户任务B和用户任务C因此获得了比用户任务A更多的处理器时间。

          可以通过下面方法避免:

    • 如果合适的话,将处于空闲优先级的各单独的任务放置到空闲钩子函数中;创建的用户任务优先级大于空闲优先级;设置IDLE_SHOULD_YIELD为0;

            设置configIDLE_SHOULD_YIELD为0将阻止空闲任务为用户任务让出CPU,直到空闲任务的时间片结束。这确保所有处在空闲优先级的任务分配到相同多的处理器时间,但是,这是以分配给空闲任务更高比例的处理器时间为代价的。

      执行空闲任务钩子函数

               空闲任务钩子是一个函数,这个函数由用户来实现,RTOS规定了函数的名字和参数,这个函数在每个空闲任务周期都会被调用。

               要创建一个空闲钩子:

       

      设置FreeRTOSConfig.h 文件中的configUSE_IDLE_HOOK 为1;定义一个函数,函数名和参数如下所示:

    •  

      void vApplicationIdleHook(void );
    •          这个钩子函数不可以调用会引起空闲任务阻塞的api函数(例如:vTaskDelay()、带有阻塞时间的队列和信号量函数),在钩子函数内部使用协程是被允许的。

               使用空闲钩子函数设置CPU进入省电模式是很常见的。

      低功耗tickless模式

               通常情况下,FreeRTOS回调空闲任务钩子函数(需要设计者自己实现),在空闲任务钩子函数中设置微处理器进入低功耗模式来达到省电的目的。因为系统要响应系统节拍中断事件,因此使用这种方法会周期性的退出、再进入低功耗状态。如果系统节拍中断频率过快,则大部分电能和CPU时间会消耗在进入和退出低功耗状态上。

             FreeRTOS的tickless空闲模式会在空闲周期时停止周期性系统节拍中断。停止周期性系统节拍中断可以使微控制器长时间处于低功耗模式。移植层需要配置外部唤醒中断,当唤醒事件到来时,将微控制器从低功耗模式唤醒。微控制器唤醒后,会重新使能系统节拍中断。由于微控制器在进入低功耗后,系统节拍计数器是停止的,但我们又需要知道这段时间能折算成多少次系统节拍中断周期,这就需要有一个不受低功耗影响的外部时钟源,即微处理器处于低功耗模式时它也在计时的,这样在重启系统节拍中断时就可以根据这个外部计时器计算出一个调整值并写入RTOS 系统节拍计数器变量中。

               空闲任务的源代码如下所示,其中宏portTASK_FUNCTION翻译出来为:void prvIdleTask(void * pvParameters)。 

    • static portTASK_FUNCTION( prvIdleTask,pvParameters ){  (void ) pvParameters; for(;; ) {      prvCheckTasksWaitingTermination();   #if( configUSE_PREEMPTION == 0 )   {taskYIELD();   }   #endif   #if( ( configUSE_PREEMPTION == 1 ) && ( configIDLE_SHOULD_YIELD == 1 ) )   {if(listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ tskIDLE_PRIORITY ] ) ) >( UBaseType_t ) 1 ){ taskYIELD();}   }   #endif   #if( configUSE_IDLE_HOOK == 1 )   {externvoid vApplicationIdleHook( void );vApplicationIdleHook();   }   #endif   #if( configUSE_TICKLESS_IDLE != 0 )   {   TickType_txExpectedIdleTime;xExpectedIdleTime= prvGetExpectedIdleTime();if(xExpectedIdleTime >= configEXPECTED_IDLE_TIME_BEFORE_SLEEP ){ vTaskSuspendAll(); {      configASSERT(xNextTaskUnblockTime >= xTickCount );   xExpectedIdleTime= prvGetExpectedIdleTime();   if(xExpectedIdleTime >= configEXPECTED_IDLE_TIME_BEFORE_SLEEP )   {portSUPPRESS_TICKS_AND_SLEEP(xExpectedIdleTime );   } } (void ) xTaskResumeAll();}   }   #endif }}读到这里,这篇“FreeRTOS空闲任务是什么”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网精选频道。

    --结束END--

    本文标题: FreeRTOS空闲任务是什么

    本文链接: https://lsjlt.com/news/326771.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    猜你喜欢
    • FreeRTOS空闲任务是什么
      本文小编为大家详细介绍“FreeRTOS空闲任务是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“FreeRTOS空闲任务是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。    &nb...
      99+
      2023-06-29
    • FreeRTOS进阶之空闲任务示例完全解析
      目录1.释放内存2. 处理空闲优先级任务3.执行空闲任务钩子函数4.低功耗tickless模式当RTOS调度器开始工作后,为了保证至少有一个任务在运行,空闲任务被自动创建,占用最低优...
      99+
      2024-04-02
    • FreeRTOS实时操作系统空闲任务的阻塞延时实现
      目录什么是阻塞延时、为什么需要空闲任务空闲任务的实现阻塞延时的实现xTicksToDelay 递减SysTick初始化仿真什么是阻塞延时、为什么需要空闲任务 RTOS中的延时叫阻塞延...
      99+
      2024-04-02
    • FreeRTOS实时操作系统空闲任务的阻塞延时怎么实现
      这篇文章主要介绍“FreeRTOS实时操作系统空闲任务的阻塞延时怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“FreeRTOS实时操作系统空闲任务的阻塞延时怎么实现”文章能帮助大家解决问题。...
      99+
      2023-06-29
    • freertos实时操作系统空闲任务阻塞延时示例解析
      目录前言空闲任务阻塞延时SysTick实验现象前言 阻塞态:如果一个任务当前正在等待某个外部事件,则称它处于阻塞态。 rtos中的延时叫阻塞延时,即任务需要延时的时候,会放弃CPU的...
      99+
      2024-04-02
    • FreeRTOS实时操作系统的任务是什么
      这篇文章主要介绍了FreeRTOS实时操作系统的任务是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇FreeRTOS实时操作系统的任务是什么文章都会有所收获,下面我们一起来看看吧。1. 任务和协程(Co-r...
      99+
      2023-06-29
    • FreeRTOS任务控制API函数的功能是什么
      本篇内容主要讲解“FreeRTOS任务控制API函数的功能是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“FreeRTOS任务控制API函数的功能是什么”吧!1.相对延时1.1函数描述voi...
      99+
      2023-06-29
    • FreeRTOS实时操作系统的任务应用函数是什么
      本文小编为大家详细介绍“FreeRTOS实时操作系统的任务应用函数是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“FreeRTOS实时操作系统的任务应用函数是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧...
      99+
      2023-06-29
    • PostgreSQL中空闲数据块管理机制的原理是什么
      本篇文章给大家分享的是有关PostgreSQL中空闲数据块管理机制的原理是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。数据块空闲空间的产...
      99+
      2024-04-02
    • FreeRTOS编码标准及风格是什么
      这篇文章主要介绍了FreeRTOS编码标准及风格是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇FreeRTOS编码标准及风格是什么文章都会有所收获,下面我们一起来看看吧。1.编码标准  &nbs...
      99+
      2023-06-29
    • MySQL怎么一个杀掉数据库空闲事务
      小编给大家分享一下MySQL怎么一个杀掉数据库空闲事务,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!  我们经常遇到一个情况,就是网络断开或程序Bug导致COMMIT/ROLLBACK语句...
      99+
      2024-04-02
    • MySQL中参数wait_timeout和interactive_timeout以及空闲超时的实现方法是什么
      本篇内容介绍了“MySQL中参数wait_timeout和interactive_timeout以及空闲超时的实现方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领...
      99+
      2024-04-02
    • FreeRTOS实时操作系统的任务通知怎么实现
      这篇文章主要介绍“FreeRTOS实时操作系统的任务通知怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“FreeRTOS实时操作系统的任务通知怎么实现”文章能帮助大家解决问题。前言注:本文介绍...
      99+
      2023-06-29
    • FreeRTOS实时操作系统结构是什么
      本文小编为大家详细介绍“FreeRTOS实时操作系统结构是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“FreeRTOS实时操作系统结构是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。 Fre...
      99+
      2023-06-29
    • FreeRTOS实时操作系统的任务怎么创建和删除
      本文小编为大家详细介绍“FreeRTOS实时操作系统的任务怎么创建和删除”,内容详细,步骤清晰,细节处理妥当,希望这篇“FreeRTOS实时操作系统的任务怎么创建和删除”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧...
      99+
      2023-06-29
    • MRP的基本任务是什么
      这篇“MRP的基本任务是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“MRP的基本任务是什么”文章吧。mrp系统是物资需...
      99+
      2023-07-02
    • quartz任务触发流程是什么
      Quartz任务触发流程如下:1. 创建一个JobDetail对象,该对象包含任务的详细信息,如任务名称、任务组、任务类等。2. 创...
      99+
      2023-08-31
      quartz
    • windows任务管理器结束任务的快捷键是什么
      这篇文章主要介绍了windows任务管理器结束任务的快捷键是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇windows任务管理器结束任务的快捷键是什么文章都会有所收获,下面我们一起来看看吧。任务管理器结束...
      99+
      2023-07-01
    • JavaScript中的宏任务和微任务执行顺序是什么
      这篇“JavaScript中的宏任务和微任务执行顺序是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“JavaScript...
      99+
      2023-07-04
    • 云服务器远程桌面空闲自动断线怎么解决
      云服务器远程桌面空闲自动断线的问题可能是由于以下几个原因导致的:1. 连接超时设置:默认情况下,远程桌面连接会在一段时间内没有活动后...
      99+
      2023-09-27
      云服务器
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作