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:任务编号,这个编号是唯一的,当多个任务使用同一个任务名的时候可以通过此编号来做区分。


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 | 接收任务运行时间信息的缓存指针 |
运行结果:


时间统计API函数使用流程
-
将宏 configGENERATE_RUN_TIME_STATS 置1
-
将宏 configUSE_STATS_FORMATTING_FUNCTIONS 置1
-
当将此宏 configGENERATE_RUN_TIME_STAT 置1之后,还需要实现2个宏定义:
-
① portCONFIGURE_TIMER_FOR_RUNTIME_STATE() :用于初始化用于配置任务运行时间统计的时基定时器;
注意:这个时基定时器的计时精度需高于系统时钟节拍精度的10至100倍!
-
② portGET_RUN_TIME_COUNTER_VALUE():用于获取该功能时基硬件定时器计数的计数值 。
-
