目录
2.5 函数 xTaskGetApplicationTaskTag()
2.6 函数 xTaskGetCurrentTaskHandle()
2.8 函数 xTaskGetIdleTaskHandle()
2.9 函数 uxTaskGetStackHighWaterMark()
2.13 函数 xTaskGetTickCountFromISR()
2.14 函数 xTaskGetSchedulerState()
2.15 函数 uxTaskGetNumberOfTasks()
2.17 函数 vTaskGetRunTimeStats()
2.18 函数 vTaskSetApplicationTaskTag()
2.19 函数 SetThreadLocalStoragePointer()
2.20 函数 GetThreadLocalStoragePointer()
在前面我们已经学习了与任务相关的 API 函数,但是实际上真正设计到的 API 函数只有那么几个。但是 FreeRTOS 还有很多和任务相关的辅助 API 函数。在这里,我们学习一下和任务相关的辅助 API 函数。
1. 任务相关 API 函数预览
uxTaskPriorityGet() 查询某个任务的优先级
vTaskPrioritySet() 改变某个任务的任务优先级
uxTaskGetSystemState() 获取系统中的任务状态
vTaskGetInfo() 获取某个任务的任务信息
xTaskGetApplicationTaskTag() 获取某个任务的标签(Tag)值
xTaskGetCurrentTaskHandle() 获取当前正在运行的任务的任务句柄
xTaskGetHandle() 根据任务名字查找某个任务的句柄
xTaskGetIdleTaskHandle() 获取空闲任务的任务句柄
uxTaskGetStackHighWaterMark() 获取任务的堆栈的历史剩余最小值,FreeRTOS 中叫做 “高水位线”
eTaskGetState() 获取某个任务的状态,这个状态是 eTaskState 类型
pcTaskGetName() 获取某个任务的任务名字
xTaskGetTickCount() 获取系统时间计数器值
xTaskGetTickCountFromISR() 在中断服务函数中获取时间计数器值
xTaskGetSchedulerState() 获取任务调度器的状态,开启或未开启
uxTaskGetNumberOfTasks() 获取当前系统中存在的任务数量
vTaskList() 以一种表格的形式输出当前系统中所有任务的详细信息
vTaskGetRunTimeStats() 获取每个任务的运行时间
vTaskSetApplicationTaskTag() 设置任务标签(Tag)值
SetThreadLocalStoragePointer() 设置线程本地存储指针
GetThreadLocalStoragePointer() 获取线程本地存储指针
2. 任务相关 API 函数详解
2.1 函数 uxTaskPriorityGet()
此函数用来设置指定任务的优先级,要使用此函数的话宏 INCLUDE_uxTaskPriorityGet 应设置为 1 ,函数原型如下:
UBaseType_t uxTaskPriorityGet(TaskHandle_t xTask)
参数:
xTask: 要查找任务的任务句柄
返回值: 获取到的对应任务的任务优先级
TaskHandle_t xTaskHandle;
UBaseType_t uxPriority;
//获取当前任务的任务优先级
xTaskHandle = xTaskGetCurrentTaskHandle();
//获取当前任务的任务优先级
uxPriority = uxTaskPriorityGet(xTaskHandle);
需要注意的是:任务的任务优先级值越高,任务获得 CPU 执行时间的优先级也越高。FreeRTOS 任务调度器根据任务的优先级来决定任务的执行顺序。
void vTaskPrioritySet(TaskHandle_t xTask,
UBaseType_t uxNewPriority)
2.2 函数 vTaskPrioritySet()
此函数用于改变某一个任务的任务优先级,要使用此函数的话宏 INCLUDE_vTaskPrioritySet 应该定义为 1,函数原型如下:
void vTaskPrioritySet( TaskHandle_t xTask,
UBaseType_t uxNewPriority )
参数:
xTask: 要查找的任务的任务句柄
uxNewPriority: 任务要使用的新的优先级,可以是 0~configMAX_PRIORITIES - 1
返回值: 无
2.3 函数 uxTaskGetSystemState()
此函数用于获取系统中所有任务的任务状态,每个任务的状态信息保存在一个 TaskStatus_t 类型的结构体里面,这个结构体里面包含了任务的任务句柄、任务名字、堆栈、优先级等信息,要使用此函数的话宏 configUSE_TRACE_FACILITY 应该定义为 1,函数原型如下:
UBaseType_t uxTaskGetSystemState(TaskStatus_t* const pxTaskStatusArray,
const UBaseType_t uxArraySize,
uint32_t* const pulTotalRunTime)
参数:
pxTaskStatusArray: 指向 TaskStatus_t 结构体类型的数组首地址,每个任务至少需要一个 TaskStatus_t 结构体,任务的数量可以使用函数 uxTaskGetNumberOfTasks() 来获取。结构体 TaskStatus_t 在文件 task.h 中有如下定义:
typedef struct xTASK_STATUS
{
TaskHandle_t xHandle; //任务句柄
const char * pcTaskName; //任务名字
UBaseType_t xTaskNumber; //任务编号
eTaskState eCurrentState; //当前任务壮态,eTaskState 是一个枚举类型
UBaseType_t uxCurrentPriority; //任务当前的优先级
UBaseType_t uxBasePriority; //任务基础优先级
uint32_t ulRunTimeCounter;//任务运行的总时间
StackType_t * pxStackBase; //堆栈基地址
uint16_t usStackHighWaterMark; //从任务创建以来任务堆栈剩余的最小大小,此
//值如果太小的话说明堆栈有溢出的风险。
} TaskStatus_t;
uxArraySize: 保存任务状态数组的数组的大小
pulTotalRunTime: 如果 configGENERATE_RUN_TIME_STATS 为 1 的话此参数用来保存系统总的运行时间
返回值:
统计到的任务状态的个数,也就是填写到数组 pxTaskStatusArray 中的个数,此值应该等于函数 uxTaskGetNumberOfTasks() 的返回值。如果参数 uxArraySize 太小的话返回值可能为 0.
2.4 函数 vTaskGetInfo()
此函数是用来获取某个任务的任务信息。但是获取的是指定的单个任务的任务状态,任务的状态信息填充到参数 pxTaskStatus 中,这个参数也是 TaskStatus_t 类型的。要使用此函数的话宏 configUSE_TRACE_FACILITY 要定义为 1,函数原型如下:
void vTaskGetInfo( TaskHandle_t xTask,
TaskStatus_t * pxTaskStatus,
BaseType_t xGetFreeStackSpace,
eTaskState eState )
参数:
xTask: 要查找的任务的任务句柄
pxTaskStatus: 指向类型为 TaskStatus_t 的结构体变量
xGetFreeStackSpace: 在结构体 TaskStatus_t 中有个字段 usStackHighWaterMark 来保存自任务运行以来任务堆栈剩余的历史最小大小,这个值越小说明越接近堆栈溢出,但是计算这个值需要花费一点时间,所以我们可以通过将 xGetFreeStackSpace 设置为 pdFALSE 来跳过这个步骤,当设置为 pdTRUE 的时候就会检查堆栈的历史剩余最小值。
eState: 结构体 TaskStatus_t 中有个字段 eCurrentState 用来保存任务运行状态,这个字段是 eTaskState 类型的,这个是枚举类型,在 task.h 中如下定义:
typedef enum
{
eRunning = 0, //运行壮态
eReady, //就绪态
eBlocked, //阻塞态
eSuspended, //挂起态
eDeleted, //任务被删除
eInvalid //无效
} eTaskState;
获取任务状态信息会耗费不少时间,所以为了加快函数 vTaskGetInfo() 的执行速度结构体 TaskStatus_t 中的字段 eCurrentState 就可以由用户直接赋值,参数 eState 就是要赋的值。如果不在乎这点时间,那么可以将 eState 设置为 eInvalid ,这样任务的状态信息就由函数 vTaskGetInfo() 去想办法获取。

文章详细介绍了FreeRTOS中与任务管理相关的API函数,包括任务的创建、查询、优先级设置、状态获取等功能,并通过实验展示了如何使用这些函数进行任务状态查询和运行时间统计。此外,还提到了配置宏的作用和相关实验程序的分析。
最低0.47元/天 解锁文章
1351

被折叠的 条评论
为什么被折叠?



