返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >FreeRTOS任务控制API函数的功能分析
  • 927
分享到

FreeRTOS任务控制API函数的功能分析

2024-04-02 19:04:59 927人浏览 薄情痞子
摘要

目录1.相对延时1.1函数描述1.2参数描述1.3用法举例2.绝对延时2.1函数描述2.2参数描述2.3用法举例3.获取任务优先级3.1函数描述3.2参数描述3.3返回值3.4用法举

1.相对延时

1.1函数描述

void vTaskDelay( portTickTypexTicksToDelay )

调用vTaskDelay()函数后,任务会进入阻塞状态,持续时间由vTaskDelay()函数的参数xTicksToDelay指定,单位是系统节拍时钟周期。常量portTICK_RATE_MS 用来辅助计算真实时间,此值是系统节拍时钟中断的周期,单位是毫秒。在文件FreeRTOSConfig.h中,宏INCLUDE_vTaskDelay 必须设置成1,此函数才能有效。

vTaskDelay()指定的延时时间是从调用vTaskDelay()后开始计算的相对时间。比如vTaskDelay(100),那么从调用vTaskDelay()后,任务进入阻塞状态,经过100个系统时钟节拍周期,任务解除阻塞。因此,vTaskDelay()并不适用与周期性执行任务的场合。此外,其它任务和中断活动,会影响到vTaskDelay()的调用(比如调用前高优先级任务抢占了当前任务),因此会影响任务下一次执行的时间。api函数vTaskDelayUntil()可用于固定频率的延时,它用来延时一个绝对时间。

1.2参数描述

xTicksToDelay:延时时间总数,单位是系统时钟节拍周期。

1.3用法举例

voidvTaskFunction( void * pvParameters )
 {
     
     constportTickType xDelay = 500 / portTICK_RATE_MS;
 
     for( ;; )
     {
         
         vToggleLED();
         vTaskDelay( xDelay );
     }
}

2.绝对延时

2.1函数描述

void vTaskDelayUntil( TickType_t *pxPreviousWakeTime,const TickType_txTimeIncrement );

任务延时一个指定的时间。周期性任务可以使用此函数,以确保一个恒定的频率执行。在文件FreeRTOSConfig.h中,宏INCLUDE_vTaskDelayUntil 必须设置成1,此函数才有效。

这个函数不同于vTaskDelay()函数的一个重要之处在于:vTaskDelay()指定的延时时间是从调用vTaskDelay()之后(执行完该函数)开始算起的,但是vTaskDelayUntil()指定的延时时间是一个绝对时间。

调用vTaskDelay()函数后,任务会进入阻塞状态,持续时间由vTaskDelay()函数的参数指定,单位是系统节拍时钟周期。因此vTaskDelay()并不适用于周期性执行任务的场合。因为调用vTaskDelay()到任务解除阻塞的时间不总是固定的并且该任务下一次调用vTaskDelay()函数的时间也不总是固定的(两次执行同一任务的时间间隔本身就不固定,中断或高优先级任务抢占也可能会改变每一次执行时间)。

vTaskDelay()指定一个从调用vTaskDelay()函数后开始计时,到任务解除阻塞为止的相对时间,而vTaskDelayUntil()指定一个绝对时间,每当时间到达,则解除任务阻塞。

应当指出的是,如果指定的唤醒时间已经达到,vTaskDelayUntil()立刻返回(不会有阻塞)。因此,使用vTaskDelayUntil()周期性执行的任务,无论任何原因(比如,任务临时进入挂起状态)停止了周期性执行,使得任务少运行了一个或多个执行周期,那么需要重新计算所需要的唤醒时间。这可以通过传递给函数的指针参数pxPreviousWake指向的值与当前系统时钟计数值比较来检测,在大多数情况下,这并不是必须的。

常量portTICK_RATE_MS 用来辅助计算真实时间,此值是系统节拍时钟中断的周期,单位是毫秒。

当调用vTaskSuspendAll()函数挂起RTOS调度器时,不可以使用此函数。

2.2参数描述

pxPreviousWakeTime:指针,指向一个变量,该变量保存任务最后一次解除阻塞的时间。第一次使用前,该变量必须初始化为当前时间。之后这个变量会在vTaskDelayUntil()函数内自动更新。

