FreeRTOS任务优先级更改与删除任务

任务优先级更改

一、vTaskPrioritySet() API函数

        vTaskPrioritySet() API函数可用于在调度器启动后更改任何任务的优先级。注意,只有当FreeRTOSConfig.h中的INCLUDE_vTaskPrioritySet设置为1时,vTaskPrioritySet() API函数才可用。API原型如下:

void vTaskPrioritySet( TaskHandle_t xTask, UBaseType_t uxNewPriority )
参数名称描述
xTask

正在修改优先级的任务的句柄(主题任务)——参见xTaskCreate() API函数的pxCreatedTask参数获取任务句柄的信息。

任务可以通过传递NULL来代替有效的任务句柄来改变自己的优先级

uxNewPriority 要设置的主题任务的优先级。这将自动限制到最大可用优先级(configMAX_PRIORITIES - 1),其中configMAX_PRIORITIES是在FreeRTOSConfig.h头文件中设置的编译时常量。

二、 uxTaskPriorityGet() API函数

        uxTaskPriorityGet() API函数可以用来查询任务的优先级。注意,只有当FreeRTOSConfig.h中的INCLUDE_uxTaskPriorityGet设置为1时,uxTaskPriorityGet() API函数才可用。API函数原型如下:

UBaseType_t uxTaskPriorityGet( TaskHandle_t pxTask )
参数名称描述
pxTask

正在查询其优先级的任务的句柄(主题任务)-参见xTaskCreate() API函数的pxCreatedTask参数获取任务句柄的信息。

任务可以通过传递NULL来代替有效的任务句柄来查询自己的优先级。

Returned value 当前分配给正在查询的任务的优先级。。

三、实例:改变任务优先级

        创建2个任务,任务1的优先级比任务2的优先级低,这样的话任务1将不会运行,将运行任务2,任务2打印出一段提示信息后,将提高任务1的优先级,此时将运行任务1,任务1打印相关信息,然后降低自己的优先级,以此类推,任务1和2将依此运行。

        主要的程序如下,具体创建任务参考:FreeRTOS-任务管理-CSDN博客

TaskHandle_t task1_handle;//任务1的句柄

        在main函数里创建2个任务:

xTaskCreate(task1,"task1",128,NULL,1,&task1handle);
xTaskCreate(task2,"task2",128,NULL,3,NULL);

        2个任务函数:

void task1(void *pvparameter)//任务1
{
	while(1)
	{
		printf("task1运行中 task1优先级为:%ld\n",uxTaskPriorityGet(NULL));
		printf("将任务1的优先级恢复到1\n");
		vTaskPrioritySet(NULL,1);

	}
	
}

void task2(void *pvparameter)//任务2
{
	while(1)
	{	
		printf("task2运行中 task1优先级为:%ld\n",uxTaskPriorityGet(task1handle));
		printf("将任务1的优先级提高到4\n");
		vTaskPrioritySet(task1handle,4);
	}
}

        试验的现象应该是先运行task2,打印相关信息和task的优先级后,将task1的优先级提示到4,由于优先级的变化会立刻运行task1,task1打印相关信息和自己的优先级后,将优先级恢复到1,然后立刻运行任务2,以此类推,试验结果如图1所示:

图1 优先级更改试验结果 

        从试验结果可以看出,task1的优先级在不断的变化,说明task1的优先级更改成功。

删除任务

一、vTaskDelete() API函数

        任务可以使用vTaskDelete() API函数来删除自己或任何其他任务。注意,只有在FreeRTOSConfig.h中INCLUDE_vTaskDelete设置为1时,vTaskDelete() API函数才可用。删除的任务不再存在,不能再进入“运行”状态。

        空闲任务负责释放分配给已删除的任务的内存。因此,重要的是,使用vTaskDelete() API函数的应用程序不要完全耗尽空闲任务的所有处理时间。

注意:当任务被删除时,只有内核自己分配给任务的内存才会被自动释放。任务实现分配的任何内存或其他资源必须显式释放。

二、实例:删除任务

        和前面任务优先级更改差不多,唯一的区别是2个任务的功能不一样,优先级任然是task1比task2低,所以会先运行task2,然后将task2任务删除,此时将运行task1,在这里我们添加一个空闲任务的钩子函数,主要是用于清理内存,空闲任务的钩子函数参考:空闲任务和空闲任务钩子-CSDN博客

        2个任务和空闲任务的钩子函数如下:

void task1(void *pvparameter)
{
	while(1)
	{
		printf("task1运行中\n");
		printf("空闲钩子函数运行次数:%d\n",taskflagrun);
		vTaskDelay(1);//阻塞1ms让空闲任务钩子函数运行下

	}
	
}

void task2(void *pvparameter)
{
	while(1)
	{	
		printf("task2运行中 \n");
		printf("删除任务2\n");
		vTaskDelete(NULL);//删除任务2  NULL代表本任务
	} 
}

void vApplicationIdleHook(void)
{
	taskflagrun++;//空闲函数运行的次数,这是一个全局变量
}

        试验结果如图2所示,task2先运行,task2任务删除后,将立刻运行task1,task打印相关新信息后进入阻塞状态,空闲任务的钩子函数将运行,阻塞结束后将运行task1,以此类推。

图2 删除任务试验结果 

  • 10
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值