ESP32系统监测(基于ESP-IDF)

主要参考资料:
CSDN文章《ESP32 IDF开发调试奇技淫巧》: https://blog.csdn.net/qq_43332314/article/details/131859971

目录

  • 查询系统剩余堆/最小堆大小
  • 查询线程剩余栈大小
    • 方法一
    • 方法二
  • 查询CPU占用率

查询系统剩余堆/最小堆大小

查询系统剩余堆、最小堆大小的 API 位于 esp_system 组件中。剩余堆大小过小,会导致 malloc 申请内存失败,当剩余堆不够时,很多网络操作均会失败,这是由于网路操作内部涉及很多 malloc 操作。
(1)查询系统剩余堆大小,返回值为 Byte

uint32_t esp_get_free_heap_size( void );

(2)查询系统最小堆大小,返回值为 Byte

uint32_t esp_get_minimun_free_heap_size(void);

示例:

while (1) {remain_heap = esp_get_free_heap_size() / 1024;ESP_LOGW(TAG, "Remaining heap tight:%lu k", remain_heap);vTaskDeley(300);
}

查询线程剩余栈大小

方法一

由于ESP32 IDF采用FreeRTOS,因此查询线程所使用的栈大小空间,可通过FreeRTOS API实现,函数原型如下:

UBaseType_t uxTaskGetStackHighWaterMark( TaskHandle_t xTask );

返回值为线程栈使用的高水位线,所谓高水位线也即自任务开始运行以来,任务所使用的栈最大时所剩余的栈大小。因此此值越大,代表线程峰值栈剩余量越大。

示例:

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"void task_function(void *pvParameter) {int stack_left = 0;stack_left = uxTaskGetStackHighWaterMark(NULL);printf("Stack left: %d bytes\n", stack_left);while (1) {char c[1000] = {0};stack_left = uxTaskGetStackHighWaterMark(NULL);printf("Stack left: %d bytes\n", stack_left);vTaskDelay(100);}// 线程结束vTaskDelete(NULL);
}int app_main(void)
{xTaskCreate(task_function, "task", 4096, NULL, 1, NULL);vTaskDelete(NULL);
}

方法二

使用 vTaskList() 查看,函数原型

void vTaskList( char * pcWriteBuffer );

使用此函数需先配置 menuconfig 打开部分功能:

idf menuconfig → Component config → FreeRTOS → kernel→Enable FreeRTOS trace facility
idf menuconfig → Component config → FreeRTOS → kernel→Enable FreeRTOS trace facility → Enable FreeRTOS stats formatting functions
idf menuconfig → Component config → FreeRTOS → kernel→Enable FreeRTOS trace facility → Enable display of xCoreID in vTaskList
在这里插入图片描述
示例:

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include <string.h>void task_function(void *pvParameter) {uint8_t CPU_RunInfo[400];while (1) {memset(CPU_RunInfo, 0, 400);vTaskList((char *)&CPU_RunInfo);printf("----------------------------------------------------\r\n");printf("task_name   status   priority   stack   num   core\r\n");printf("%s", CPU_RunInfo);printf("----------------------------------------------------\r\n");vTaskDelay(500 / portTICK_PERIOD_MS);}
}int app_main(void)
{xTaskCreate(task_function, "task", 4096, NULL, 1, NULL);vTaskDelete(NULL);
}

在这里插入图片描述
第一列,任务名称
第二列,任务状态
X: running
B: blocked
R: ready
D: deleted
S: suspended
第三列,任务优先级
数值越大,优先级越高
第四列,任务栈
数值越大,代表剩余的任务栈空间越大,单位Byte
注意此值为当前剩余栈大小,而不是峰值剩余栈大小
第五列,任务号
代表任务创建顺序
第六列,任务内核

查询CPU占用率

esp32 idf查询任务 CPU 占用率,依旧可以通过FreeRTOS的任务统计功能来实现,函数原型如下:

void vTaskGetRunTimeStats( char * pcWriteBuffer );

配置menuconfig 打开:

idf.py menuconfig → Component config → FreeRTOS → Kernel → configGENERATE_RUN_TIME_STATS
在这里插入图片描述

