FreeRTOS 任务与调度器(1)

Task.c和Task.h文件内是FreeRTOS的核心内容,所有任务和调度器相关的API函数都在这个文件中,它包括下图这些内容FreeRTOS文件如下:

FreeRTOS 任务与调度器(1)

Task.c和Task.h文件内是FreeRTOS的核心内容,所有任务和调度器相关的API函数都在这个文件中,它包括下图这些内容

FreeRTOS 任务与调度器(1)

 

在开始介绍函数之前,首先我们先简单了解一下任务状态:

• FreeRTOS的任务5种状态:

FreeRTOS 任务与调度器(1)

运行状态:当前正在执行的任务的状态,只可能会一个当前正在执行的任务

就绪状态:随时可以运行的任务的状态,就绪状态任务随时等待调度器调度

阻塞状态:任务因为某些原因暂时不能被调度状态,一般情况下正在等待某些事件的发生比如调用了xTaskDelay()在一段时间内任务会被阻塞,在这些事件达成后任务会自动回到就绪状态。

挂起状态:vTaskSuspend()函数会让任务进入挂起状态,这时候这个任务不会执行。调用xTaskResume()函数才能让这些任务回到就绪状态

删除状态:一个任务被使用vTaskDelete()函数后被删除,处于删除状态。


他们之间的状态切换如下示意图:

FreeRTOS 任务与调度器(1)

这本篇中,主要介绍一下这6个部分:

 

FreeRTOS 任务与调度器(1)

  一、创建任务:

FreeRTOS 任务与调度器(1)

顾名思义,这些函数的作用是创建一个任务,创建的任务会进入就绪状态,如果没其他更高优先级的任务运行,则马上进入运行状态

这些函数可以在调度器启动前或启动后调用

1.1、vTaskCreate() 1.1.1、函数简介

FreeRTOS 任务与调度器(1)

几个比较重要的输入参数介绍一下:

pvTaskCode:直接指向函数的本体的指针,可以把任务函数名字直接贴过来

usStackDepth:任务内申请的局部变量会使用到任务的堆栈空间,(在32位系统中,这个参数的单位是word=4byte),例如这个参数设置为100,那么这个任务将会申请到400byte的空间。

uxPriority:任务优先级,使用这个参数来设置任务优先级(0是最低优先级),在FreeRTOSConfig.h 中调整configMAX_PRIORITIES的定义可以设置最高可用的优先级(最高可设置优先级为configMAX_PRIORITIES-1)。高优先级的任务可以抢断低优先级的任务,(主要:记得高优先级的任务不需要用的时候将其阻塞或挂起或删除,否则低优先级的任务可能永远无法得到运行权)

pxCreatedTask:句柄的地址,以后使用其他API功能来索引这个任务时会需要用到(注意:这里传入的是句柄的地址!)

1.1.2、使用简介:

以下是官方例子:

FreeRTOS 任务与调度器(1)

1.2、vTaskCreateStatic() 1.2.1、函数简介

FreeRTOS 任务与调度器(1)

为了方便我们自己管理内存,有了静态创建任务法,任务堆栈的创建和回收都要由编程者来处理,与vTaskCreate()对比,我们可以发现以下不同之处:

puxStackBuffer参数:任务需要用到的堆栈数组的地址,我们只需要创建一StackType_t类型个空的数组,然后把数组指针传进来就好了(注意数组的大小要大于ulStackDepth)

pxTaskBuffer参数:存放任务数据结构(TCB)的变量,同样的,我们创建一个StaticTask_t类型的变量,然后把他的指针传进来

还有一处不同,输入参数的句柄取消掉了,但是句柄还是存在的,只是变为了返回参数

1.2.2、使用简介
官方例程如下:

创建一个StaticTask_t 类型的参数,稍后用于存放任务数据结构(TCB)

创建一个StackType_t类型数组,稍后用于作为任务堆栈

创建一个句柄,稍后用作vTaskCode任务的句柄

使用xTaskCreateStatic()创建任务

使用vTaskSuspend()、并通过传入句柄挂起刚刚创建的任务,目的是展示给我们看这个任务的句柄是可用的

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wppdpg.html