xTimeIncrement:周期循环时间。当时间等于(*pxPreviousWakeTime + xTimeIncrement)时,任务解除阻塞。如果不改变参数xTimeIncrement的值,调用该函数的任务会按照固定频率执行。

2.3用法举例

//每10次系统节拍执行一次
 void vTaskFunction( void * pvParameters )
 {
     static portTickType xLastWakeTime;
     const portTickType xFrequency = 10;
     // 使用当前时间初始化变量xLastWakeTime
     xLastWakeTime = xTaskGetTickCount();
     for( ;; )
     {
         //等待下一个周期
         vTaskDelayUntil( &xLastWakeTime,xFrequency );
         // 需要周期性执行代码放在这里
     }
 }

3.获取任务优先级

3.1函数描述

UBaseType_t uxTaskPriorityGet(TaskHandle_t xTask );

获取指定任务的优先级。在文件FreeRTOSConfig.h中,宏INCLUDE_vTaskPriorityGet必须设置成1,此函数才有效。

3.2参数描述

xTask:任务句柄。NULL表示获取当前任务的优先级。

3.3返回值

返回指定任务的优先级。

3.4用法举例

voidvAFunction( void )
 {
     xTaskHandlexHandle;
     // 创建任务,保存任务句柄
     xTaskCreate( vTaskCode, "NAME",STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );
     // ...
     // 使用句柄获取创建的任务的优先级
     if( uxTaskPriorityGet( xHandle ) !=tskIDLE_PRIORITY )
     {
         // 任务可以改变自己的优先级
     }
     // ...
     // 当前任务优先级比创建的任务优先级高?
     if( uxTaskPriorityGet( xHandle ) <uxTaskPriorityGet( NULL ) )
     {
         // 当前优先级较高
     }
 }

4.设置任务优先级

4.1函数描述

void vTaskPrioritySet( TaskHandle_txTask,UBaseType_tuxNewPriority );

设置指定任务的优先级。如果设置的优先级高于当前运行的任务,在函数返回前会进行一次上下文切换。在文件FreeRTOSConfig.h中,宏INCLUDE_vTaskPrioritySet 必须设置成1,此函数才有效。

4.2参数描述

xTask:要设置优先级任务的句柄,为NULL表示设置当前运行的任务。uxNewPriority:要设置的新优先级。

4.3用法举例

voidvAFunction( void )
 {
     xTaskHandlexHandle;
     // 创建任务,保存任务句柄。
     xTaskCreate( vTaskCode, "NAME",STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );
     // ...
     // 使用句柄来提高创建任务的优先级
     vTaskPrioritySet( xHandle,tskIDLE_PRIORITY + 1 );
     // ...
     // 使用NULL参数来提高当前任务的优先级,设置成和创建的任务相同。
     vTaskPrioritySet( NULL, tskIDLE_PRIORITY +1 );
 }

5.任务挂起

5.1函数描述

void vTaskSuspend( TaskHandle_txTaskToSuspend );

挂起指定任务。被挂起的任务绝不会得到处理器时间,不管该任务具有什么优先级。

调用vTaskSuspend函数是不会累计的:即使多次调用vTaskSuspend ()函数将一个任务挂起,也只需调用一次vTaskResume ()函数就能使挂起的任务解除挂起状态。在文件FreeRTOSConfig.h中,宏INCLUDE_vTaskSuspend必须设置成1,此函数才有效。

5.2参数描述

xTaskToSuspend:要挂起的任务句柄。为NULL表示挂起当前任务。

5.3用法举例

voidvAFunction( void )
 {
     xTaskHandlexHandle;
     // 创建任务,保存任务句柄.
     xTaskCreate( vTaskCode, "NAME",STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );
     // ...
     // 使用句柄挂起创建的任务.
     vTaskSuspend( xHandle );
     // ...
     // 任务不再运行,除非其它任务调用了vTaskResume(xHandle )
     //...
     // 挂起本任务.
     vTaskSuspend( NULL );
     // 除非另一个任务使用handle调用了vTaskResume,否则永远不会执行到这里
 }

6.恢复挂起的任务

6.1函数描述

void vTaskResume( TaskHandle_txTaskToResume );

恢复挂起的任务。

通过调用一次或多次vTaskSuspend()挂起的任务,可以调用一次vTaskResume ()函数来再次恢复运行。在文件FreeRTOSConfig.h中,宏INCLUDE_vTaskSuspend必须置1,此函数才有效。

