200字
RTOS任务 状态&运行时间查询
2024-03-05
2026-03-23

FreeRTOS任务相关API函数

函数 描述
uxTaskPriorityGet() 获取任务优先级
vTaskPrioritySet() 设置任务优先级
uxTaskGetNumberOfTasks() 获取系统中任务的数量
uxTaskGetSystemState() 获取所有任务状态信息
vTaskGetInfo() 获取指定单个的任务信息
xTaskGetCurrentTaskHandle() 获取当前任务的任务句柄
xTaskGetHandle() 根据任务名获取该任务的任务句柄
uxTaskGetStackHighWaterMark() 获取任务的任务栈历史剩余最小值
eTaskGetState() 获取任务状态
vTaskList() 以“表格”形式获取所有任务的信息
vTaskGetRunTimeStats() 获取任务的运行时间

学习资料可参考手册《FreeRTOS开发指南》第11章 ——“FreeRTOS其他任务API函数”

任务状态查询API函数

获取任务优先级函数

UBaseType_t uxTaskPriorityGet( const TaskHandle_t xTask )

此函数用于获取指定任务的任务优先级,使用该函数需将宏 INCLUDE_uxTaskPriorityGet 置 1 默认置一

形参 描述
xTask 要查找的任务句柄,NULL代表任务自身
返回值 描述
整数 任务优先级数值

修改任务优先级函数

void vTaskPrioritySet( TaskHandle_t xTask , UBaseType_t uxNewPriority )

此函数用于改变某个任务的任务优先级,使用该函数需将宏 INCLUDE_vTaskPrioritySet 置 1 默认置一

形参 描述
xTask 任务句柄,NULL代表任务自身
uxNewPriority 需要设置的任务优先级

获取系统任务数量函数

UBaseType_t uxTaskGetNumberOfTasks( void )

注意如果创建以下start_task、task1、task2任务时,

再阻塞等会触发任务切换的语句前查询 返回结果会是5,

触发阻塞语句时才会执行start_task中的删除任务,此时结果为4。

另外两个任务是

执行vTaskStartScheduler();时会创建两个任务空闲任务(Idle Task)定时器任务(Timer Task)

此函数用于获取系统中任务的任务数量

返回值 描述
整型 系统中任务的数量
UBaseType_t task_num;
task_num=uxTaskGetNumberOfTasks()

获取系统中所有任务状态信息函数

UBaseType_t uxTaskGetSystemState

UBaseType_t   uxTaskGetSystemState(   TaskStatus_t * const pxTaskStatusArray,
                                      const UBaseType_t uxArraySize,
                                      configRUN_TIME_COUNTER_TYPE * const pulTotalRunTime   )

此函数用于获取系统中所有任务的任务状态信息,使用该函数需将宏 configUSE_TRACE_FACILITY 置 1

形参 描述
xTaskStatusArray 指向TaskStatus_t 结构体数组首地址
uxArraySize 接收信息的数组大小
pulTotalRunTime 系统总运行时间,为NULL则省略总运行时间值
返回值 描述
整型 获取信息的任务数量
typedef struct xTASK_STATUS
{
    TaskHandle_t 			xHandle;                       		/* 任务句柄 */ 
    const char *		 		pcTaskName;                     	/* 任务名 */ 
    UBaseType_t			xTaskNumber;                     	/* 任务编号 */ 
    eTaskState e				CurrentState;                    	/* 任务状态 */ 
    UBaseType_t 			uxCurrentPriority;               	/* 任务优先级 */ 
    UBaseType_t 			uxBasePriority;                 	/* 任务原始优先级*/ 
    configRUN_TIME_COUNTER_TYPE 	ulRunTimeCounter; 		/* 任务运行时间*/
    StackType_t * 			pxStackBase;                    	/* 任务栈基地址 */ 
    configSTACK_DEPTH_TYPE 	usStackHighWaterMark;  	/* 任务栈历史剩余最小值 */ 
} TaskStatus_t;

获取系统中单个任务状态信息函数

void vTaskGetInfo

void vTaskGetInfo(  TaskHandle_t     xTask,
                    TaskStatus_t *   pxTaskStatus,
                    BaseType_t       xGetFreeStackSpace,
                    eTaskState       eState  )  

此函数用于获取指定的单个任务的状态信息,使用该函数需将宏 configUSE_TRACE_FACILITY 置 1

形参 描述
xTask 指定获取信息的任务的句柄
pxTaskStatus 接收任务信息的变量
xGetFreeStackSpace 任务栈历史剩余最小值, 当为“pdFALSE” 则跳过这个步骤, 当为“pdTRUE”则检查历史剩余最小堆栈
eState 任务状态,可直接赋值,如想获取代入“eInvalid”
typedef enum
{   
	eRunning = 0,	/* 运行态 */ 
	eReady		/* 就绪态 */ 
	eBlocked, 		/* 阻塞态 */ 
	eSuspended, 	/* 挂起态 */ 
	eDeleted, 		/* 任务被删除 */ 
	eInvalid		/* 无效 */ 
} eTaskState;

获取当前任务的任务句柄函数

TaskHandle_t xTaskGetCurrentTaskHandle( void )

此函数用于获取当前任务的任务句柄, 使用该函数需将宏 INCLUDE_xTaskGetCurrentTaskHandle 置 1