示例:

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include <string.h>void task_function(void *pvParameter) {uint8_t CPU_RunInfo[400];while (1) {memset(CPU_RunInfo, 0, 400);vTaskGetRunTimeStats((char *)&CPU_RunInfo);printf("task_name      run_cnt                 usage_rate   \r\n");printf("%s", CPU_RunInfo);printf("----------------------------------------------------\r\n");vTaskDelay(500 / portTICK_PERIOD_MS);}
}int app_main(void)
{xTaskCreate(task_function, "task", 4096, NULL, 1, NULL);vTaskDelete(NULL);
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32F407+光敏模块采集数据

一、光敏传感器简介 光敏传感器是利用光敏元件将光信号转换为电信号的传感器&#xff0c;它的敏感波长在可见光波长附近&#xff0c;包括红外线波长和紫外线波长。光传感器不只局限于对光的探测&#xff0c;它还可以作为探测元件组成其他传感器&#xff0c;对许多非电量进行检测…

ChatGPT-4 Turbo 今天开放啦!附如何查询GPT-4 是否为 Turbo

2024年4月12日&#xff0c;OpenAI在X上宣布GPT-4 Turbo开放了&#xff01;提高了写作、数学、逻辑推理和编码方面的能力。另外最重要的是&#xff0c;响应速度更快了&#xff01;&#xff01; ChatGPT4 Turbo 如何升级&#xff1f;解决国内无法升级GPT4 Turbo的问题&#xff0…

软考高级架构师:图论应用-最短路径

一、AI 讲解 图论是数学的一个分支&#xff0c;主要研究图的性质。在图论中&#xff0c;最短路径问题是一个经典问题&#xff0c;它旨在找到图中两个顶点之间的最短路径长度。这个问题在很多实际应用中都非常重要&#xff0c;比如在网络路由、社交网络分析、城市交通规划等领域…

Dubbo(从入门到掌握)看完这一篇就够了

文章目录 一、 Dubbo概述1.Dubbo概念2.Dubbo架构3.Dubbo快速入门 二、springboot项目整合dubbo1.创建生产者服务&#xff08;1&#xff09;项目路径总览&#xff08;2&#xff09;添加项目依赖&#xff08;3&#xff09;创建UserService接口&#xff0c;并创建sayHello方法&…

Spring Boot统一功能处理(一)

本篇主要介绍Spring Boot的统一功能处理中的拦截器。 目录 一、拦截器的基本使用 二、拦截器实操 三、浅尝源码 初始化DispatcherServerlet 处理请求&#xff08;doDispatch) 四、适配器模式 一、拦截器的基本使用 在一般的学校或者社区门口&#xff0c;通常会安排几个…

【Golang学习笔记】从零开始搭建一个Web框架(三)

文章目录 分组控制分组嵌套中间件 前情提示&#xff1a; 【Golang学习笔记】从零开始搭建一个Web框架&#xff08;一&#xff09;-CSDN博客 【Golang学习笔记】从零开始搭建一个Web框架&#xff08;二&#xff09;-CSDN博客 分组控制 分组控制(Group Control)是 Web 框架应提供…

粒子群优化算法PSO与鹈鹕优化算法(POA)求解无人机三维路径规划(MATLAB代码)

一、无人机路径规划模型介绍 二、算法介绍 close all clear clc dbstop if all error warning (off) global model model CreateModel(); % 创建模型 FF1; [Xmin,Xmax,dim,fobj] fun_info(F);%获取函数信息 pop100;%种群大小(可以自己修改) maxgen100;%最大迭代次数(可以自己…

JVM虚拟机(三)垃圾回收简介、垃圾回收算法、分代回收、垃圾回收器种类、G1垃圾回收器

目录 一、什么是垃圾回收&#xff1f;1.1 什么是垃圾回收&#xff1f;1.2 什么对象能被垃圾回收&#xff1f;1&#xff09;引用计数法2&#xff09;可达性分析算法 二、JVM 垃圾回收算法2.1 标记清除算法2.2 标记整理算法&#xff08;标记压缩算法&#xff09;2.3 复制算法2.4 …

如何在Linux部署MeterSphere并实现公网访问进行远程测试工作

文章目录 前言1. 安装MeterSphere2. 本地访问MeterSphere3. 安装 cpolar内网穿透软件4. 配置MeterSphere公网访问地址5. 公网远程访问MeterSphere6. 固定MeterSphere公网地址 前言 MeterSphere 是一站式开源持续测试平台, 涵盖测试跟踪、接口测试、UI 测试和性能测试等功能&am…

「Python」数据分析师需要掌握到什么程度?4条告诉你

前言 最近经常收到小伙伴们的留言&#xff1a;做数据分析要精通Python吗&#xff1f; 今天们就来好好盘一盘这个话题。 0基础想入门的小伙伴&#xff0c;如果你决定学习数据分析&#xff0c;却没有编程经验&#xff0c;那么这篇内容会非常适合你&#xff0c;让你的困惑得以解…

Singleton 单例

意图 保证一类仅有一个实例&#xff0c;并提供一个访问他的全局访问点 结构 其中&#xff1a; Singleton指定一个Instance操作&#xff0c;允许客户访问它的唯一实例&#xff0c;Instance是一个类操作&#xff1b;可能负责创建他自己的唯一实例。 适应性 当类只能有一个实…

【网络安全】WebPack源码(前端源码)泄露 + jsmap文件还原

前言 webpack是一个JavaScript应用程序的静态资源打包器。它构建一个依赖关系图&#xff0c;其中包含应用程序需要的每个模块&#xff0c;然后将所有这些模块打包成一个或多个bundle。大部分Vue等项目应用会使用webpack进行打包&#xff0c;使用webpack打包应用程序会在网站js…