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

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

3天内不再提示

freeRTOS的任务

汽车电子技术 来源:嵌入式之入坑笔记 作者:嵌入式之入坑笔记 2023-02-10 11:02 次阅读

1、freeRTOS的任务

(1)任务的状态

任务在运行过程中,可能有以下几种状态:

1)运行态。任务当前正在运行中,占有cpu的使用权。

    2)就绪态。满足了运行条件,但是当前没有运行,可能是有高优先级任务在执行或者在中断,处于等待获得cpu使用权然后运行的状态中。

    3)阻塞态。在某些条件下被阻塞了,不能得到运行。比如等待某些信号量,消息队列或者调用了延迟函数。

    4)挂起态。任务被通过调用挂起操作被终止执行了,直到被从挂起状态中恢复为止,否则将一直处于挂起的状态中。

(2)任务的优先级

freeRTOS的任务优先级是数值越大,任务的优先级越高。

freeRTOS 中任务的最高优先级是通过 **FreeRTOSConfig.h **文件中的

configMAX_PRIORITIES

进行配置的,用户实际可以使用的优先级范围是:

0 到 configMAX_PRIORITIES – 1

2、freeRTOS的任务切换的实现

(1)PendSV中断

freeRTOS系统的任务切换的具体过程最终都是在pendSV中断服务函数里面完成的。

** PendSV是一种不精确的异常处理,优先级和挂起状态可以通过编程实现,一般在实时操作系统中PendSV**的优先级都会被设置为最低,在其他所有的异常中断处理完以后才执行,对上下文的切换非常有用,在OS设计中也是属于非常关键的。

在freeRTOS系统中,执行上下文切换依靠的是任务调度器。上下文切换被触发的场合可以有:

1> 执行一个系统调用。如:任务切换函数taskYIELD()、延时vTaskDelay()。

2> Systick中断。

(2)Systick中断

** Systick**中断服务函数中会进行任务切换。

3、freeRTOS的任务管理的API函数

图片

3.1、FreeRTOS任务创建

freeRTOS中,可以根据实际使用的需要创建一定数量的任务(线程),任务只有被成功创建了,才有可能被执行到。

    在FreeRTOS实时操作系统中,创建任务可以使用如下的API
portBASE_TYPE xTaskCreate(
         pdTASK_CODE pvTaskCode,
         const char * const pcName,
         unsigned short usStackDepth,
         void *pvParameters,
         unsigned portBASE_TYPE uxPriority,
         xTaskHandle *pvCreatedTask
        );

函数参数说明:
    pvTaskCode:指向任务入口函数的指针。即任务函数。
    pcName:任务的描述。一般都是为了调试方便而使用的。由 tskMAX_TASK_NAME_LEN 定义的最大长度,默认为 16。
    usStackDepth:任务堆栈的大小。不是字节数而是以字为单位。例如,如果堆栈为 16 位宽,并且 usStackDepth 定义为 100,则将分配 200 个字节用于堆栈存储。
    pvParameters:任务的参数的指针。可以向创建的任务中传入参数,不需要传送参数可以选NULL。
    uxPriority:任务运行的优先级。
    pvCreatedTask:任务的句柄,通过该句柄引用创建的任务。
返回值:
    任务创建成功返回 pdPASS;创建失败返回 pdFAIL。

创建一个任务的示例如下:

xTaskCreate((TaskFunction_t )Start_Task,            //任务函数
            (const char*    )"Start_Task",          //任务名称
            (uint16_t       )128,                   //任务堆栈大小
            (void *         )NULL,                  //传递给任务函数的参数
            (UBaseType_t    )5,                     //任务优先级
            (TaskHandle_t * )&StartTask_Handler);   //任务句柄

注意:

任务的优先级要根据 **FreeRTOSConfig.h **文件中的

configMAX_PRIORITIES
进行设置的,可以使用的优先级范围是 0 到 configMAX_PRIORITIES – 1,如果创建的任务所选的任务优先级超过了这个设置的范围,会被忽略掉,不会被执行。

3.2、FreeRTOS任务挂起

当任务在系统运行过程中,因为某些条件或者有其他的更加重要的事情要做的时候,可以考虑把某些任务先挂起,等候条件到达之后再恢复任务继续调度运行。

挂起任务的函数为:

void vTaskSuspend( xTaskHandle pxTaskToSuspend )
参数:
    pxTaskToSuspend:需要被挂起的任务的优先级
返回值:无
要使用这个函数,需要在 FreeRTOSConfig.h中将宏定义 INCLUDE_vTaskSuspend 定义为 1,如下:

图片

此外,如果要挂起、恢复整个系统所有的任务,freeRTOS也提供了一个API函数,如下:
void vTaskSuspendAll( void )    // 挂起所有的任务
BaseType_t xTaskResumeAll( void )  // 恢复所有被挂起的任务
要恢复某个被挂起的任务,可以使用函数:
void vTaskResume( xTaskHandle pxTaskToResume )
参数:
    pxTaskToResume:任务的优先级

