FreeRTOS学习-任务的创建与管理

转载自https://blog.csdn.net/weixin_43866583/article/details/125505717?spm=1001.2014.3001.5502

FreeRTOS学习-任务的创建与管理

FreeRTOS的任务

任务的状态

FreeRTOS中,任务在运行时,可能出现以下几种状态:

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

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

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

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

任务的优先级

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

FreeRTOS 中任务的最高优先级是通过 FreeRTOSConfig.h 文件中的configMAX_PRIORITIES进行配置的,用户实际可以使用的优先级范围是 0 到 configMAX_PRIORITIES – 1。

FreeRTOS 的任务切换的实现

PendSV中断

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

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

Systick中断

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

FreeRTOS的任务管理的API函数

FreeRTOS任务创建

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

在FreeRTOS实时操作系统中,创建任务可以使用如下的API:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

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:任务的句柄,通过该句柄引用创建的任务。

返回值:
复制

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

1
2
3
4
5
6
7
8
9
10
11
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,如果创建的任务所选的任务优先级超过了这个设置的范围,会被忽略掉,不会被执行。

FreeRTOS任务挂起

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

挂起任务的函数为:

1
2
3
4
5
6
7
void vTaskSuspend( xTaskHandle pxTaskToSuspend )

参数:

pxTaskToSuspend:需要被挂起的任务的优先级

返回值:无
复制

要使用这个函数,需要在 FreeRTOSConfig.h中将宏定义 INCLUDE_vTaskSuspend 定义为 1

此外,如果要挂起、恢复整个系统所有的任务,freeRTOS也提供了一个API函数

1
2
3
void vTaskSuspendAll( void )  // 挂起所有的任务

BaseType_t xTaskResumeAll( void ) // 恢复所有被挂起的任务
复制

FreeRTOS任务删除

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

删除任务可以使用函数:

1
2
3
4
5
6
7
void vTaskDelete( xTaskHandle pxTask )

参数:

pxTask:需要被删除的任务句柄

返回值:无
复制

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

FreeRTOS的内核管理函数