任务创建流程
1.定义任务栈
每个任务都是独立的,互不干扰的,所以要为每个任务都分配独立的栈空间,这个栈空间通常是一个预先定义好的全局数组, 也可以是动态分配的一段内存空间,但它们都存在于 RAM 中。
#define TASK1_STACK_SIZE 128
StackType_t Task1Stack[TASK1_STACK_SIZE];
#define TASK2_STACK_SIZE 128
StackType_t Task2Stack[TASK2_STACK_SIZE];
2.定义任务函数
任务是一个独立的函数,函数主体无限循环且不能返回。
void Task1( void *p_arg )
3.定义任务块
任务控制块就相当于任务的身份证,里面存有任务的所有信息,比如任务的栈指针,任务名称, 任务的形参等。有了这个任务控制块之后,以后系统对任务的全部操作都可以通过这个任务控制块来实现。
1 typedef struct tskTaskControlBlock
2 {
3 volatile StackType_t *pxTopOfStack; /* 栈顶 */ (1)
4
5 ListItem_t xStateListItem; /* 任务节点 */ (2)
6
7 StackType_t *pxStack; /* 任务栈起始地址 */ (3)
8 /* 任务名称,字符串形式 */(4)
9 char pcTaskName[ configMAX_TASK_NAME_LEN ];
10 } tskTCB;
11 typedef tskTCB TCB_t; (5)
4.实现任务创建函数
1)静态创建任务函数
任务控制块和栈的内存需要事先定义好,是静态的内 存 , 任 务 删 除 时 , 内 存 不 能 释 放 。
TaskHandle_t xTaskCreateStatic( TaskFunction_t pxTaskCode, (2)
const char * const pcName, (3)
const uint32_t ulStackDepth, (4)
void * const pvParameters, (5)
tackType_t * const puxStackBuffer, (6)
TCB_t * const pxTaskBuffer ) (7)
2)动态创建任务函数
TaskHandle_t xTaskCreate ( TaskFunction_t pxTaskCode, (2)
const char * const pcName, (3)
const uint32_t ulStackDepth, (4)
void * const pvParameters, (5)
tackType_t * const puxStackBuffer, (6)
TCB_t * const pxTaskBuffer ) (7)