ESP32 定时器和消息队列

简介

本章涉及知识点:ESP32通用定时器、日志输出,FreeRTOS消息队列。

实现功能:使用ESP32通用定时器实现每1S打印输出日志以及每1Min打印输出日志。

ESP-IDF版本:V5.1.2

源码

DesktopScreen 6 Timer&消息队列小智学长的源码:DesktopScreen 6 Timer&消息队列

 程序实现

首先,初始化通用定时器,这里注意,在设置警报动作的结构体中要开启重加载功能,否则定时器只能完成1次警报,不能重复。

代码实现如下,主要步骤为:

1.创建定时器

2.注册回调函数

3.定时器使能

4.设置警报动作

5.启动定时器

static void gptimer_init(void)
{//创建定时器gptimer_handle_t gptimer = NULL;gptimer_config_t timer_config = {.clk_src = GPTIMER_CLK_SRC_DEFAULT,.direction = GPTIMER_COUNT_UP,.resolution_hz = 1000000, // 1MHz, 1 tick=1us};ESP_ERROR_CHECK(gptimer_new_timer(&timer_config, &gptimer));//注册回调函数gptimer_event_callbacks_t cbs = {.on_alarm = example_timer_on_alarm_cb_v1,};//指定定时器句柄,要引起的回调函数,要向回调函数传递的值ESP_ERROR_CHECK(gptimer_register_event_callbacks(gptimer, &cbs, timer_queue));//定时器使能ESP_ERROR_CHECK(gptimer_enable(gptimer));//设置警报动作gptimer_alarm_config_t alarm_config1 = {.alarm_count = 10000, // period = 10ms.flags.auto_reload_on_alarm = true, //重加载};ESP_ERROR_CHECK(gptimer_set_alarm_action(gptimer, &alarm_config1));//启动定时器ESP_ERROR_CHECK(gptimer_start(gptimer));
}

定义中断回调事件,通过中断回调函数向timer_queue队列中传值

//中断回调事件
static bool IRAM_ATTR example_timer_on_alarm_cb_v1(gptimer_handle_t timer, const gptimer_alarm_event_data_t *edata, void *user_data)
{BaseType_t high_task_awoken = pdFALSE;//定义结构体事件变量timer_event_t evt={};//向timer_queue队列传参,参数类型为timer_event_t结构体xQueueSendFromISR(timer_queue, &evt, &high_task_awoken);return (high_task_awoken == pdTRUE);
}

定义中断函数处理任务,从队列中接收数据。

