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

本文介绍FreeRTOS中任务的创建与删除方法,通过示例代码展示了如何使用xTaskCreate()创建不同优先级的任务,并演示了如何在运行过程中删除指定任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

任务创建和删除的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);
		
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值