FreeRTOS创建多线程详解
文章目录
- 简介
- 参数说明
- 任务堆栈
- 任务优先级
简介
【xTaskCreate】是FreeRTOS中用于创建线程的函数,其最简单的使用方法为
void task();
static TaskHandle_t hTask;
xTaskCreate(task, ( const char * ) "Task", configMINIMAL_STACK_SIZE,NULL, tskIDLE_PRIORITY, &hTask);
vTaskStartScheduler();
调用之后,xTaskCreate将创建一个新的线程来执行task
函数,并将task函数的任务控制块存放在句柄hTask
中。【vTaskStartScheduler】则用于任务调度,表示开始执行所有的任务。
参数说明
【xTaskCreate】的函数原型如下
BaseType_t xTaskCreate(TaskFunction_t pxTaskCode,const char *const pcName,const uint16_t usStackDepth,void *const pvParameters,UBaseType_t uxPriority,TaskHandle_t *const pxCreatedTask);
其中
- 【pxTaskCode】指向任务函数的指针,在实际使用中,可以是无返回值的函数。
- 【pcName】任务名,最大长度为【configMAX_TASK_NAME_LEN】,默认为10
- 【usStackDepth】任务堆栈大小,以字为单位。【configMINIMAL_STACK_SIZE】默认为200。
- 【pvParameters】传递给任务函数的参数,如果没有就填 NULL
- 【uxPriority】任务优先级,最大值为(configMAX_PRIORITIES-1)
- 【pxCreatedTask】任务句柄,任务成功创建后,用于保存任务控制块
在示例和参数介绍中,我们用到了一些宏,这些宏被定义在【FreeRTOSConfig.h】和【task.h】中
//FreeRTOSConfig.h
#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 200)
#define configMAX_PRIORITIES (8)// task.h
#define tskIDLE_PRIORITY ( ( UBaseType_t ) 0U )
任务堆栈
所谓任务堆栈,就是当执行某条任务时,用于保存函数运行状态的空间。这些状态信息包括返回地址、函数参数、内部局部变量等。当然,xTaskCreate并不支持带有返回值的函数,为了从任务函数中得到一些变量,可将其存放在全局变量中,并在任务的结尾添加【vTaskDelete】来销毁当前任务,示例如下
#include "FreeRTOS.h"
#include "task.h"int taskReturnValue = 0;
void vTask(void *pvParameters)
{int result = 42; // 假设任务的返回值是 42taskReturnValue = result;vTaskDelete(NULL);
}
任务优先级
基于操作系统实现的并行,实际上是伪并行,或者说是并发。即并不是多个任务在同时运行,而是多个任务交替执行,只不过CPU的频率远远高于人的反应速度,所以在人类看来,就好像在并行工作一样。
由于是多个任务交替执行,交替占用CPU,所以在实际使用FreeRTOS多任务功能时,就存在一个如何分配CPU使用时间的问题,这就是任务优先级的作用。
FreeRTOS的默认调度方式为抢占式调度,在这种模式下,优先级越高的任务越先执行,当某个高优先级任务就绪后,会立即抢占低优先级任务的资源,开始执行。在【FreeRTOSConfig.h】中定义了【configMAX_PRIORITIES】这个宏,表示任务的最高优先级,可以据此来调度任务。
此外,在【FreeRTOSConfig.h】中还定义了【configUSE_PREEMPTION】宏,用于调整调度策略,1表示抢占式调度,0为非抢占式。
#define configUSE_PREEMPTION 1