static void timer_example_evt_task(void)
{while (1) {timer_event_t evt;xQueueReceive(timer_queue, &evt, portMAX_DELAY);g_timer_event.timer_minute_count ++;//60s 计算一次 刷新时间if(g_timer_event.timer_minute_count >= 6000){g_timer_event.timer_minute_count = 0;ESP_LOGI(TAG,"1Min is run");}g_timer_event.timer_second_count ++;//1s计算一次 if(g_timer_event.timer_second_count >= 100){g_timer_event.timer_second_count = 0;ESP_LOGI(TAG,"1S is run");}}
}

最后,创建任务实现功能。

void ds_timer_init(void)
{g_timer_event.timer_minute_count = 0;   //分钟计数g_timer_event.timer_second_count = 0;   //秒钟计数timer_queue = xQueueCreate(10, sizeof(timer_event_t));  gptimer_init();xTaskCreate(timer_example_evt_task, "timer_evt_task", 2048, NULL, 1, NULL);ESP_LOGI(TAG,"TASK创建成功");
}

 项目代码

基于5.1.2的定时器和队列项目源码

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

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

相关文章

2023年度AI盘点 AIGC|AGI|ChatGPT|人工智能大模型

前言 「作者主页」:雪碧有白泡泡 「个人网站」:雪碧的个人网站 2023年是人工智能大语言模型大爆发的一年,一些概念和英文缩写也在这一年里集中出现,很容易混淆,甚至把人搞懵。 文章目录 前言01 《ChatGPT 驱动软件开…

使用一个定时器(timer_fd)管理多个定时事件

使用一个定时器(timer_fd)管理多个定时事件 使用 timerfd_xxx 系列函数可以很方便的与 select、poll、epoll 等IO复用函数相结合,实现基于事件的定时器功能。大体上有两种实现思路: 为每个定时事件创建一个 timer_fd,绑定对应的定时回调函数…

QEMU源码全解析41 —— Machine(11)

接前一篇文章:QEMU源码全解析40 —— Machine(10) 本文内容参考: 《趣谈Linux操作系统》 —— 刘超,极客时间 《QEMU/KVM》源码解析与应用 —— 李强,机械工业出版社 特此致谢! 时间过去了几…

go语言(二十一)---- channel的关闭

channel不像文件一样需要经常去关闭,只有当你确实没有任何发送数据了,或者你想显示的结束range循环之类的,才去关闭channel。关闭channel后,无法向channel再发送数据,(引发pannic错误后,导致接收…

Linux编译实时内核和打补丁

目录 1.Linux内核2.实时内核3.编译实时内核3.1 准备3.2 获取内核源码3.3 编译3.4 设置GRUB确保启动到实时内核 4.给内核打补丁5.安装新的内核 1.Linux内核 https://github.com/torvalds/linux Linux内核是Linux操作系统的核心部分,它是操作系统的基本组成部分&…

Python在网络安全防御中的应用与实践

在网络安全防御的实践中,我们通常需要进行网络监控、数据分析和入侵检测等任务。编程语言是实现这些功能不可或缺的工具,而Python以其简洁的语法和强大的库支持,在网络安全领域得到了广泛应用。 一、网络监控:使用Python检测端口…

spring整合mybatis的底层原理

spring整合mybatis的底层原理 原理: FactoryBean的自定义对象jdk动态代理Mapper接口对象 一、手写一个spring集成mybatis 目录结构: 1.1 入口类 public class Test {public static void main(String[] args) {AnnotationConfigApplicationContext co…

Linux中的软链接与硬链接

Linux链接概念 Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link)。默认情况下,使用 ln 命令不加参数创建硬链接,加 -s 参数则创建软链接 硬链接…

【mongoDB】创建用户账号和权限

使用use database_name 命令创建或切换到一个数据库 查看用户 show users 输入该命令后,无数据表示该数据库没有用户 创建用户 user:" freedom " 表示用户名为freedom pwd:" 123456 ” 表示密码为123456 roles:[" root "] …

一键去除图片背景——background-removal-js

一些JavaScript库和工具可以帮助实现背景去除: OpenCV.js:OpenCV的JavaScript版本,提供了许多计算机视觉功能,包括背景去除。Jimp:一个用于处理图像的JavaScript库,提供了许多图像处理功能,包括…

Linux的几个常用基本指令2

目录 1.more指令2.less指令3.head指令4.tail指令5.时间相关的指令5.1在显示方面,使用者可以设定欲显示的格式,格式设定为一个加号后接数个标记,其中常用的标记列表如下5.2在设定时间方面5.3时间戳 6.Cal指令7.find指令8.grep指令9.zip/unzip指…

Deepin基本环境查看(六)【计算机、回收站、控制面板、文档、设备管理器】

Deepin基本环境查看 - 目录Deepin基本环境查看(一)【基本信息】Deepin基本环境查看(二)【内存】Deepin基本环境查看(三)【网络信息】Deepin基本环境查看(四)【硬盘/分区、文件系统、…

Redis:Could not get a resource from the pool

起初在JedisPool中配置了50个活动连接,但是程序还是经常报错:Could not get a resource from the pool,附代码 >> JedisPoolConfig config new JedisPoolConfig(); config.setMaxTotal(50); config.setMaxIdle(20); config.setMaxWai…

鸿蒙ArkUI 宫格+列表+HttpAPI实现

鸿蒙ArkUI学习实现一个轮播图、一个九宫格、一个图文列表。然后请求第三方HTTPAPI加载数据,使用了axios鸿蒙扩展库来实现第三方API数据加载并动态显示数据。 import {navigateTo } from ../common/Pageimport axios, {AxiosResponse } from ohos/axiosinterface IDa…

第5章 (python深度学习——波斯美女)

第5章 深度学习用于计算机视觉 本章包括以下内容: 理解卷积神经网络(convnet) 使用数据增强来降低过拟合 使用预训练的卷积神经网络进行特征提取 微调预训练的卷积神经网络 将卷积神经网络学到的内容及其如何做出分类决策可视化 本章将…

Android 性能优化总结:包体积优化

前言 随着开发不断迭代,App体积越来越大,包大小的增大也会给我们应用带来其他的影响 比如 下载率影响 过大的包体积会影响下载转化率,根据Google Play Store包体积和转化率分析报告显示,平均每增加1M,转化率下降0.2%左…

基于Java SSM框架实现大学生综合素质评分平台项目【项目源码+论文说明】

基于java的SSM框架实现大学生综合素质评分平台演示 摘要 21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐渐被人们所…

C#调用SqlSugar操作达梦数据库报错“无效的表或视图名”

安装达梦数据库后,使用SqlSugar连接测试数据库并基于DBFirst方式创建数据库表对应的类,主要代码如下: SqlSugarClient db new SqlSugarClient(new ConnectionConfig(){DbType DbType.Dm,ConnectionString "Serverlocalhost; User Id…

【ArcGIS模型构建器】07:批量将多个xy坐标(Excel、txt、csv)转为点shp图层

不需要写Python批处理代码,本讲利用模型构建器,批量将xy坐标(Excel、txt、csv)转为点shp图层。 文章目录 一、问题分析二、解决办法三、模型构建1. 新建模型2. 添加文件夹3. 添加表迭代器4. 创建XY事件图层5. 复制要素6. 运行模型四、注意事项一、问题分析 现有多个excel、t…

qemu单步调试arm64 linux kernel

一、背景和目的 qemu搭建arm64 linux kernel环境-CSDN博客 之前介绍了qemu启动kernel的配置步骤和方法,现在开始我们的调试,这篇文章主要讲解如何单步调试内核,所有的实验还是基于ARM64; 二、环境准备 需要准备hostx86 target…