任务优先级更改
一、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-任务管理-优快云博客
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,在这里我们添加一个空闲任务的钩子函数,主要是用于清理内存,空闲任务的钩子函数参考:空闲任务和空闲任务钩子-优快云博客
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 删除任务试验结果