目录
一、任务创建:
在freertos中,提供了两种创建任务的方式:静态创建,动态创建。
1、静态创建:
需要提前分配好栈空间和TCB结构体(任务控制块)
//注意:在FreeRTOSConfig.h中定义使能宏
//#define configSUPPORT_STATIC_ALLOCATION 1
TaskHandle_t xTaskCreateStatic( TaskFunction_t pxTaskCode,//任务函数名
const char * const pcName, //任务名
uint32_t ulStackDepth,//栈大小
void *pvParameters,//参数
UBaseType_t uxPriority,//优先级
StackType_t * const puxStackBuffer,//任务栈
StaticTask_t * const pxTaskBuffer //任务控制块
)
2、动态创建:
栈空间和任务控制块由系统自动分配
//注意:在FreeRTOSConfig.h中定义使能宏
//#define configSUPPORT_DYNAMIC_ALLOCATION 1
BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, //函数指针
const char * const pcName, //函数名
unsigned short usStackDepth, //栈深度
void *pvParameters, //参数
UBaseType_t uxPriority, //优先级
TaskHandle_t * const pxCreatedTask // 任务句柄)
3、任务句柄
定义:又叫任务控制块,包含了任务的所有信息。
struct tskTaskControlBlock; // 原型
typedef struct tskTaskControlBlock* TaskHandle_t;//重定义,取别名
typedef struct tskTaskControlBlock
{
volatile StackType_t *pxTopOfStack;
ListItem_t xStateListItem; //任务状态列表
ListItem_t xEventListItem; //任务事件列表
UBaseType_t uxPriority; //优先级
StackType_t *pxStack; //栈指针
char pcTaskName[ configMAX_TASK_NAME_LEN ];
} tskTCB;
所以,可以删除句柄来删除任务,vTaskDelete(句柄)
4、例:
/* FreeRTOS头文件 */
#include "FreeRTOS.h"
#include "task.h"
StackType_t xIdleTask2Stack[100];
StaticTask_t xIdleTask2Tcb;
void vApplicationGetIdleTaskMemory(StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize)
{
*ppxIdleTaskTCBBuffer = &xIdleTask2Tcb;
*ppxIdleTaskStackBuffer = xIdleTask2Stack;
*pulIdleTaskStackSize = 100;
}
TaskHandle_t xHandleTask1 = NULL;//任务句柄,用于删除
void Task1(void * param)
{
while(1)
{
printf("动态");
}
}
TaskHandle_t xHandleTask2 = NULL;
void Task2(void * param)
{
while(1)
{
printf("static");
}
}
int main( void )
{
xTaskCreate(Task1,"Task1",100,NULL,1,&xHandleTask1);
xHandlerTask2=xTaskCreateStatic(Task2,"Task2",100,NULL,1,xIdleTask2Stack,&xIdleTask2Tcb);
vTaskStartScheduler(); // 启动任务,开启调度
while(1); // 正常不会执行到这里
}