创建任务:
BaseType_t xTaskCreate(
TaskFunction_t pvTaskCode, //任务函数
const char * const pcName, //任务名称
unsigned short usStackDepth, //堆栈大小
void *pvParameters, //任务函数的参数
UBaseType_t uxPriority, //任务优先级
TaskHandle_t *pxCreatedTask ); //任务句柄
FreeRTOS规定任务函数的参数是一个指针,基类型是void(void*指针可以指向任一个类型的指针,理解为包罗万象的盒子,任何东西都能放进去),任务函数的原型如下:
void ATaskFunction( void *pvParameters );
注:任务的创建可以在调度器启动前,也可以是调度器启动后。
任务函数运行在死循环之内,不能以任何方式返回,如果任务函数实在不需要继续执行,那么可以使用vTaskDelete()API函数主动或者被动删除任务。任务删除后就不再运行,变成了“僵尸”,等待着内核收尸。vTaskDelete()的原型及需要的头文件如下:
void vTaskDelete( TaskHandle_t pxTask );
实例:
创建1个任务,串口间隔输出running,同时输出当前的任务数
#define START_TASK_PRIO 1 //优先级
#define STATR_STACK_SIZE 128 //堆栈大小
TaskHandle_t StartTask_Handler; //任务句柄
//任务函数
void start_task(void *pParam)
{
for(;?
{
printf(“task running, task number: %ld\r\n”,uxTaskGetNumberOfTasks());
vTaskDelay(1000);
}
}
void main(void)
{
printf(“before create task : %ld\r\n”,uxTaskGetNumberOfTasks());
//创建任务
xTaskCreate( (TaskFunction_t)start_task,
(const char*)“start_task”,
(uint16_t)STATR_STACK_SIZE,
(void*)NULL,
(UBaseType_t)START_TASK_PRIO,
(TaskHandle_t*)&StartTask_Handler
);
printf(“after create task : %ld\r\n”,uxTaskGetNumberOfTasks());
//开启调度器
vTaskStartScheduler();
}
常用数据类型:
typedef uint32_t TickType_t ;
typedef long BaseType_t ;
typedef unsigned long UBaseType_t;
#define portStackType_t uint32_t;
typedef portStackType_t StackType_t;