3.3、FreeRTOS任务删除

如果有某些任务只是需要存在于某些条件,当条件满足之后就不再需要这个任务参与运行,这个时候可以选择删除掉这个任务,释放该任务所占用的堆栈空间。

    删除任务可以使用函数:
void vTaskDelete( xTaskHandle pxTask )
参数:
pxTask:需要被删除的任务句柄
返回值:无

注意:要使用这个函数,需要将宏定义 INCLUDE_vTaskDelete 设置为 1 。

4、freeRTOS的内核管理函数

图片

4.1、获取任务的优先级

如果运行过程中需要知道当前运行的任务的优先级,可以调用优先级获取函数得到任务的优先级:
unsigned portBASE_TYPE uxTaskPriorityGet( xTaskHandle pxTask )
 参数:
     pxTask:需要获取优先级的任务的句柄。
 返回值:
     句柄对应的任务的优先级。

4.2、修改任务的优先级

任务在运行过程中,优先级希望能被改变成其他的优先级,可以使用函数:

void vTaskPrioritySet( xTaskHandle pxTask, unsigned portBASE_TYPE uxNewPriority )
参数:
      pxTask:任务的句柄。
       uxNewPriority:需要修改的新的优先级的值。

5、freeRTOS的延时函数

5.1、相对延时函数

void vTaskDelay(const TickType_t TicksToDelay)

5.2、绝对延时函数

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

    关注

    3

    文章

    3903

    浏览量

    61310
  • FreeRTOS
    +关注

    关注

    12

    文章

    473

    浏览量

    61351
  • 中断服务
    +关注

    关注

    0

    文章

    9

    浏览量

    6803
收藏 人收藏

    评论

    相关推荐

    转:第10章 FreeRTOS任务管理

    第10章FreeRTOS任务管理 对于初学者,特别是对于没有RTOS基础的同学来说,了解FreeRTOS任务管理非常重要,了解任务管理的目
    发表于 08-23 09:54

    STM32CUBE的freertos任务创建

    目录问题说明解决步骤验证方案总结问题说明STM32CUBE的freertos任务创建十分简单方便,但却有一个麻烦:需要我们把要跑的任务具体代码都写进freertos.c的文件里面,对
    发表于 08-24 08:26

    有什么方法可以查看FreeRTOS任务的运行状态呢

    有什么方法可以查看FreeRTOS任务的运行状态呢?怎样去查看FreeRTOS任务的运行状态呢?
    发表于 11-02 07:59

    浅析FreeRTOS任务系统

    FreeRTOS-任务基础大多数时候,使用RTOS就是使用其多任务处理功能。所谓多任务处理,其实并不是我们移植了RTOS系统后,CPU就可以同时处理多个
    发表于 01-06 08:08

    FreeRTOS任务通知相关资料分享

    FreeRTOS--任务通知Notification今天发现了一个奇怪的现象,特意把它记录下来,防止忘记了。先上图于是找了所有的任务句柄,真的是没有操作挂起了这个任务。但是程序还是运行
    发表于 01-21 12:07

    FreeRTOS任务的使用

    FreeRTOS学习笔记(二):任务创建/删除,挂起/解挂上篇文章介绍了任务相关的基础知识,本篇文章对FreeRTOS任务的使用,将会介绍
    发表于 02-18 07:14

    什么是多任务系统?FreeRTOS任务与协程简析

    FreeRTOS学习之FreeRTOS任务基础知识转行小白一枚,通过博客记录自我学习,望更多博友多多指点,感激不尽!RTOS系统的核心就是任务管理,学习RTOS系统主要是为了使用RTO
    发表于 02-18 06:38

    详细讲解freeRTOS任务

    详细讲解freeRTOS任务
    发表于 02-18 06:57

    FreeRTOS任务创建到闪存LED的基本应用程序

    应用程序 : 本代码是 FreeRTOS 任务的基本应用程序, 用于创建闪存 LED 任务 。 BSP 版本: M480系列 BSP CMSIS V3.04.000 硬件
    发表于 08-22 06:28

    如何轻松几步实现在STM32上运行FreeRTOS任务

    轻松几步实现在STM32上运行FreeRTOS任务
    的头像 发表于 03-01 12:07 8091次阅读
    如何轻松几步实现在STM32上运行<b class='flag-5'>FreeRTOS</b><b class='flag-5'>任务</b>

    (一)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高级篇4---FreeRTOS任务切换分析

    FreeRTOS任务相关的代码大约占总代码的一半左右,这些代码都在为一件事情而努力,即找到优先级最高的就绪任务,并使之获得CPU运行权。任...
    发表于 01-26 17:41 12次下载
    <b class='flag-5'>FreeRTOS</b>高级篇4---<b class='flag-5'>FreeRTOS</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 11次下载
    <b class='flag-5'>FreeRTOS</b>系列第11篇---<b class='flag-5'>FreeRTOS</b><b class='flag-5'>任务</b>控制