ESP32高分辨率计时器笔记
尽管FreeRTOS提供了软件计时器,但这些计时器有一些限制:
最大分辨率等于RTOS滴答周期
计时器回调从低优先级任务分派
硬件计时器不受这两个限制,但是通常它们使用起来不太方便。例如,应用组件可能需要定时器事件在将来的特定时间触发,但是硬件定时器仅包含一个用于中断产生的“比较”值。这意味着需要在硬件计时器之上构建一些功能来管理挂起事件列表,以便在发生相应的硬件中断时可以调度这些事件的回调。
esp_timer 一组API提供了一次性的计时器和定期的计时器,微秒级的时间分辨率以及64位范围。
基于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 static void periodic_timer_callback(void* arg);
10 static void oneshot_timer_callback(void* arg);
11
12 static const char* TAG = "example";
13
14 void app_main(void)
15 {
16 /*
17 * 创建两个计时器:
18 * 1.每0.5秒运行的一个周期性计时器,并且打印消息
19 * 2.五秒后执行的一次性计时器,并且每1秒重启计时器
20 */
21
22 //创建周期性计时器
23 const esp_timer_create_args_t periodic_timer_args = {
24 .callback = &periodic_timer_callback,
25 //自定义名称
26 .name = "periodic"
27 };
28
29 esp_timer_handle_t periodic_timer;
30 ESP_ERROR_CHECK(esp_timer_create(&periodic_timer_args, &periodic_timer));
31
32 //创建一次性计时器
33 const esp_timer_create_args_t oneshot_timer_args = {
34 .callback = &oneshot_timer_callback,
35 //指定的参数将会传给计时器回调函数
36 .arg = (void*) periodic_timer,
37 .name = "one-shot"
38 };
39 esp_timer_handle_t oneshot_timer;
40 ESP_ERROR_CHECK(esp_timer_create(&oneshot_timer_args, &oneshot_timer));
41
42 //启动计时器
43 ESP_ERROR_CHECK(esp_timer_start_periodic(periodic_timer, 500000));
44 ESP_ERROR_CHECK(esp_timer_start_once(oneshot_timer, 5000000));
45 ESP_LOGI(TAG, "Started timers, time since boot: %lld us", esp_timer_get_time());
46
47 // 每2秒打印计时器调试信息到控制台
48 for (int i = 0; i < 5; ++i) {
49 ESP_ERROR_CHECK(esp_timer_dump(stdout));
50 usleep(2000000);
51 }
52
53
54 //轻度睡眠中,时间继续保持。轻度睡眠后计时器正确执行
55 ESP_LOGI(TAG, "Entering light sleep for 0.5s, time since boot: %lld us",esp_timer_get_time());
56 ESP_ERROR_CHECK(esp_sleep_enable_timer_wakeup(500000));
57 esp_light_sleep_start();
58 ESP_LOGI(TAG, "Woke up from light sleep, time since boot: %lld us", esp_timer_get_time());
59
60 //让计时器再运行一会
61 usleep(2000000);
62
63 //停止和清除计时器
64 ESP_ERROR_CHECK(esp_timer_stop(periodic_timer));
65 ESP_ERROR_CHECK(esp_timer_delete(periodic_timer));
66 ESP_ERROR_CHECK(esp_timer_delete(oneshot_timer));
67 ESP_LOGI(TAG, "Stopped and deleted timers");
68 }
69
70 //周期性计时器回调函数
71 static void periodic_timer_callback(void* arg)
72 {
73 int64_t time_since_boot = esp_timer_get_time();
74 ESP_LOGI(TAG, "Periodic timer called, time since boot: %lld us", time_since_boot);
75 }
76
77 //一次性计时器回调函数
78 static void oneshot_timer_callback(void* arg)
79 {
80 int64_t time_since_boot = esp_timer_get_time();
81 ESP_LOGI(TAG, "One-shot timer called, time since boot: %lld us", time_since_boot);
82 esp_timer_handle_t periodic_timer_handle = (esp_timer_handle_t) arg;
83 //启动运行的计时器,首先需要先停止它
84 ESP_ERROR_CHECK(esp_timer_stop(periodic_timer_handle));
85 ESP_ERROR_CHECK(esp_timer_start_periodic(periodic_timer_handle, 1000000));
86 time_since_boot = esp_timer_get_time();
87 ESP_LOGI(TAG, "Restarted periodic timer with 1s period, time since boot: %lld us",time_since_boot);
88 }
原文:https://gitee.com/EspressifSystems/esp-idf/tree/master/examples/system/esp_timer
ESP32高分辨率计时器笔记的更多相关文章
- 在Vue中使用计时器笔记
在Vue中使用了计时器,一定要记得在生命周期destroyed()里清掉,不然第二次进入这个组件,会出现很大的问题 destroyed () { // (很重要)当跳转到其他页面的时候,要在生命周期的 ...
- ESP32存储blog笔记
基于ESP-IDF4.1 1 #include <stdio.h> 2 #include "freertos/FreeRTOS.h" 3 #include " ...
- 引擎之旅 Chapter.1 高分辨率时钟
目录 游戏中的时间线 真实时间线 游戏时间线 全局时钟的实现方式 我们如何理解时间.在现实生活中,时间就是一个有方向的直线.从一个无穷远到另一个无穷远.用数学去抽象地思考,它就是一个从无穷小到无穷大的 ...
- C#图解教程 第二十章 异步编程
笔记 异步编程 什么是异步 示例 async/await特性的结构什么是异步方法 异步方法的控制流await表达式取消一个异步操作异常处理和await表达式在调用方法中同步地等待任务在异步方法中异步地 ...
- 游戏引擎架构 && windows 核心编程
欲想正人,必先正己. 静坐当思己过,闲谈莫论人非. 垂直同步的作用: 为避免画面撕裂,许多渲染引擎会在交换缓冲区之前,等待显示器的垂直区间消隐,即电子枪重归屏幕上角的时间. 高分辨率计时器的时间漂移 ...
- MPI编程指南
MPI编程指南 一. MPI概述 1.1 MPI的发展史 MPI标准化涉及到大约60个国家的人们,他们主要来自于美国和欧洲的40个组织,这包括并行计算机的多数主要生产商,还有来自大学.政府实 ...
- 游戏引擎架构 (Jason Gregory 著)
第一部分 基础 第1章 导论 (已看) 第2章 专业工具 (已看) 第3章 游戏软件工程基础 (已看) 第4章 游戏所需的三维数学 (已看) 第二部分 低阶引擎系统 第5章 游戏支持系统 (已看) 第 ...
- Netem参数说明
Netem参数说明 本文主要内容来自Linux基金会Wiki网站Netem文档,点击这里访问原文 netem通过模拟广域网的特性为测试协议提供网络仿真功能.当前版本模拟可变延迟,丢失,重复和重新排序. ...
- 【大前端攻城狮之路·二】Javascript&QA⼯程师
今天给大家分享的主题的是Javascript&QA⼯程师.看到这个主题,可能有人问:前端开发完就OK了,剩下的丢给测试就行,哪里还需要关心这些?但事实上呢,测试是前端开发非常重要的环节,也是迈 ...
随机推荐
- HDFS的小文件问题
HDFS 中任何一个文件,目录或者数据块在 NameNode 节点内存中均以一个对象形式表示(元数据),而这受到 NameNode 物理内存容量的限制.每个元数据对象约占 150 byte,所以如果有 ...
- 【Azure 事件中心】为应用程序网关(Application Gateway with WAF) 配置诊断日志,发送到事件中心
问题描述 在Application Gateway中,开启WAF(Web application firewall)后,现在需要把访问的日志输出到第三方分析代码中进行分析,如何来获取WAF的诊断日志呢 ...
- 三:.net core(.NET 6)给swagger添加文档注释详细步骤
提供swagger文档注释. 0.先给api加上标题注释和返回值注释: 然后,启动见证奇迹: What the hell?没得注释?查看当前自动生成的swagger代码如下: 首先,我们需要对需要注释 ...
- 「 洛谷 」P2151 [SDOI2009]HH去散步
小兔的话 欢迎大家在评论区留言哦~ HH去散步 题目限制 内存限制:125.00MB 时间限制:1.00s 标准输入 标准输出 题目知识点 动态规划 \(dp\) 矩阵 矩阵乘法 矩阵加速 矩阵快速幂 ...
- ONNX MLIR方法
ONNX MLIR方法 MLIR中的开放式神经网络交换实现. Prerequisites gcc >= 6.4 libprotoc >= 3.11.0 cmake >= 3.15.4 ...
- halcon——缺陷检测常用方法总结(频域空间域结合)
摘要 缺陷检测是视觉需求中难度最大一类需求,主要是其稳定性和精度的保证.首先常见缺陷:凹凸.污点瑕疵.划痕.裂缝.探伤等. 缺陷检测算法不同于尺寸.二维码.OCR等算法.后者应用场景比较单一,基本都是 ...
- redis 系列,这里转发别人博客, 和常用命令
https://blog.csdn.net/qq_35433716/category_7944890.html 常用命令: https://www.cnblogs.com/mznsndy/p/1395 ...
- JVM Ecosystem Report 2020 (2020年JVM生态系统报告)
本文翻译自SNYK于2020年发布的< JVM Ecosystem Report 2020 >,全文使用机器翻译自动生成,人为将翻译的离谱和翻译明显错误的地方修正到勉强能看懂的程度. 英语 ...
- parted(分区工具)
要支持大容量(18EB),需改用 gpt 分区模式可以有128个主分区 [root@server0 /]# lsblk [root@server0 /]# parted /dev/vdb (part ...
- 『动善时』JMeter基础 — 47、JMeter的HTTP代理服务器详细介绍
目录 1.HTTP代理服务器的添加 2.HTTP代理服务器界面详解 (1)State:状态 (2)Global Settings:全局设置 (3)Test Plan Creation:测试计划创建 ( ...