返回值 描述
TaskHandle_t 当前任务的任务句柄

获取当前任务的任务句柄函数

TaskHandle_t xTaskGetHandle(const char * pcNameToQuery);

此函数用于通过任务名获取任务句柄 , 使用该函数需将宏 INCLUDE_xTaskGetHandle 置 1

形参 描述
pcNameToQuery 任务名
形参 描述
pcNameToQuery 任务名

获取指定任务的任务堆栈历史最小剩余函数

UBaseType_t uxTaskGetStackHighWaterMark( TaskHandle_t xTask )

此函数用于获取指定任务的任务栈历史最小剩余堆栈;

使用该函数需将宏 INCLUDE_uxTaskGetStackHighWaterMark 置 1

形参 描述
xTask 任务句柄
返回值 描述
UBaseType_t 任务栈的历史剩余最小值

查询指定任务运行状态函数

eTaskState eTaskGetState(TaskHandle_t xTask)

此函数用于查询某个任务的运行状态,使用此函数需将宏 INCLUDE_eTaskGetState 置1

形参 描述
xTask 待获取状态任务的任务句柄
返回值 描述
eTaskState 任务状态

以“表格”的形式获取系统中任务信息函数

void vTaskList(char * pcWriteBuffer)

此函数用于以“表格”的形式获取系统中任务的信息 ;

使用此函数需将宏 configUSE_TRACE_FACILITY 和configUSE_STATS_FORMATTING_FUNCTIONS 置1

形参 描述
pcWriteBuffer 接收任务信息的缓存指针
  • Name:创建任务的时候给任务分配的名字。
  • State:任务的壮态信息, B 是阻塞态, R 是就绪态, S 是挂起态, D 是删除态。
  • Priority:任务优先级。
  • Stack: 任务堆栈的“高水位线”,就是堆栈历史最小剩余大小。
  • Num:任务编号,这个编号是唯一的,当多个任务使用同一个任务名的时候可以通过此编号来做区分。

image

image

    UBaseType_t priority_num = 0;
    UBaseType_t task_num = 0;
    UBaseType_t task_num2 = 0;
    TaskStatus_t * status_array = 0;
    TaskStatus_t * status_array2 = 0;
    TaskHandle_t task_handle = 0;
    UBaseType_t task_stack_min = 0;
    eTaskState state = 0;
  
    uint8_t i = 0;
  
    vTaskPrioritySet( task2_handler,4 );
    priority_num = uxTaskPriorityGet( NULL );
    printf("task2任务优先级为%ld\r\n",priority_num);
  
    task_num = uxTaskGetNumberOfTasks();
    printf("任务数量:%ld\r\n",task_num);
  
    status_array = mymalloc(SRAMIN,(sizeof(TaskStatus_t) * task_num));
    task_num2 = uxTaskGetSystemState( status_array,task_num,NULL);
    printf("任务名\t\t任务优先级\t任务编号\r\n");
    for(i = 0; i < task_num2; i++)
    {
        printf("%s\t\t%ld\t%ld\r\n",
                status_array[i].pcTaskName,
                status_array[i].uxCurrentPriority,
                status_array[i].xTaskNumber);
    }
  
    status_array2 = mymalloc(SRAMIN,sizeof(TaskStatus_t));
    vTaskGetInfo( task2_handler,status_array2,pdTRUE,eInvalid);
    printf("任务名:%s\r\n",status_array2->pcTaskName);
    printf("任务优先级:%ld\r\n",status_array2->uxCurrentPriority);
    printf("任务编号:%ld\r\n",status_array2->xTaskNumber);
    printf("任务状态:%d\r\n",status_array2->eCurrentState);
  
    task_handle = xTaskGetHandle( "task1" );
    printf("任务句柄:%#x\r\n",(int)task_handle);
    printf("task1的任务句柄:%#x\r\n",(int)task1_handler);
  
    state = eTaskGetState( task2_handler );
    printf("当前task2的任务状态为:%d\r\n",state);
  
    vTaskList( task_buff );
    printf("%s\r\n",task_buff);

任务时间统计API函数实验

Void vTaskGetRunTimeStats( char * pcWriteBuffer )

此函数用于统计任务的运行时间信息,使用此函数需将宏 configGENERATE_RUN_TIME_STAT 、configUSE_STATS_FORMATTING_FUNCTIONS 置1

形参 描述
pcWriteBuffer 接收任务运行时间信息的缓存指针

运行结果:

image

image

时间统计API函数使用流程

  1. 将宏 configGENERATE_RUN_TIME_STATS 置1

  2. 将宏 configUSE_STATS_FORMATTING_FUNCTIONS 置1

  3. 当将此宏 configGENERATE_RUN_TIME_STAT 置1之后,还需要实现2个宏定义:

    1. ① portCONFIGURE_TIMER_FOR_RUNTIME_STATE() :用于初始化用于配置任务运行时间统计的时基定时器;

      注意:这个时基定时器的计时精度需高于系统时钟节拍精度的10至100倍!

    2. ② portGET_RUN_TIME_COUNTER_VALUE():用于获取该功能时基硬件定时器计数的计数值 。

image

FreeRTOS任务相关API函数介绍(课堂总结).pdf

评论