【RTOS】快速体验FreeRTOS所有常用API(11)打印空闲栈、CPU占用比

目录

    • 十一、调试
      • 11.1 打印任务空闲栈
      • 11.2 打印所有任务栈信息
      • 11.3 CPU占用比
      • 11.4 空闲任务和钩子函数

十一、调试

该部分在上份代码基础上修改得来,代码下载链接:

https://wwzr.lanzout.com/in63o1lauwwh

密码:9bhf

该代码尽量做到最简,不添加多余的、不规范的代码。

内容主要包括

  • 打印任务空闲栈
  • 打印所有任务栈信息
  • 打印CPU占用比

最终实现效果:

  • 使用串口打印出:当前任务空闲栈、所有任务栈信息、CPU占用比

img

11.1 打印任务空闲栈

在FreeRTOS中,要打印任务的空闲栈(空余空间),可以使用任务状态查询函数 uxTaskGetStackHighWaterMark。这个函数返回任务栈的最小可用空间(以为单位,32位系统中,1字=4字节=32位)

示例:

UBaseType_t freeStack;

// 获取任务空闲栈
freeStack= uxTaskGetStackHighWaterMark(NULL);

// 打印任务空闲栈 (以字为单位)
printf("Task %s free stack: %u words\n", pcTaskGetName(NULL), freeStack);

实例:

img

img

11.2 打印所有任务栈信息

要打印所有任务的栈信息,你可以使用FreeRTOS的任务列表查询函数 vTaskList

// 定义一个缓冲区,用于存储任务列表信息
char g_taskListBuffer[1024];

// 获取任务列表信息
vTaskList(g_taskListBuffer);

// 打印任务列表
printf("Task List:\n%s", g_taskListBuffer);

需要在stm32cubemx中使能use_stats_formatting_functions参数。

img

实例:

img

img

每列的具体含义

  • Task: 任务的名称。
  • State: 任务的状态。包括 “R”(运行)、“B”(阻塞)、“D”(删除)等。X表示使用该函数的任务。
  • Priority: 任务的优先级。
  • Stack: 任务的空闲栈。
  • Num: 任务的编号。

11.3 CPU占用比

vTaskGetRunTimeStats 是一个 FreeRTOS 函数,用于获取系统中每个任务的运行时间统计信息。这个函数允许你了解每个任务在系统中的运行时间百分比,以及每个任务实际运行的时钟滴答数。

示例:

// 定义一个缓冲区,用于存储CPU占用比信息
char g_taskListBuffer[1024];

// 获取运行时间统计信息
vTaskGetRunTimeStats(g_taskListBuffer);

// 打印运行时间统计信息
printf("Run Time Stats:\n%s\n", g_taskListBuffer);

1 需要在stm32cubemx中使能generate_run_time_stats参数。

img

2 该函数需要用到getRunTimeCounterValue()函数来获取系统时间,但cubemx并未实例化这个函数。需要自己实现。

cubemx生成的

img

需要自己实现

img

实例

img

img

11.4 空闲任务和钩子函数

FreeRTOS 中的空闲任务是一个特殊的任务,优先级为0。

通常用于在系统没有其他任务执行时执行一些低优先级的任务。这个任务的名称通常是 “Idle”。

此外,FreeRTOS 还提供了与空闲任务关联的钩子函数,空闲任务的循环每执行一次,就会调用一次钩子函数vApplicationIdleHook()

钩子函数****的作用

  • 测量系统的空闲时间:空闲任务能被执行就意味着所有的高优先级任务都停止了,所以测量空闲任务占据的时间,就可以算出处理器占用率。
  • 让系统进入省电模式:空闲任务能被执行就意味着没有重要的事情要做,当然可以进入省电模式了。
  • 使用vTaskDelete()删除的任务,由钩子函数来释放内存。

因此,我们改用空闲任务提供的钩子函数,来显示之前的调试信息,是比较合理的。

首先,需要在stm32cubemx中使能use_idle_hook参数。

img

将调试代码,移到钩子函数

img

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/327534.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于ssm的学籍管理系统论文

摘 要 当下,如果还依然使用纸质文档来记录并且管理相关信息,可能会出现很多问题,比如原始文件的丢失,因为采用纸质文档,很容易受潮或者怕火,不容易备份,需要花费大量的人员和资金来管理用纸质文…

༺༽༾ཊ—设计-七个-05-原则-模式—ཏ༿༼༻

第五原则:里氏替换原则 所有基类出现的地方必定能被子类替换,且功能不发生影响 例子:构造函数中参数基类出现的地方 在主类中可以被子类替换,且不改变功能 我们在编写代码时要带有里氏替换原则的思想编写,考虑子类在继…

JVM工作原理与实战(十七):运行时数据区-栈内存溢出

专栏导航 JVM工作原理与实战 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、Java虚拟机栈 二、栈内存溢出 1.栈内存溢出介绍 2.设置虚拟机栈的大小 总结 前言 ​JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存&…

【计算机网络】内容整理

概述 分组交换 分组交换则采用存储转发(整个包必须到达路由器,然后才能在下一个链路上传输)技术。 在发送端,先把较长的报文划分成较短的、固定长度的数据段。 电路交换 在端系统间通信会话期间,预留了端系统间沿路径通信所需…

基于JavaWeb+BS架构+SpringBoot+Vue智慧党建系统设计与实现

基于JavaWebBS架构SpringBootVue智慧党建系统设计与实现 文末获取源码Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 文末获取源码 Lun文目录 1 概 述 1 1.1 课题研究背景 1 1.2 课题研究意义 1 1.3 课题研究内容 2 2 系统开…

