ESP32-性能监控笔记
基于ESP-IDF4.1
1 #include <stdio.h>
2 #include <string.h>
3 #include <unistd.h>
4 #include "esp_timer.h"
5 #include "esp_log.h"
6 #include "esp_sleep.h"
7 #include "sdkconfig.h"
8
9 #include "perfmon.h"
10
11 static const char* TAG = "example";
12
13 static void exec_test_function(void *params)
14 {
15 for (int i = 0 ; i < 100 ; i++) {
16 __asm__ __volatile__(" nop");
17 }
18 }
19
20 //具有专用性能计数器的表
21 static uint32_t pm_check_table[] = {
22 XTPERF_CNT_CYCLES, XTPERF_MASK_CYCLES, // 周期合计
23 XTPERF_CNT_INSN, XTPERF_MASK_INSN_ALL, // 指令合计
24 XTPERF_CNT_D_LOAD_U1, XTPERF_MASK_D_LOAD_LOCAL_MEM, // 内存读取
25 XTPERF_CNT_D_STORE_U1, XTPERF_MASK_D_STORE_LOCAL_MEM, // 内存写入
26 XTPERF_CNT_BUBBLES, XTPERF_MASK_BUBBLES_ALL &(~XTPERF_MASK_BUBBLES_R_HOLD_REG_DEP), // 等待其他原因
27 XTPERF_CNT_BUBBLES, XTPERF_MASK_BUBBLES_R_HOLD_REG_DEP, // 等待寄存器依赖
28 XTPERF_CNT_OVERFLOW, XTPERF_MASK_OVERFLOW, // 最后一个测试周期
29 };
30
31 #define TOTAL_CALL_AMOUNT 200
32 #define PERFMON_TRACELEVEL -1 // -1 - 忽略跟踪级别
33
34 void app_main(void)
35 {
36 ESP_LOGI(TAG, "Start");
37 ESP_LOGI(TAG, "Start test with printing all available statistic");
38 xtensa_perfmon_config_t pm_config = {};
39 pm_config.counters_size = sizeof(xtensa_perfmon_select_mask_all) / sizeof(uint32_t) / 2;
40 pm_config.select_mask = xtensa_perfmon_select_mask_all;
41 pm_config.repeat_count = TOTAL_CALL_AMOUNT;
42 pm_config.max_deviation = 1;
43 pm_config.call_function = exec_test_function;
44 pm_config.callback = xtensa_perfmon_view_cb;
45 pm_config.callback_params = stdout;
46 pm_config.tracelevel = PERFMON_TRACELEVEL;
47 xtensa_perfmon_exec(&pm_config);
48
49 ESP_LOGI(TAG, "Start test with user defined statistic");
50 pm_config.counters_size = sizeof(pm_check_table) / sizeof(uint32_t) / 2;
51 pm_config.select_mask = pm_check_table;
52 pm_config.repeat_count = TOTAL_CALL_AMOUNT;
53 pm_config.max_deviation = 1;
54 pm_config.call_function = exec_test_function;
55 pm_config.callback = xtensa_perfmon_view_cb;
56 pm_config.callback_params = stdout;
57 pm_config.tracelevel = PERFMON_TRACELEVEL;
58
59 xtensa_perfmon_exec(&pm_config);
60
61 ESP_LOGI(TAG, "The End");
62 }
原文:https://gitee.com/EspressifSystems/esp-idf/tree/master/examples/system/perfmon
ESP32-性能监控笔记的更多相关文章
- 分布式监控系统Zabbix3.4-针对MongoDB性能监控操作笔记
公司在IDC机房的一台服务器上部署了MongoDB,由于所存储的业务数据比较重要,所以对MongoDB的监控显得尤为重要!Zabbix监控MongoDB性能的原理:通过echo "db.se ...
- jmeter使用笔记——脚本录制,JMeter使用plugins插件进行服务器性能监控
脚本录制: 1.badboy录制 2.代理服务器录制 ①工作台添加HTTP代理服务器 ②设置目标控制器,分组,排除模式,包含模式(使用正则表达式筛选) ③设置浏览器,手动设置代理服务器,localho ...
- 对SQLSERVER进行性能监控
对SQLSERVER进行性能监控 在上一篇文章<SQLSERVER性能监控级别步骤>里说到性能监控的步骤中有一步涉及到建立性能基线,但是没有说到有哪些计数器 可以用来进行监控的,这篇文章结 ...
- <JVM下篇:性能监控与调优篇>补充:使用OQL语言查询对象信息
笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.cs ...
- <JVM下篇:性能监控与调优篇>补充:浅堆深堆与内存泄露
笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.cs ...
- <JVM下篇:性能监控与调优篇>03-JVM监控及诊断工具-GUI篇
笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.cs ...
- <JVM下篇:性能监控与调优篇>01-概述篇-02-JVM监控及诊断工具-命令行篇
笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.cs ...
- 《深入理解Java虚拟机》虚拟机性能监控与故障处理工具
上节学习回顾 从课本章节划分,<垃圾收集器>和<内存分配策略>这两篇随笔同属一章节,主要是从理论+实验的手段来讲解JVM的内存处理机制.好让我们对JVM运行机制有一个良好的概念 ...
- jvm系列(五):tomcat性能调优和性能监控(visualvm)
tomcat服务器优化 1.JDK内存优化 根据服务器物理内容情况配置相关参数优化tomcat性能.当应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出,并且导致应用服务崩溃.因此一般建议堆的最 ...
- spring拦截器 实现应用之性能监控
package cn.ximi.erp.web.common.interceptors; import cn.ximi.core.common.utils.string.StringUtil; imp ...
随机推荐
- Django中数据库操作相关的错误
问题:字段修改属性发生错误 1> >python manage.py makemigrations You are trying to add a non-nullable field ' ...
- 并发编程-Condition
Condition 一个Lock中应该绑定一个Condition对象.Condition是Java提供用来实现等待/通知的类. 我们知道Object对象提供了wait.waitAll.notify.n ...
- LeetCode---105. 从前序与中序遍历序列构造二叉树 (Medium)
题目:105. 从前序与中序遍历序列构造二叉树 根据一棵树的前序遍历与中序遍历构造二叉树. 注意: 你可以假设树中没有重复的元素. 例如,给出 前序遍历 preorder = [3,9,20,15,7 ...
- git介绍及使用
一.架构 版本库(仓库):工作区中有一个隐藏目录.git,这个目录不属于工作区,而是git的版本库,是git管理的所有内容. 暂存区:版本库中包含一个临时区域,保存下一步要提交的文件. 分支:版本库中 ...
- mybatis学习——类型别名(typeAliases)
为什么要用类型别名? 答:类型别名可为 Java 类型设置一个缩写名字. 它仅用于 XML 配置,意在降低冗余的全限定类名书写. 举个例子说明: 在我们编写映射文件的时候: <?xml vers ...
- Netty 框架学习 —— ChannelHandler 与 ChannelPipeline
ChannelHandler 1. Channel 生命周期 Channel 的生命周期状态如下: 状态 描述 ChannelUnregistered Channel 已经被创建,但还未注册到 Eve ...
- 三、使用sudo分配管理权限
使用sudo分配管理权限 su命令 su - [账户名称] :切换到用户,不加用户名默认切换到root su - [账户名称] -c '命令' :以xx用户身份执行命令,注意命令需 ...
- 使用sign签名发送请求
import CryptoJS from "crypto-js"; import urlencode from "urlencode"; methods:{ a ...
- Golang学习(用代码来学习) - 第一篇
package main import ( "fmt" "time" "unsafe" ) //示例代码 var isActive bool ...
- Pytest学习笔记5-conftest.py的用法
前言 在之前介绍fixture的文章中,我们使用到了conftest.py文件,那么conftest.py文件到底该如何使用呢,下面我们就来详细了解一下conftest.py文件的特点和使用方法吧 什 ...