目录
一、什么是任务
在FreeRTOS中,任务就是一个函数
void Task(void *param);
注意:
1、函数不能返回
2、多个任务可以运行同一个函数
3、函数内部尽量使用局部变量
二、动态任务创建
1、函数的介绍与使用
BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, // 函数指针, 任务函数
const char * const pcName, // 任务的名字
const configSTACK_DEPTH_TYPE usStackDepth, // 栈大小,单位为word,10表示40字节
void * const pvParameters, // 调用任务函数时传入的参数
UBaseType_t uxPriority, // 优先级
TaskHandle_t * const pxCreatedTask ); // 任务句柄, 以后使用它来操作这个任务
参数1:函数指针,任务函数
参数2:任务的名称
参数3:栈大小,字节为单位
参数4:参数1函数需要传入的参数,可以填null
参数5:优先级
参数6:任务句柄,后续操作用到任务句柄
返回值:成功返回pdPASS,失败返回 errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY(失败原因是内存不足)
2、代码例程
创建函数
void oled_task(void *param)
{
OLED_ShowNum(0,0,123,3,16);
}
返回值与句柄定义
TaskHandle_t oledtaskhandle;
BaseType_t ret;
动态任务创建
ret = xTaskCreate(oled_task,"oled_task",128,NULL,osPriorityNormal,&oledtaskhandle);
三、静态任务创建
1、函数的介绍与使用
TaskHandle_t xTaskCreateStatic (
TaskFunction_t pxTaskCode, // 函数指针, 任务函数
const char * const pcName, // 任务的名字
const uint32_t ulStackDepth, // 栈大小,单位为word,10表示40字节
void * const pvParameters, // 调用任务函数时传入的参数
UBaseType_t uxPriority, // 优先级
StackType_t * const puxStackBuffer, // 静态分配的栈,就是一个buffer
StaticTask_t * const pxTaskBuffer // 静态分配的任务结构体的指针,用它来操作这个任务
);
相比动态任务的创建,只有最后两个参数不一样
参数6:静态分配的栈内存,比如可以传入一个数组, 它的大小是usStackDepth*4。
参数7:静态分配的StaticTask_t结构体的指针
返回值:成功:返回任务句柄; 失败:NULL
2、代码例程
创建函数
void led_task(void *param)
{
led_on(green);
}
创建返回值句柄与参数6.7
StackType_t ledbuffer[128*4];
StaticTask_t ledtaskbuffer;
TaskHandle_t ledtaskhandle;
静态任务创建
//创建静态任务
ledtaskhandle = xTaskCreateStatic(led_task,"led_task",128,NULL,osPriorityNormal,ledbuffer,&ledtaskbuffer);