FreeRTOS初级篇----删除任务

任务既然可以被创建,那么自然也可以被删除,对于某些执行一次或几次就不需要的任务来说,可以在执行完成后,把此任务删除,可以通过别的任务将其删除,也可以任务自己删除自己。
任务删除函数:
void vTaskDelete( TaskHandle_t xTaskToDelete );
他的参数就是任务的句柄,就是创建任务函数的第五个参数。
在这里插入图片描述
之前说过,任务句柄实际上就是一个TCB结构体,存放任务的一些信息,对任务进行某些操作的时候,把任务句柄传入对应的函数即可。
所以删除任务就把要删除的任务的句柄传递给删除任务函数即可。
代码:
首先创建三个任务,在任务2中,任务2执行100次之后,调用vTaskDelete(NULL);函数,自己把自己删除;在任务3中,任务3执行200次之后,任务3调用vTaskDelete(xHandleTask1);函数把任务1删除。注意vTaskDelete()中,参数写入NULL则代表删除此任务本身。

static volatile int Task1RunningFlag = 0;
static volatile int Task2RunningFlag = 0;
static volatile int Task3RunningFlag = 0;
TaskHandle_t xHandleTask1;
void Task1(void * param)
{
	while(1)
	{
		Task1RunningFlag = 1;
		Task2RunningFlag = 0;
		Task3RunningFlag = 0;
		printf("A");
	}	
}
TaskHandle_t xHandleTask2;
void Task2(void * param)
{
	int i = 0;
	while(1)
	{
		Task1RunningFlag = 0;
		Task2RunningFlag = 1;
		Task3RunningFlag = 0;
		printf("a");
		if(i++ == 100)
		{
			vTaskDelete(NULL);
		}
	}	
}
StackType_t xTask3Stack[100];
StaticTask_t xTask3Tcb;
void Task3(void * param)
{
	int i = 0;
	
	while(1)
	{
		Task1RunningFlag = 0;
		Task2RunningFlag = 0;
		Task3RunningFlag = 1;
		printf("1");
		if(i++ == 200)
		{
			vTaskDelete(xHandleTask1);
		}
	}	
}
StackType_t xIdleTaskStack[100];
StaticTask_t xIdleTaskTcb;
void vApplicationGetIdleTaskMemory(StaticTask_t * * ppxIdleTaskTCBBuffer, StackType_t * * ppxIdleTaskStackBuffer, uint32_t * pulIdleTaskStackSize)
{
	*ppxIdleTaskTCBBuffer = &xIdleTaskTcb;
	*ppxIdleTaskStackBuffer = xIdleTaskStack;
	*pulIdleTaskStackSize = 100;
}

主函数:


int main( void )
{
	prvSetupHardware();
	printf("Hello World!\r\n");

	xTaskCreate(Task1,"Task1",100,NULL,1,&xHandleTask1);
	xTaskCreate(Task2,"Task2",100,NULL,1,&xHandleTask2);
	xTaskCreateStatic(Task3,"Task3",100,NULL,1,xTask3Stack,&xTask3Tcb);
	
	vTaskStartScheduler();
	return 0;
}

输出结果:
在这里插入图片描述
可以看到,任务2执行一段时间(100次)后被删除,任务1在这之后又执行一段时间(共200次)之后被删除,在以后就只剩下任务3执行了。
vTaskDelete();函数既可以删除动态创建任务函数xTaskCreate创建的任务,也可以删除静态创建任务函数xTaskCreateStatic创建的任务。
对于xTaskCreate()我们在创建的时候就已经定了了该任务的任务句柄,删除的时候直接传入即可。
对于xTaskCreateStatic,我们可以从下图看到,此函数的返回值就是一个任务句柄,所以要提前用一个创建个结构体获取该任务的句柄。

TaskHandle_t TaskStaticHandle = xTaskCreateStatic(Task3,"Task3",100,NULL,1,xTask3Stack,&xTask3Tcb);

在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值