1 FreeRTOS任务相关API函数介绍
函数 | 描述 |
uxTaskPriorityGet() | 获取任务优先级 |
vTaskPrioritySet() | 设置任务优先级 |
uxTaskGetNumberOfTasks() | 获取系统中任务的数量 |
uxTaskGetSystemState() | 获取所有任务状态信息 |
vTaskGetInfo() | 获取指定单个的任务信息 |
xTaskGetCurrentTaskHandle() | 获取当前任务的任务句柄 |
xTaskGetHandle() | 根据任务名获取该任务的任务句柄 |
uxTaskGetStackHighWaterMark() | 获取任务的任务栈历史剩余最小值 |
eTaskGetState() | 获取任务状态 |
vTaskList() | 以表格形式获取所有任务的信息 |
vTaskGetRunTimeStats() | 获取任务的运行时间 |
UBaseType_t uxTaskPriorityGet( const TaskHandle_t xTask );
//形参xTask 要查找的任务句柄,NULL代表任务自身
//返回值为整数,表示任务优先级数值
//此函数用于获取指定任务的任务优先级,使用该函数需将宏INCLUDE_uxTaskPriorityGet 置1。
void vTaskPrioritySet( TaskHandle_t xTask,UBaseType_t uxNewPriority );
//形参xTask 要查找的任务句柄,NULL代表任务自身
//形参uxNewPriority 要设置的任务优先级
//此函数用于改变某个任务的任务的优先级,使用该函数需要将宏INCLUDE_vTaskPrioritySet为1
UBaseType_t uxTaskGetNumberOfTasks( void );
//返回值表示的是系统中任务的数量
//此函数用于获取系统中任务的任务数量
UBaseType_t uxTaskGetSystemState( TaskStatus_t * const pxTaskStatusArray,
const UBaseType_t uxArraySize,
configRUN_TIME_COUNTER_TYPE * const pulTotalRunTime );
//形参pxTaskStatusArray 指向TaskStatus_t结构体数组首地址
//形参uxArraySize 接收信息的数组大小
//形参pulTotalRunTime 系统总运行时间,NULL则表示省略总运行时间值
//返回值为整形,表示获取信息的任务数量
//此函数用于获取系统中所有任务的任务状态信息,使用该函数需将宏configUSE_TRACE_FACILITY 置1
typedef struct xTASK_STATUS
{
TaskHandle_t xHandle; //任务句柄
const char * pcTaskName; //任务名
UBaseType_t xTaskNumber; //任务编号
eTaskState eCurrentState; //任务状态
UBaseType_t uxCurrentPriority;//任务优先级
UBaseType_t uxBasePriority; //任务原始原始优先级
configRUN_TIME_COUNTER_TYPE ulRunTimeCounter; //任务运行时间
StackType_t * pxStackBase; //任务栈基地址
configSTACK_DEPTH_TYPE usStackHighWaterMark; //任务栈历史剩余最小值
} TaskStatus_t;
void vTaskGetInfo( TaskHandle_t xTask,
TaskStatus_t * pxTaskStatus,
BaseType_t xGetFreeStackSpace,
eTaskState eState );
//形参xTask 指定获取信息的任务的句柄
//形参pxTaskStatus 接收任务信息的变量
//形参xGetFreeStackSpace 任务栈历史剩余最小值,当为“pdFALSE”,
//则跳过这个步骤,当为“pdTRUE”,则检查历史剩余最小堆栈
//形参estate ,任务状态,可直接赋值,如若想要获取可带入elnvalid
typedef enum
{
eRunning = 0, /* 运行态 */
eReady /* 就绪态 */
eBlocked, /* 阻塞态 */
eSuspended, /* 挂起态 */
eDeleted, /* 任务被删除 */
eInvalid /* 无效 */
} eTaskState;
TaskHandle_t xTaskGetCurrentTaskHandle( void );
//返回值 TaskHandle_t 表示当前任务的任务句柄
//此函数用于获取当前任务的任务句柄,使用该函数需将宏INCLUDE_xTaskGetCurrentTaskHandler置1
TaskHandle_t xTaskGetHandle( const char * pcNameToQuery );
//形参pcNameToQuery,表示的是任务名
//返回值TaskHandler, 表示任务句柄
//此函数用于通过任务名获取任务句柄,使用该函数需将宏INCLUDE_xTaskGetHandle置1
UBaseType_t uxTaskGetStackHighWaterMark( TaskHandle_t xTask );
//形参xTask,表示任务句柄
//返回值UBaseType_t,表示的是任务栈的历史剩余最小值
//此函数用于获取指定任务的任务栈历史最小剩余堆栈,使用该函数需将
//宏INCUDE_uxTaskGetStackHighWaterMark置1
eTaskState eTaskGetState( TaskHandle_t xTask );
//形参xTask,表示待获取状态任务的任务句柄
//eTaskState,任务状态
//此函数用于查询某个任务的运行状态,使用此函数需将宏INCLUDE_eTaskGetStatue置1
typedef enum
{
eRunning = 0, /* 运行态 */
eReady /* 就绪态 */
eBlocked, /* 阻塞态 */
eSuspended, /* 挂起态 */
eDeleted, /* 任务被删除 */
eInvalid /* 无效 */
} eTaskState;
void vTaskList( char * pcWriteBuffer );
//形参pcWriteBuffer ,表示用于接收任务信息的缓存指针
//此函数以表格的形式获取系统中的任务信息,
//使用此函数需将宏configUSE_TRACE_FACILITY和configUSE_STATS_FROMATTING_FUNCTIONS置1
表格如下图所示:
Name:创建任务时给任务分配的名字
State:任务的状态信息,X是运行态,B是阻塞态,R是就绪态,S是挂起态,D是删除态
Priority:任务优先级
Stack:任务堆栈的“高水位线”,就是堆栈历史最小剩余大小
Num:任务编号,这个编号是唯一的,当多个任务使用同一个任务名的时候可以通过此编号来做区分
2 任务状态查询API函数实验
实验设计:将设计三个任务:start_task、task1、task2
三个任务的功能如下:
start_task : 用来创建task1和task2任务
task1 :LED0每500ms闪烁一次,提示程序正在运行
task2 : 用于展示任务状态信息查询相关API函数的使用
#include "freertos_demo.h"
#include "./SYSTEM/usart/usart.h"
#include "./BSP/LED/led.h"
#include "./BSP/LCD/lcd.h"
#include "./BSP/KEY/key.h"
#include "./MALLOC/malloc.h"
/****************************FreeRTOS***************************************************/
#include "FreeRTOS.h"
#include "task.h"
/***************************************************************************************/
/*FreeRTOS配置*/
/* START_TASK 任务 配置
* 包括: 任务句柄 任务优先级 堆栈大小 创建任务
*/
#define START_TASK_PRIO 1 /* 任务优先级 */
#define START_STK_SIZE 128 /* 任务堆栈大小 */
TaskHandle_t StartTask_Handler; /* 任务句柄 */
void start_task(void *pvParameters); /* 任务函数 */
/* TASK1 任务 配置
* 包括: 任务句柄 任务优先级 堆栈大小 创建任务
*/
#define TASK1_PRIO 2 /* 任务优先级 */
#define TASK1_STK_SIZE 128 /* 任务堆栈大小 */
TaskHandle_t Task1Task_Handler; /* 任务句柄 */
void task1(void *pvParameters); /* 任务函数 */
/* TASK2 任务 配置
* 包括: 任务句柄 任务优先级 堆栈大小 创建任务
*/
#define TASK2_PRIO 3 /* 任务优先级 */
#define TASK2_STK_SIZE 128 /* 任务堆栈大小 */
TaskHandle_t Task2Task_Handler; /* 任务句柄 */
void task2(void *pvParameters); /* 任务函数 */
/***************************************************************************************/
void freertos_demo(void)
{
xTaskCreate((TaskFunction_t )start_task, /* 任务函数 */
(const char* )"start_task", /* 任务名称 */
(uint16_t )START_STK_SIZE, /* 任务堆栈大小 */
(void* )NULL, /* 传入给任务函数的参数 */
(UBaseType_t )START_TASK_PRIO, /* 任务优先级 */
(TaskHandle_t* )&StartTask_Handler); /* 任务句柄 */
vTaskStartScheduler(); //任务调度器
}
void start_task(void *pvParameters)
{
taskENTER_CRITICAL(); /* 进入临界区 */
/* 创建任务1 */
xTaskCreate((TaskFunction_t )task1,
(const char* )"task1",
(uint16_t )TASK1_STK_SIZE,
(void* )NULL,
(UBaseType_t )TASK1_PRIO,
(TaskHandle_t* )&Task1Task_Handler);
/* 创建任务2 */
xTaskCreate((TaskFunction_t )task2,
(const char* )"task2",
(uint16_t )TASK2_STK_SIZE,
(void* )NULL,
(UBaseType_t )TASK2_PRIO,
(TaskHandle_t* )&Task2Task_Handler);
vTaskDelete(StartTask_Handler); /* 删除开始任务 */
taskEXIT_CRITICAL(); /* 退出临界区 */
}
//任务一,实现每500ms翻转一次
void task1(void *pvParameters)
{
while(1)
{
LED1_TOGGLE(); /* LED0闪烁 */
vTaskDelay(500); /* 延时500ms */
}
}
char task_buff[300];
//任务二,实现任务状态查询API函数使用
void task2(void *pvParameters)
{
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( Task2Task_Handler,4 ); /*修改任务2的优先级为4*/
priority_num = uxTaskPriorityGet( NULL );
/*获取任务2的优先级,如果使用NULL表示获取自身的任务优先级*/
printf("Task2任务优先级为%d\r\n",priority_num);
task_num = uxTaskGetNumberOfTasks();
/*获取系统中任务的任务数量*/
printf("任务数量:%d\r\n",task_num);
/*start_task、Task1、Task2。还包括空闲任务、以及软件定时器任务*/
/*获取系统中所有任务的任务状态信息*/
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%ld\t%ld\t\r\n",
status_array[i].pcTaskName,
status_array[i].uxCurrentPriority,
status_array[i].xTaskNumber);
}
/*获取单个任务的状态信息*/
status_array2 = mymalloc(SRAMIN,sizeof(TaskStatus_t) );
//由于只有一个任务,因此不需要*任务数量
vTaskGetInfo( Task1Task_Handler,status_array2,pdTURE,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)task_handle);
/*查询某个任务的运行状态*/
state = eTaskGetState( Task2Task_Handler );
printf("当前task2的任务状态为:%d\r\n",state);
/*以表格的形式获取系统中任务的信息*/
vTaskList(task_buff);
printf("%s\r\n",task_buff);
while(1)
{
// /*获取指定任务的任务栈历史最小剩余堆栈*/
// task_stack_min = uxTaskGetStackHighWaterMark( Task2Task_Handler );
// printf("task2历史剩余最小堆栈为%ld\r\n",task_stack_min);
vTaskDelay(10);
}
}
3 任务时间统计API函数
void vTaskGetRunTimeStats( char * pcWriteBuffer );
//形参pcWriteBuffer 表示接收任务运行时间信息的缓存指针
//此函数用于统计任务的运行时间信息,使用此函数需要将宏configGENERATE_RUN_TIME_STATE、configUSE_STATS_FROMATTING_FUNCTIONS置1
Task:任务名称
Abs Time : 任务实际运行的总时间(绝对时间)
%Time:占总出来时间的百分比
时间统计API函数使用流程:
1)将宏configGENERATE_RUN_TIME_STATS置1.
2)将宏configUSE_STATS_FORMATTING_FUNCTIONS置1
3)当将此宏configGENERATE_RUN_TIME_STAT置1之后,还需要实现2 个宏定义:
- portCONFIGURE_TIMER_FOR_RUNTIME_STATS() 用于初始化配置任务运行时间统计的时基定时器(注意:这个时基定时器的计时精度需高于系统时钟节拍精度的10至100倍)
- portGET_RUN_TIME_COUNTER_VALUE() 用于获取该功能时基硬件定时器计数的计数值