任务创建和删除的API函数
函数 | 描述 |
---|---|
xTaskCreate() | 使用动态的方法创建一个任务。 |
xTaskCreateStatic() | 使用静态的方法创建一个任务。 |
xTaskCreateRestricted() | |
vTaskDelete() | 删除一个任务。 |
1、函数 xTaskCreate()
xTaskCreate( TaskFunction_t pxTaskCode,/*任务函数*/
const char * const pcName,/*任务函数名字,一般用于追踪和调试*/
const uint16_t usStackDepth,/*任务堆栈大小,实际申请到的堆栈是其4倍*/
void * const pvParameters,/*传递给任务函数的参数*/
UBaseType_t uxPriority,/*任务优先级1~30*/
TaskHandle_t * const pxCreatedTask/*任务句柄,任务创建成功以后会返回此任务的任务句柄,这个句柄就是任务堆栈。此参数用来保存这个任务句柄。其他API函数会使用到这个句柄*/ )
2、函数xTaskCreateStatic()
在这里插入代码片
3、vTaskDelete()
vTaskDelete( TaskHandle_t xTaskToDelete )//参数是要删除任务的任务句柄
简单的实验(动态方法)
创建三个任务start_task,task1_task,task2_task
各个函数的功能:
start_task: 用来创建任务task1_task,task2_task
task1_task:每隔500ms,让LED0翻转一次,运行5次后,删除task2_task
task2_task:让LED1亮800ms,灭200ms
//(main.c)
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "FreeRTOS.h"
#include "task.h"
#define START_STK_SIZE 120 //堆栈大小
#define START_TASK_PRIOTIRY 1 //优先级
TaskHandle_t START_TASK_HANDLE;//task handle
void start_task( void * pvParameters );//start function
#define TASK1_STK_SIZE 120 //堆栈大小
#define TASK1_TASK_PRIOTIRY 2 //优先级
TaskHandle_t TASK1_TASK_HANDLE;//task handle
void task1_task( void * pvParameters );//start function
#define TASK2_STK_SIZE 120 //堆栈大小
#define TASK2_TASK_PRIOTIRY 3 //优先级
TaskHandle_t TASK2_TASK_HANDLE;//task handle
void task2_task( void * pvParameters );//start function
unsigned int i=0;
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//设置系统中断优先级分组4
delay_init(168); //初始化延时函数
uart_init(115200); //初始化串口
LED_Init(); //初始化LED端口
xTaskCreate( (TaskFunction_t )start_task,
( char * )"start_task",
( uint16_t )START_STK_SIZE,
(void * )NULL,
(UBaseType_t )START_TASK_PRIOTIRY,
(TaskHandle_t * )&START_TASK_HANDLE );
vTaskStartScheduler(); //开启任务调度
}
void start_task( void * pvParameters )
{
xTaskCreate( (TaskFunction_t )task1_task,
( char * )"task1_task",
( uint16_t )TASK1_STK_SIZE,
(void * )NULL,
(UBaseType_t )TASK1_TASK_PRIOTIRY,
(TaskHandle_t * )&TASK1_TASK_HANDLE );
xTaskCreate( (TaskFunction_t )task2_task,
( char * )"tsk2_task",
( uint16_t )TASK2_STK_SIZE,
(void * )NULL,
(UBaseType_t )TASK2_TASK_PRIOTIRY,
(TaskHandle_t * )&TASK2_TASK_HANDLE );
vTaskDelete(START_TASK_HANDLE);
}
void task1_task( void * pvParameters )
{
while(1)
{
printf("task1 running\r\n");
i++;
if(i==5)
{
vTaskDelete(TASK2_TASK_HANDLE);
printf("delete task2!!!!!!\r\n");
}
LED0 = ~LED0;
vTaskDelay(500);
}
}
void task2_task( void * pvParameters )
{
while(1)
{
printf("task2 running\r\n");
LED1= 0;
vTaskDelay(200);
LED1= 1;
vTaskDelay(800);
}
}