6.2参数描述

xTaskToResume:要恢复运行的任务句柄。

6.3用法举例

voidvAFunction( void )
 {
         xTaskHandle xHandle;
     // 创建任务,保存任务句柄
     xTaskCreate( vTaskCode, "NAME",STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );
     // ...
     // 使用句柄挂起创建的任务
     vTaskSuspend( xHandle );
     // ...
     //任务不再运行,除非其它任务调用了vTaskResume(xHandle )    
          //...
     // 恢复挂起的任务.
     vTaskResume( xHandle );
     // 任务再一次得到处理器时间
     // 任务优先级与之前相同
 }

7.恢复挂起的任务(在中断服务函数中使用)

7.1函数描述

BaseType_t xTaskResumeFromISR(TaskHandle_t xTaskToResume );

用于恢复一个挂起的任务,用在ISR中。

通过调用一次或多次vTaskSuspend()函数而挂起的任务,只需调用一次xTaskResumeFromISR()函数即可恢复运行。

xTaskResumeFromISR()不可用于任务和中断间的同步,如果中断恰巧在任务被挂起之前到达,这就会导致一次中断丢失(任务还没有挂起,调用xTaskResumeFromISR()函数是没有意义的,只能等下一次中断)。这种情况下,可以使用信号量作为同步机制。在文件FreeRTOSConfig.h中,宏INCLUDE_vTaskSuspend 和 INCLUDE_xTaskResumeFromISR 必须设置成1,此函数才有效。

7.2参数描述

xTaskToResume:要恢复运行的任务句柄。

7.3返回值

如果恢复任务后需要上下文切换返回pdTRUE,否则返回pdfALSE。由ISR确定是否需要上下文切换。

7.4用法举例

xTaskHandlexHandle;               //注意这是一个全局变量
 void vAFunction( void )
     // 创建任务并保存任务句柄
     xTaskCreate( vTaskCode, "NAME",STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );
     // ... 剩余代码.
 }
 void vTaskCode( void *pvParameters )
 {
     for( ;; )
     {
         // ... 在这里执行一些其它功能
         // 挂起自己
         vTaskSuspend( NULL );
         //直到ISR恢复它之前,任务会一直挂起
     }
 }
 void vAnExampleISR( void )
 {
     portBASE_TYPExYieldRequired;
     // 恢复被挂起的任务
     xYieldRequired = xTaskResumeFromISR(xHandle );
     if( xYieldRequired == pdTRUE )
     {
         // 我们应该进行一次上下文切换
         // 注:  如何做取决于你具体使用,可查看说明文档和例程
         portYIELD_FROM_ISR();
     }
 }

以上就是FreeRTOS任务控制API函数的功能分析的详细内容,更多关于FreeRTOS任务控制API函数的资料请关注编程网其它相关文章!

--结束END--

本文标题: FreeRTOS任务控制API函数的功能分析

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

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

