任务创建函数
函数xTaskCreate() //任务动态分配
BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, //①任务实现函数指针(函数名)
const char * const pcName, //②任务名称,用于追踪调试,名字长度不超过configMAX_NAME_LEN
const uint16_t usStackDepth, //③任务堆栈大小,是usSTACKDepth的4倍
void * const pvParameters, //④传递给任务函数的参数
UBaseType_t uxPriority, //⑤任务优先级,范围0~configMAX_STACK_SIZE.
TaskHandle_t * const pxCreatedTask )//⑥句柄,任务创建成功后会返回任务句柄,是任务的任务堆栈。
返回值:
pdPASS:创建任务成功
errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY:因内存不足,任务创建失败。
任务句柄:实际上是一个void * 的指针,他指向的地址是任务控制块TCB
注意:configSUPPORT_DYNAMIC_ALLOCATION 必须置为1
函数xTaskCreateStatic //任务静态分配
TaskHandle_t xTaskCreateStatic( TaskFunction_t pxTaskCode, //①任务实现函数指针(函数名)
const char * const pcName, //②任务名称,用于追踪调试,名字长度不超过configMAX_NAME_LEN
const uint32_t ulStackDepth, //③任务堆栈大小,静态创建任务,任务堆栈需要用户给出,一般是个数 组,此参数是这个数组的大小
void * const pvParameters, //④任务传入参数
UBaseType_t uxPriority, //⑤任务优先级
StackType_t * const puxStackBuffer,//⑥任务堆栈指针
StaticTask_t * const pxTaskBuffer )//⑦任务控制块指针
返回值:
NULL:创建任务失败
其他值:任务创建成功,返回值是任务句柄
任务删除函数:vTaskDelete()
函数原型:void vTaskDelete( TaskHandle_t xTaskToDelete )
参数:
xTaskToDelete :要删除的任务句柄
返回值:无
任务的静态分配,需要手动定义栈空间和任务控制块TCB的空间,将他们的指针传到函数里面
注意:configSUPPORT_STATIC_ALLOCATION 必须置为1
任务创建和删除实验:
1、配置任务优先级、任务堆栈大小、任务句柄、任务函数
```c
//任务优先级
#define START_TASK_PRIO 1
//任务堆栈大小
#define START_STK_SIZE 128
//任务句柄
TaskHandle_t StartTask_Handler;
//任务函数
void start_task(void *pvParameters);
//任务优先级
#define LED0_TASK_PRIO 2
//任务堆栈大小
#define LED0_STK_SIZE 50
//任务句柄
TaskHandle_t LED0Task_Handler;
//任务函数
void led0_task(void *pvParameters);
//任务优先级
#define LED1_TASK_PRIO 3
//任务堆栈大小
#define LED1_STK_SIZE 50
//任务句柄
TaskHandle_t LED1Task_Handler;
//任务函数
void led1_task(void *pvParameters);
2、任务函数
//开始任务任务函数——动态方法
void start_task(void *pvParameters)
{
//创建LED0任务
xTaskCreate((TaskFunction_t )led0_task,
(const char* )"led0_task",
(uint16_t )LED0_STK_SIZE,
(void* )NULL,
(UBaseType_t )LED0_TASK_PRIO,
(TaskHandle_t* )&LED0Task_Handler);
//创建LED1任务
xTaskCreate((TaskFunction_t )led1_task,
(const char* )"led1_task",
(uint16_t )LED1_STK_SIZE,
(void* )NULL,
(UBaseType_t )LED1_TASK_PRIO,
(TaskHandle_t* )&LED1Task_Handler);
vTaskDelete(StartTask_Handler); //删除开始任务
}
/*开始任务任务函数——静态方法*/
/*void start_task(void *pvParameters)
{
//创建TASK1任务
Task1Task_Handler=xTaskCreateStatic((TaskFunction_t )task1_task,
(const char* )"task1_task",
(uint32_t )TASK1_STK_SIZE,
(void* )NULL,
(UBaseType_t )TASK1_TASK_PRIO,
(StackType_t* )Task1TaskStack,
(StaticTask_t* )&Task1TaskTCB);
//创建TASK2任务
Task2Task_Handler=xTaskCreateStatic((TaskFunction_t )task2_task,
(const char* )"task2_task",
(uint32_t )TASK2_STK_SIZE,
(void* )NULL,
(UBaseType_t )TASK2_TASK_PRIO,
(StackType_t* )Task2TaskStack,
(StaticTask_t* )&Task2TaskTCB);
vTaskDelete(StartTask_Handler); //删除开始任务
}*/
//LED0任务函数
void led0_task(void *pvParameters)
{
while(1)
{
LED0=~LED0;
vTaskDelay(500);
}
}
//LED1任务函数
void led1_task(void *pvParameters)
{
while(1)
{
LED1=0;
vTaskDelay(200);
LED1=1;
vTaskDelay(800);
}
}
主函数创建开始任务并进行任务调度
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4
delay_init(); //延时函数初始化
uart_init(115200); //初始化串口
LED_Init(); //初始化LED
//创建开始任务
xTaskCreate((TaskFunction_t )start_task, //任务函数
(const char* )"start_task", //任务名称
(uint16_t )START_STK_SIZE, //任务堆栈大小
(void* )NULL, //传递给任务函数的参数
(UBaseType_t )START_TASK_PRIO, //任务优先级
(TaskHandle_t* )&StartTask_Handler); //任务句柄
vTaskStartScheduler(); //开启任务调度
}
任务挂起函数
函数原型:void vTaskSuspend( TaskHandle_t xTaskToSuspend )
参数:xTaskToSuspend ——要挂起任务的任务句柄,当传入NULL时,挂起任务自己
返回值:无
任务恢复函数
函数原型:void vTaskResume( TaskHandle_t xTaskToResume )
参数:xTaskToResume ——要恢复任务的任务句柄
返回值:无
注意:只能在正在运行的任务中调度,在调度器未开启之前不能使用。