任务的创建
1 任务需要 RAM 来保存与任务有关的状态信息(任务控制块)
2 需要一定的 RAM 来作为任务堆栈
xTaskCreate()就会从FreeRTOS的堆中分配,必须提供内存管理文件
默认使用heap_4.c
3 宏 configSUPPORT_DYNAMIC_ALLOCATION 必须为 1
4 函数 xTaskCreateStatic()创建的话这些 RAM 就需要用户来提供了
configSUPPORT_STATIC_ALLOCATION设置为1
5 任务调度器启动前还是启动后,都可以创建任务
最常用的一个
BaseType_t xTaskCreate( TaskFunction_t pxTaskCode,
const char * const pcName,
const uint16_t usstackDepth,
void * const pvParameters,
UBaseType_t uxPriority,
TaskHandle_t * const pxCreatedTask )
pxCreatedTask 任务句柄,就是任务的任务堆栈,其他API可能会用到
返回值 是反映任务创建成功或出错码
pdPASS: 任务创建成功。
6 不常用
TaskHandle_t xTaskCreateStatic( TaskFunction_t pxTaskCode,
const char * const pcName,
const uint32_t ulStackDepth,
void * const pvParameters,
UBaseType_t uxPriority,
StackType_t * const puxStackBuffer,
StaticTask_t * const pxTaskBuffer )
pxTaskBuffer: 任务控制块。
返回值:NULL : 任务创建失败
其他值: 任务创建成功,返回任务的任务句柄。
7 vTaskDelete( TaskHandle_t xTaskToDelete )
xTaskToDelete: 要删除的任务的任务句柄。
可以使用NULL做参数,删除任务本身
8 关键实验(学习动态创建):
任务创建:
#define START_TASK_PRIO 1 //任务优先级
#define START_STK_SIZE 128 //任务堆栈大小
TaskHandle_t StartTask_Handler; //任务句柄
void start_task(void *pvParameters); //任务函数
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(); //开启任务调度
开始任务:
taskENTER_CRITICAL(); //进入临界区
//创建 TASK1 任务
。。。。。。
//创建 TASK2 任务
vTaskDelete(StartTask_Handler); //删除开始任务
taskEXIT_CRITICAL(); //退出临界区
开始任务:创建其他应用任务和信号量、队列等内核对象