- FreeRTOS中任务的最高优先级是通过FreeRTOSConfig.h文件中的
configMAX_PRIORITIES
进行配置的,用户实际可以使用的优先级范围是0到configMAX_PRIORITIES – 1
,如设置超过configMAX_PRIORITIES – 1
,则自动定义为configMAX_PRIORITIES – 1
。- 用户配置任务的优先级数值越小,那么此任务的优先级越低,空闲任务的优先级是
0
。
注:configMAX_PRIORITIES
可自行设置,但建议最大值不要超过32,因为设置的越大,占据的资源也就越大。
注意事项
- 相同优先级
谁先创建谁先运行,相同优先级的任务会共享处理器处理时间,基于时间片进行调度,使相同优先级的任务获得相同的运行时间。- 不同的优先级
谁优先级高谁先运行
获得任务的优先级
unsigned portBASE_TYPE uxTaskPriorityGet( xTaskHandle pxTask );
parameter | description |
---|---|
pxTask | 需要处理的任务,当传递NULL时,将返回所调用任务的优先级 |
return | pxTask的优先级 |
设置任务的优先级。 如果设置的优先级高于当前执行任务的优先级,则上下文切换将在此函数返回之前发生。
void vTaskPrioritySet( xTaskHandle pxTask, unsigned portBASE_TYPE uxNewPriority );
parameter | description |
---|---|
pxTask | 需要设置优先级的任务。当传递NULL,将设置调用任务的优先级 |
uxNewPriority | 任务需要设置的优先级 |
return | 空 |
创建两个优先级为1的任务,之后再修改task1的任务优先级为3
#include
#include "sdkconfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "esp_spi_flash.h"
void task1(void *pvParam)
{
while (1)
{
printf("task1!\n");
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
void task2(void *pvParam)
{
while (1)
{
printf("task2!\n");
vTaskDelay(1000 / portTICK_PERIOD_MS);
}
}
void app_main(void)
{
UBaseType_t iPriority = 0;
TaskHandle_t pxTask = NULL;
xTaskCreate(task1, "task1", 4096, NULL, 1, pxTask);
xTaskCreate(task2, "task2", 4096, NULL, 1, NULL);
vTaskPrioritySet(pxTask, 3);
iPriority = uxTaskPriorityGet(pxTask);
printf("task1 iPriority = %d \n", iPriority);
}