Task的创建与删除
Task的创建
任务就是永远不会退出的C函数,因此,通常被实现为一个无限循环。pvTaskCode参数只是一个指向实现该任务的函数的指针(实际上,就是函数名)。
#include “FreeRTOS.h”
#include “task.h”
BaseType_t xTaskCreate( TaskFunction_t pvTaskCode,
const char * const pcName,
unsigned short usStackDepth,
void *pvParameters,
UBaseType_t uxPriority,
TaskHandle_t *pxCreatedTask );
第一步创建Task主体函数
void myTask(void *pvPragma)
{
while (1)
{
printf("Hello world!\n In the Task!\n");
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
第二步在main函数主体里xTaskCreate
xTaskCreate(task函数的指针,taskName,分配内存,传递参数(会通过方法传入myTask的参数列表),优先级,task句柄);
xTaskCreate(myTask,"mytask1",1024,NULL,1,NULL);
在这里需要注意的是null必须要大写否则会导致编译失败
运行成功
删除Task
方法一
获取Task句柄,调用vTaskDelete删除
xTaskCreate
需要获取任务句柄的地址
void app_main(void)
{
// 创建Task句柄
TaskHandle_t myHandle = NULL;
xTaskCreate(myTask, "mytask1", 1024, NULL, 1, &myHandle);
// 判断句柄不为空
if (myHandle != NULL)
{
vTaskDelete(myHandle);
}
}
没有打印任何信息
code2
void app_main(void)
{
// 创建Task句柄
TaskHandle_t myHandle = NULL;
xTaskCreate(myTask, "mytask1", 1024, NULL, 1, &myHandle);
vTaskDelay(1000 / portTICK_PERIOD_MS);
// 判断句柄不为空
if (myHandle != NULL)
{
vTaskDelete(myHandle);
}
}
code3
修改为vTaskDelay(8000 / portTICK_PERIOD_MS);
通过上述函数可以总结实验结果,说明Task函数与主函数main是并行运行的
方法二
xTaskCreate(myTask, "mytask1", 1024, NULL, 1, NULL);
修改myTask函数
void myTask(void *pvPragma)
{
// while (1)
{
printf("Task first!\n");
vTaskDelay(1000 / portTICK_PERIOD_MS);
printf("Task second!\n");
vTaskDelay(1000 / portTICK_PERIOD_MS);
printf("Task third!\n");
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
vTaskDelete(NULL);
}
通过vTaskDelete(NULL);让task自己把自己删除