1、创建任务
动态创建任务
BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, // 函数指针, 任务函数
const char * const pcName, // 任务的名字
const configSTACK_DEPTH_TYPE usStackDepth, // 栈深度,单位为 word,10 表示40 字节
void * const pvParameters, // 调用任务函数时传入的参数
UBaseType_t uxPriority, // 优先级,值越小优先级越低
TaskHandle_t * const pxCreatedTask ); // 任务句柄, 以后使用它来操作这个任务
xTaskCreate(vTaskFunction, "Task 1", 1000, NULL, 1, &xHandleTask1);
创建任务返回的Handle(任务控制块)是 TCB_t 结构体(每个任务都会有TCB_t 结构体)的指针
静态创建任务
TaskHandle_t xTaskCreateStatic( TaskFunction_t pxTaskCode,
const char * const pcName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */
const uint32_t ulStackDepth,
void * const pvParameters,
UBaseType_t uxPriority,
StackType_t * const puxStackBuffer, //传入栈
StaticTask_t * const pxTaskBuffer );//结构体
xTaskCreateStatic(Task3Function, "Task3", 100, NULL, 1, xTask3Stack, &xTask3TCB);
静态创建任务:TCB_t 结构体事先分配好,栈(一块空闲的内存)事先分配好
2、任务优先级
优先级的取值范围是: 0~(configMAX_PRIORITIES – 1),数值越大优先级越高,高优先级的任务先运行,如果高优先级的任务没有主动放弃运行,其他低优先级任务根本没办法执行
默认调度机制:
- FreeRTOS 会确保最高优先级的、可运行的任务,马上就能执行
- 对于相同优先级的、可运行的任务,轮流执行
3、删除任务
void vTaskDelete( TaskHandle_t xTaskToDelete );
pvTaskCode:任务句柄,使用 xTaskCreate 创建任务时可以得到一个句柄也可传入 NULL,这表示删除自己。
4、栈空间
栈中存有地址和局部变量,如果任务中用大量的局部变量填满空间会破坏头部、破坏TCB,程序将会崩溃,所以在创建任务之前首先要确定任务需要的栈空间
volatile char buf[500];