API函数
任务创建和删除的本质是调用 api函数
任务函数原型
创建任务的函数原型
注意
函数判断 if(XXXX== 1) XXXX就是宏 如果等于1 才能使用下面的动态函数
必须 go to 查看 是否 xxxx==1
这是宏 置 1 的情况
代码
#define START_STK_SIZE 120 //任务堆栈大小
#define START_TASK_PRIO 1 //优先级
TaskHandle_t StartTask_Handler; //任务句柄
void start_task( void *pvParameters);//函数声明定义
#define LED0_TASK_PRIO 2 //优先级
#define LED0_STK_SIZE 50 //任务堆栈大小
TaskHandle_t LED0Task_Handler; //任务句柄
void led0_task(void *pvParameters);//函数声明定义
#define TASK2_TASK_SIZE 50 //任务堆栈大小
#define TASK2_TASK_PRIO 3 //任务句柄
TaskHandle_t TASK2Task_handler; //任务堆栈大小
void task_task2( void *pvParameters );//函数声明定义
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4)
delay_init();
LED_init();
// 创建任务
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(); //开始任务调度
return 0;
}
//开始任务
void start_task( void *pvParameters )
{
// task1
xTaskCreate((TaskFunction_t)led0_task, //任务函数
(const char*) "led0_task", //任务名字
(uint16_t) LED0_STK_SIZE, //堆栈大小
( void*) NULL, //堆栈函数值
(UBaseType_t) LED0_TASK_PRIO,//任务优先级
(TaskHandle_t*) &LED0Task_Handler); //任务句柄
//task2
xTaskCreate ((TaskFunction_t) task_task2, //任务函数
( const char*) "task_task2", //任务名字
(uint16_t ) TASK2_TASK_SIZE, //堆栈大小
( void *) NULL, //堆栈函数值
(UBaseType_t) TASK2_TASK_PRIO, //任务优先级
(TaskHandle_t*) &TASK2Task_handler ); //任务句柄
vTaskDelete(StartTask_Handler);//删除 任务句柄
堆栈大小
保存现场cpu的值 (寄存器的值 )
注意 宏定义的值 不是 堆栈大小的值 这里只是 一个字节的值 因为默认 int 类型 (4个字节)
所以要 #define xxx xx xx 实际的值是 4 *(xx)堆栈大小
任务优先级
0-n 0 最大 依次减少
任务句柄
任务句柄类似 一个 函数的入口地址 函数返回了这个地址 就开始从这个地址 开始 工作。
怎么实现最简单的灯闪烁呢
void led0_task( void *pvParameters )
{
while(1)
{
LED0 =~LED0;
vTaskDelay(500);
}
}
void task_task2( void *pvParameters )
{
while(1)
{
LED1 =~LED1;
vTaskDelay(500);
}
}