Freertos系列(二)任务相关的API函数

任务创建和删除的API函数

函数 描述
xTaskCreate() 使用动态的方法创建一个任务。
xTaskCreateStatic() 使用静态的方法创建一个任务。
xTaskCreateRestricted() 创建一个使用 MPU 进行限制的任务,相关内存使用动态内存分配。
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);
		
	}
}

猜你喜欢

转载自blog.csdn.net/qq_45699195/article/details/113199518
今日推荐