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);
}

在这里插入图片描述

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

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

相关文章

K8s下部署grafana

1. 系统要求 最小化的软硬件要求 最小化硬件要求 磁盘空间: 1 GB内存: 750 MiB (approx 750 MB)CPU: 250m (approx 2.5 cores) 2. k8s部署grafana步骤 1) 创建名字空间 kubectl create namespace my-grafana 2) 创建yaml vim grafana.yaml yaml包含如下三个资源对象 Ob…

AIGC 探究:人工智能生成内容的技术原理、广泛应用、创新应用、版权问题与未来挑战

AIGC&#xff08;Artificial Intelligence Generated Content&#xff09;即人工智能生成内容&#xff0c;其核心在于利用深度学习技术&#xff0c;尤其是基于神经网络的模型&#xff0c;来模拟人类创作过程&#xff0c;自主生成高质量的文本、图像、音频、视频等各类内容。神经…

test4141

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和…

软考高级架构师:随机函数模型

一、AI 讲解 随机函数模型是理解各种随机过程和算法的一个重要概念&#xff0c;在软件工程、算法设计以及系统分析中有着广泛的应用。简而言之&#xff0c;随机函数模型是一种用于描述具有随机性的系统或过程的数学模型&#xff0c;它能够帮助我们预测和分析在不确定性下的系统…

Day18_学点儿设计模式_MVC和三层架构

0 优质文章 MVC与三层架构 什么是MVC&#xff1f;什么是三层架构&#xff1f; 三层架构与MVC详细讲解 MVC三层架构&#xff08;详解&#xff09; 1 MVC MVC全名是Model View Controller&#xff0c;是模型(model)&#xff0d;视图(view)&#xff0d;控制器(controller)的缩写…

01、ArcGIS For JavaScript 4.29对3DTiles数据的支持

综述 Cesium从1.99版本开始支持I3S服务的加载&#xff0c;到目前位置&#xff0c;已经支持I3S的倾斜模型、3D Object模型以及属性查询的支持。Cesium1.115又对I3S标准的Building数据实现了加载支持。而ArcGIS之前一直没有跨越对3DTiles数据的支持&#xff0c;所以在一些开发过…

[附带黑子定制款鸽鸽版素材包]更改文件夹图标,更改系统音效,更改鼠标指针及样式。

更改文件夹图标 1.选择图片在线格式转换网站转换为ico格式 2.右键文件夹选择属性 3.点击自定义&#xff0c;点击更改图标超链接 4.点击预览选择生成的ico文件 5.点击打开&#xff0c;点击确定&#xff0c;点击应用 更改系统音效&#xff08;真爱粉强烈推荐&#xff09; 1…

【七 (4)FineBI FCP模拟试卷-电站数据分析】

目录 文章导航一、字段解释1、电站基础信息表2、电站事实表 二、需求三、操作步骤1、将新增一列日期12、以左关联的形式增加装机容量3、年度发电总量4、年度售电完成率4、发电量及发电效率5、年售电完成比、售电回款比、管理费用比、运维费用比5、总装机容量6、最近日期7、最近…

【PG-1】PostgreSQL体系结构概述

1. PostgreSQL体系结构概述 代码结构 其中&#xff0c;backend是后端核心代码&#xff0c;包括右边的几个dir: access&#xff1a;处理数据访问方法和索引的代码。 bootstrap&#xff1a;数据库初始化相关的代码。 catalog&#xff1a;系统目录&#xff08;如表和索引的元数据…

Golang | Leetcode Golang题解之第27题移除元素

题目&#xff1a; 题解&#xff1a; func removeElement(nums []int, val int) int {left, right : 0, len(nums)for left < right {if nums[left] val {nums[left] nums[right-1]right--} else {left}}return left }

人脸识别业务(基于腾讯人脸识别接口)

使用腾讯云人脸识别接口&#xff0c;基于优图祖母模型。 一、准备工作 人脸识别账号 申请腾讯云服务器账号&#xff0c;生成自己的秘钥。记录秘钥和秘钥ID。 创建人员库 记下人员库id 在配置文件application.yml中添加配置。 plateocr:SecretId: 秘钥IDSecretKey: 秘钥ser…

LeetCode34:在排序数组中查找元素的第一个和最后一个位置(Java)

目录 题目&#xff1a; 题解&#xff1a; 方法一&#xff1a; 方法二&#xff1a; 题目&#xff1a; 给你一个按照非递减顺序排列的整数数组 nums&#xff0c;和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target&…

软考高级架构师:运筹方法(线性规划和动态规划)

一、AI 讲解 运筹学是研究在给定的资源限制下如何进行有效决策的学问。其中&#xff0c;线性规划和动态规划是两种重要的运筹方法&#xff0c;它们在解决资源优化分配、成本最小化、收益最大化等问题上有着广泛的应用。 线性规划 线性规划是一种数学方法&#xff0c;用于在满…

C语言 | Leetcode C语言题解之第27题移除元素

题目&#xff1a; 题解&#xff1a; int removeElement(int* nums, int numsSize, int val) {int left 0, right numsSize;while (left < right) {if (nums[left] val) {nums[left] nums[right - 1];right--;} else {left;}}return left; }

一个巧用委托解决的问题(C#)

个人觉得是委托应用的一个很好的例子&#xff0c;故做一下分享&#xff0c;希望能帮助到您&#xff0c;内容比较简单&#xff0c;大佬可以跳过。我是做桌面医疗软件开发的&#xff0c;前段时间在做一个需求。在签发检验项目医嘱时&#xff0c;调用第三方接口&#xff0c;然后带…

「51媒体网」汽车类媒体有哪些?车展媒体宣传

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 汽车类媒体有很多&#xff0c;具体如下&#xff1a; 汽车之家&#xff1a;提供全面的汽车新闻、评测、导购等内容。 爱卡汽车&#xff1a;同样是一个综合性的汽车信息平台&#xff0c;涵…

安达发|电子行业智能生产排程计划的实施

随着科技的不断发展&#xff0c;电子行业正面临着巨大的变革。在这个过程中&#xff0c;智能生产排程计划的实施成为了提高生产效率、降低成本的关键因素。本文将详细介绍电子行业智能生产排程计划的实施方法、优势以及可能遇到的挑战。 一、实施方法 1. 数据采集与分析&#x…

Java面试篇9——并发编程

并发编程知识梳理 提示&#xff0c;此仅为面试&#xff0c;若想对线程有跟完整了解&#xff0c;请点击这里 提示&#xff1a;直接翻到最后面看面试真题&#xff0c;上面的为详解 面试考点 文档说明 在文档中对所有的面试题都进行了难易程度和出现频率的等级说明 星数越多代表…

共轭梯度法 Conjugate Gradient Method (线性及非线性)

1. 线性共轭梯度法 共轭梯度法&#xff08;英语&#xff1a;Conjugate gradient method&#xff09;&#xff0c;是求解系数矩阵为对称正定矩阵的线性方程组的数值解的方法。 共轭梯度法是一个迭代方法&#xff0c;它适用于 1. 求解线性方程组&#xff0c; 2. 共轭梯度法也可…

TQ15EG开发板教程:在MPSOC上运行ADRV9009(vivado2018.3)

首先需要在github上下载两个文件&#xff0c;本例程用到的文件以及最终文件我都会放在网盘里面&#xff0c; 地址放在最后面。在github搜索hdl选择第一个&#xff0c;如下图所示 GitHub网址&#xff1a;https://github.com/analogdevicesinc/hdl/releases 点击releases选择版…