猜你喜欢
  • FreeRTOS任务控制API函数的功能分析
    目录1.相对延时1.1函数描述1.2参数描述1.3用法举例2.绝对延时2.1函数描述2.2参数描述2.3用法举例3.获取任务优先级3.1函数描述3.2参数描述3.3返回值3.4用法举...
    99+
    2024-04-02
  • FreeRTOS任务控制API函数的功能是什么
    本篇内容主要讲解“FreeRTOS任务控制API函数的功能是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“FreeRTOS任务控制API函数的功能是什么”吧!1.相对延时1.1函数描述voi...
    99+
    2023-06-29
  • FreeRTOS实时操作系统的任务应用函数详解
    目录1.获取任务系统状态1.1函数描述1.2参数描述1.3返回值1.4用法举例2.获取当前任务句柄2.1函数描述2.2返回值3.获取空闲任务句柄3.1函数描述3.2返回值4.获取任务...
    99+
    2024-04-02
  • FreeRTOS实时操作系统的任务应用函数是什么
    本文小编为大家详细介绍“FreeRTOS实时操作系统的任务应用函数是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“FreeRTOS实时操作系统的任务应用函数是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧...
    99+
    2023-06-29
  • MySQL流程控制函数汇总分析讲解
    目录1.IF函数2.IFNULL函数3.CASE函数4.多重IF在 mysql 中,流程控制函数是指可以控制存储过程(stored procedure)或函数(function)中执行流程的语句。以下是几个常用的流程控制...
    99+
    2023-04-24
    MySQL流程控制 MySQL流程控制函数
  • PHP函数的性能分析函数
    PHP作为一门高度可扩展的编程语言,其强大的函数库拥有众多的特色函数,能够大大提升开发效率。但是在PHP程序性能提升的过程中,我们不仅仅需要考虑优化算法,还需要通过性能分析函数深入挖掘性能瓶颈,提高程序的执行效率。一、函数性能优化的必要性在...
    99+
    2023-05-20
    函数 性能分析 PHP函数
  • Golang函数的接口和访问控制源码分析
    本文小编为大家详细介绍“Golang函数的接口和访问控制源码分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“Golang函数的接口和访问控制源码分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、 接口在G...
    99+
    2023-07-06
  • vue-next函数式api的示例分析
    小编给大家分享一下vue-next函数式api的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!setupsetup 会作...
    99+
    2024-04-02
  • Python函数与控制语句使用实例分析
    函数“脏活累活交给函数来做”,首先,看看Python中定义函数的方法。def 函数名(参数1,参数2...): return '结果'函数的主要目的是处理重复出现的任务,例如,计算直角三角形的面积时需要定义两条直角边和相应...
    99+
    2023-05-18
    Python
  • .NetCore使用Swagger+API多版本控制的流程分析
    目录一、Swagger基本使用二、Swagger结合版本控制本文实例环境及版本.NetCore3.1、Swagger6.1 现在的开发大部分都是前后端分离的模式了,后端提供接口,前端...
    99+
    2024-04-02
  • Python Numpy Load API适合哪些类型的数据分析任务?
    Python是一种高级编程语言,它被广泛用于数据科学和数据分析。Python中的Numpy是一个非常流行的开源数学库,它提供了高效的数学计算和数组操作功能。Numpy提供了许多API,其中最常用的之一是Load API。那么,Python...
    99+
    2023-09-04
    numpy load api
  • golang函数并发控制的内建语法与功能介绍
    go 语言通过内置语法控制函数并发,包括:go func() 创建 goroutine,sync.mutex 互斥锁保护共享数据,sync.waitgroup 等待组协调 gorouti...
    99+
    2024-04-24
    golang 并发控制
  • MySql中流程控制函数/统计函数/分组查询用法解析
    路漫漫其修远兮,吾将上下而求索,又到了周末,我继续带各位看官学习回顾Mysql知识。 上次说到了流程控制函数,那就从流程控制函数来继续学习吧! #五.流程控制函数 #1.if函数:if else的效果 IF(条件...
    99+
    2022-05-21
    MySql 流程控制函数 统计函数 分组查询
  • Python ChatGPT API 新增的函数调用功能演示
    文章目录 一、前言二、主要内容三、总结 🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 一、前言 OpenAI 重磅更新,API...
    99+
    2023-09-03
    ChatGPT Python API 函数调用 人工智能应用 原力计划
  • 浅析JavaScript中的程序控制流和函数
    从字面上就能理解他们的含义。简单示例如下:<script> console.log("Pear"=="Pear"); console.log(5<4); console.log...
    99+
    2022-11-22
    javascript
  • Golang 函数的 profiling 和性能分析
    问题:go语言如何进行性能优化?profiling:使用内置工具生成代码执行信息(cpu、内存等)。分析 profiling 结果:使用 pprof 工具可视化分析 profiling ...
    99+
    2024-05-23
    性能分析 git golang go语言
  • MySQL和JDBC事务控制的示例分析
    这篇文章将为大家详细讲解有关MySQL和JDBC事务控制的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、MySQL的事务控制(Transaction Cont...
    99+
    2024-04-02
  • MySQL中事务控制对的示例分析
    这篇文章主要介绍MySQL中事务控制对的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!什么是事务控制事务是指作为一个逻辑工作单元执行的一系列操作,这些操作要么全部成功,要么全...
    99+
    2024-04-02
  • 汇编语言功能实现数据复制实例分析
    这篇文章主要讲解了“汇编语言功能实现数据复制实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“汇编语言功能实现数据复制实例分析”吧!问题1:将内存ffff:0~ffff:b单元中的数据复...
    99+
    2023-06-25
  • ASP API 筛选器:释放数据分析的潜能
    ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作