STM32Cube-FreeRTOS任务管理工具函数-笔记

STM32Cube-FreeRTOS任务管理工具函数-笔记

  • 一、获取任务句柄的函数
    • [1. 创建任务并获取句柄](#1. 创建任务并获取句柄)
    • [2. 获取当前任务句柄](#2. 获取当前任务句柄)
    • [3. 获取空闲任务句柄](#3. 获取空闲任务句柄)
    • [4. 根据任务名称获取句柄](#4. 根据任务名称获取句柄)
  • 二、单个任务操作相关函数
    • [1. 程序在运行时可以获取或改变一个任务的优先级](#1. 程序在运行时可以获取或改变一个任务的优先级)
    • [3. 获取任务信息](#3. 获取任务信息)
    • [4. 获取任务信息](#4. 获取任务信息)
    • [5. 获取任务名称](#5. 获取任务名称)
    • [6. 获取堆栈高水位值](#6. 获取堆栈高水位值)
    • [7. 获取任务状态](#7. 获取任务状态)
  • 三、核信息统计相关的函数

一、获取任务句柄的函数

1. 创建任务并获取句柄

osThreadNew() 创建任务时返回类型为 osThreadId_t。

实际上,osThreadId_t 是对 FreeRTOS 的 TaskHandle_t 类型的封装。

底层调用 xTaskCreateStatic() 或 xTaskCreate(),返回值为 TaskHandle_t。

当我们在FreeRTOS要调用osThreadNew来创建任务的时候,它会返回一个osThreadId_t这个类型的变量作为任务句柄。

os开头的类型实际上是被包装过的一个类型,这个类型是被定义在这个文件里面,它不是一个 FreeRTOS自带的这么一种类型。

实际上osThreadNew它的核心是调用了xTaskCreateStatic或者是xTaskCreate。Create state它也有一个返回的类型。

TaskHandle_t这个类型是FreeRTOS定义的一种类型,它跟我们刚才这个osThreadId_t是等价的。其实这个东西它就叫做任务的句柄。

在创建任务时就获得了一个返回的任务句柄变量。那么这个变量就可以作为FreeRTOS任务操作函数的任务句柄输入参数。除了在任务创建时获取到任务的句柄,在FreeRTOS中还有3个用于获取任务句柄的函数。


由于右侧的函数列表太多了,所以outline试图被禁用了。

解决函数较多,让其他函数显示出来的设置方法。


2. 获取当前任务句柄

获取当前任务的句柄:xTaskGetCurrentTaskHandle()

返回值的方式获取到一个任务句柄。

可以看到在这个函数之上是有两个条件。必须在我们的STM32CubeMX可视化界面中将(INCLUDE_xTaskGetCurrentTaskHandle)这个选项设置为1,这个函数才可以被参与编译。否则这个函数将会被裁剪掉,以减少我们编译出来的文件的大小。


3. 获取空闲任务句柄

获取空闲任务的句柄:xTaskGetIdleTaskHandle

可以发现这里有灰色的底,这个函数它在STM32CubeMX里是不能设置的。如果你需要使用这个函数,可以将(INCLUDE_xTaskGetIdleTaskHandle)这个变量底范围1,那这里就可以参与编译。


4. 根据任务名称获取句柄

获取任务句柄的函数:xTaskGetHandle(const char *pcNameToQuery)

函数它需要传入的参数是任务名称的字符串。这函数运行的时间比较长,不建议大量使用。如果两个任务具有相同的任务名称,那函数返回的结果是不确定的。

可以将(INCLUDE_xTaskGetHandle)这个变量底范围1,那这里就可以参与编译。

二、单个任务操作相关函数

1. 程序在运行时可以获取或改变一个任务的优先级

函数:uxTaskPriorityGet(TaskHandle_t xTask)

功能:获取指定任务的当前优先级。

1.1. uxTaskPriorityGetFromISR,是上一个函数的中断服务程序版本

3. 获取任务信息

函数: vTaskGetInfo()

使用这两个函数都需要在STM32CubeMX中确保开启了(INCLUDE_uxTaskPriorityGet)这个选项。


4. 获取任务信息

函数: vTaskGetInfo()

4.1. 函数作用
vTaskGetInfo() 是 FreeRTOS 中用于获取指定任务详细信息的调试函数。它可以获取任务的以下信息:

  • 任务状态(如运行态、就绪态、阻塞态等)
  • 任务优先级
  • 任务名称
  • 堆栈使用情况(可选)
  • 运行时间统计(需配置宏)
  • 任务句柄和编号

4.2. 函数原型

c 复制代码
void vTaskGetInfo(
    TaskHandle_t xTask,          // 要查询的任务句柄
    TaskStatus_t *pxTaskStatus,  // 保存任务信息的结构体指针
    BaseType_t xGetFreeStackSpace, // 是否计算堆栈最小剩余空间
    eTaskState eState            // 是否获取任务当前状态
);

5. 获取任务名称

函数:pcTaskGetName(TaskHandle_t xTask)

功能:返回的是一个字符型的指针。它传入的参数是一个需要被查询的任务句柄。


6. 获取堆栈高水位值

函数:uxTaskGetStackHighWaterMark(TaskHandle_t xTask)

获取任务的高水位值的函数。这个高水位值实际上就是任务的占空间最少,可用的剩余空间大小单位是字,这个值越小表示任务的占空间越容易溢出。当发现获取到的这个值偏小的时候,就要考虑扩大这个任务的占空间。


7. 获取任务状态

函数:eTaskGetState(TaskHandle_t xTask)

返回任务的当前状态。以e函开头的表示,它的返回值是一个枚举型。

三、核信息统计相关的函数

1. 获取系统中任务总数

函数:uxTaskGetNumberOfTasks()

功能:返回任务当前管理的任务的总数,包括就绪和阻塞的挂起的任务,也包含虽然删除了但是没有在空闲任务里释放的。


2. 获取任务列表字符串

函数:vTaskList(char *pcWriteBuffer)

功能:返回内核中所有任务的字符串列表信息,包含每个任务的名称、状态、优先级、高水位值、任务编号。使用这个函数时需要传入一个足够大的字符数组,FreeRTOS不会检查这个传入的数组的大小。

注意事项:vTaskList代码中用到了sprint f函数,会使编译后的应用大小明显增大。所以说这个函数一般只在调试时使用,不要在发布版本里使用。


获取系统任务状态数组

函数:uxTaskGetSystemState()

参数第一个是一个数组的指针,它是一个结构体数组需要预先的分配,数组的大小必须是大于等于FreeRTOS内的任务,下一个参数是指的第一个参数中的数组的成员个数。第三个参数用于返回FreeRTOS运行后的总时间。


获取任务运行时间统计

函数:vTaskGetRunTimeStats(char *pcWriteBuffer)

功能:输出任务运行时间和 CPU 占比。

函数也需要传入一个字符串,会以文字表格的形式返回出每个任务的运行时间,包括绝对时间和占用CPU的百分比。需要注意的是,这个函数它在运行时会禁用掉所有中断,所以不要在程序正常运行时使用这个函数,应该只在调试阶段使用。


调度器当前状态

函数:xTaskGetSchedulerState()

功能:返回调度器当前状态。

返回值:

taskSCHEDULER_NOT_STARTED(未启动)

taskSCHEDULER_RUNNING(运行中)

taskSCHEDULER_SUSPENDED(被挂起)

相关推荐
东京老树根2 小时前
SAP学习笔记 - 开发18 - 前端Fiori开发 应用描述符(manifest.json)的用途
笔记·学习
m0_678693333 小时前
深度学习笔记25-RNN心脏病预测(Pytorch)
笔记·rnn·深度学习
我的golang之路果然有问题3 小时前
快速了解GO+ElasticSearch
开发语言·经验分享·笔记·后端·elasticsearch·golang
凤年徐3 小时前
【数据结构初阶】顺序表的应用
c语言·开发语言·数据结构·c++·笔记·算法·顺序表
半导体守望者5 小时前
英福康INFICON VGC501, VGC502, VGC503 单通道、双通道和三通道测量装置
经验分享·笔记·功能测试·自动化·制造
Timmer丿5 小时前
kafka学习笔记(三、消费者Consumer使用教程——配置参数大全及性能调优)
笔记·学习·kafka
Timmer丿5 小时前
kafka学习笔记(三、消费者Consumer使用教程——消费性能多线程提升思考)
笔记·学习·kafka
保持学习ing5 小时前
黑马Java面试笔记之 消息中间件篇(Kafka)
java·笔记·面试·kafka
@蓝莓果粒茶6 小时前
LeetCode第244题_最短单词距离II
c++·笔记·学习·算法·leetcode·职场和发展·c#
肥肠可耐的西西公主6 小时前
前端(vue)学习笔记(CLASS 7):vuex
前端·笔记·学习