推荐三个非常好用的视频转文字工具

在处理视频文件时,有时我们需要将视频中的语音内容转换为文字形式,以便于整理、编辑或搜索。传统的视频转文字方法往往需要耗费大量时间和人力,而且准确度难以保证。现在,有了水印云等视频转文字神器,我们可以快速、准…

“一种1,4丁炔二醇纯化除铜装置”的实用新型专利

1,4-丁炔二醇是一种多用途有机化合物,在溶剂、增塑剂及各类合成中间体制造中扮演着不可或缺的角色。工业上主要通过Reppe法制备,即在丁炔铜或铜铋催化剂作用下,乙炔与甲醛在高压(1至20 bar)高温(约110至112℃)环境下发生反应。然而铜离子作为…

Java零基础——Vue基础篇

1.【熟悉】Vue简介 1.1 简介 它是一个构建用户界面单页面的框架 Vue是一个前端框架 https://www.pmdaniu.com/#file UI网站 UI 一般开发者使用蓝湖 工具 看着UI图 写接口 https://lanhuapp.com/web/#/item 是一个轻量级的MVVM(Model-View-ViewModel&#xff…

Springboot+vue课程管理系统(前后端分类)

该项目完全免费 课程管理系统,前后端分离界面美观 💎 使用流行技术栈 Vue ElementUI SpringBoot ,可做学习、毕设使用 技术栈: jdk1.8 springboot vue mysql5.5 前端 Vue.js ElementUI axios 后端 SpringBoot 持久层 : Mybat…

【目标检测】评价指标:mAP概念及其计算方法(yolo源码/pycocotools)

本篇文章首先介绍目标检测任务中的关键评价指标mAP的概念;然后介绍其在yolo源码和pycocotools工具中的实现方法;最后比较两种mAP的计算方法的不同之处。 目标检测中的评价指标: mAP概念及其计算方法(yolo源码/pycocotools) 混淆矩阵概念及其…

SpringMVC零基础入门 - 概述、入门搭建、PostMan的使用(常见数据类型的传输)、REST风格编程

SpringMVC零基础入门 - 概述、入门搭建、PostMan的使用(常见数据类型的传输)、REST风格编程 SpringMVC是隶属于Spring框架的一部分,主要是用来进行Web开发,是对Servlet进行了封装SpringMVC是处于Web层的框架,所以其主要的作用就是用来接收前…

正则表达式和爬虫

目录 一、正则表达式: 作用: 字符类(只匹配一个字符) 细节 预定义字符字符(只匹配一个字符) 细节 数量词 二、爬虫 Pattern Matcher 要点说明 一、正则表达式: 作用: 1、校验字符…

TRB 2024论文分享:基于生成对抗网络和Transformer模型的交通事件检测混合模型

TRB(Transportation Research Board,美国交通研究委员会,简称TRB)会议是交通研究领域知名度最高学术会议之一,近年来的参会人数已经超过了2万名,是参与人数和国家最多的学术盛会。TRB会议几乎涵盖了交通领域…

Linux基础工具的使用(yum,vim,gcc,g++,gdb,make/makefile)【详解】

目录 linux软件包管理器-yum什么是软件包?查找软件包如何安装软件卸载软件 linux编辑器 - vimvim的基本概念vim模式之间的切换vim命令模式各命令汇总vim底行模式各命令汇总 Linux编译器 - gcc/ggcc/g的作用gcc/g选项预处理编译汇编链接静态库与动态库 Linux调试器 -…

Kafka生产消费流程

Kafka生产消费流程 1.Kafka一条消息发送和消费的流程图(非集群) 2.三种发送方式 准备工作 创建maven工程&#xff0c;引入依赖 <dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-clients</artifactId><version>3.3.1…

IPv6过渡技术---手动隧道

IPv6隧道 隧道(Tunnel)是一种封装技术。利用一种网络协议来传输另一种网络协议,即利用一种网络传输协议,将其他协议产生的数据报文封装在自身的报文中,然后在网络中传输。 隧道是一个虚拟的点对点的连接。一个Tunnel提供了一条使封装的数据报文能够传输的通路,并且在一个…

jmeter--4.参数化的方式

目录 1. 用户定义的变量 2. 用户参数 3. 函数助手 3.1 time获取当前时间 3.2 Random随机数 3.3 随机字符串函数 3.4 字符串变更为大写 4. CSV数据文件设置 5. 接口关联--正则和json等提取 1. 用户定义的变量 线程组->添加->配置元件->用户定义的变量 引用方…

codesys【程序】

FB&#xff1a; 用于实现 PLC【叠】PLC FB功能块&#xff1a; 包含 输入&#xff0c;输出&#xff0c;局部变量&#xff0c;静态变量 用ST语言&#xff0c;方便复制。FUNCTION_BLOCK FB_CAN轴 VAR_INPUT 输入 END_VAR VAR_OUTPUT 输出 END_VAR VAR …

STM32F103标准外设库—— 新建工程与库函数(四)

个人名片&#xff1a; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的在校大学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;V…

SpringBoot 启动优化实践!

背景 公司 SpringBoot 项目在日常开发过程中发现服务启动过程异常缓慢&#xff0c;常常需要 6-7 分钟才能暴露端口&#xff0c;严重降低开发效率。通过 SpringBoot 的 SpringApplicationRunListener 、BeanPostProcessor 原理和源码调试等手段排查发现&#xff0c;在 Bean 扫描…