当前位置: 首页 > news >正文

【ESP32 进阶】非阻塞循环的写法

在ESP32的循环中,为了避免使用 delay(100) 等阻塞循环,经常采用以下三段式的写法:

void loop() {audio.loop(); // 必须频繁调用unsigned long currentMillis = millis();// 使用millis()检查是否到了执行时间,而不是delay()if (currentMillis - previousMillis >= interval) {previousMillis = currentMillis;doSomething(); // 执行你的其他任务}
}

三段分别是:

  • 求当前时间
  • 求上次执行时间和当前时间的间隔(是否超过设定间隔(时间周期))
  • 如果满足,更新上次执行时间为当前时间,并执行任务
  • 回到开头,如此循环....

 

于是就有了疑问:unsigned long currentMillis = millis();这里不会溢出吗?溢出了怎么办?

简短不看的结论

对于绝大多数ESP32应用:

  • 其最大值为49.7天,这样的连续运行已经非常长了

  • 大多数物联网设备会定期重启(OTA更新、看门狗复位、电源波动等)

  • 即使设备真的连续运行了49.7天,我们的代码也能正确处理回绕

 

简短回答: 会越界,但完全不需要担心,因为C/C++的无符号长整型算术特性让它能够完美地处理这个"越界"问题。


详细解释

1. millis() 返回什么?

millis() 返回一个 unsigned long 类型的值,表示从ESP32启动开始经过的毫秒数。

  • unsigned long 的范围是 0 到 4,294,967,295 (即 2³² - 1)

  • 当达到最大值后,它会自动回绕到0,就像汽车里程表从99999回到00000一样

  • 这个回绕周期大约是 49.7天 (4,294,967,295 ÷ 1000 ÷ 60 ÷ 60 ÷ 24 ≈ 49.7天)

2. 为什么我们的代码不怕回绕?

关键在于我们使用的是无符号整数的减法运算,这种运算在发生回绕时仍然能给出正确的时间间隔。

让我们通过一个例子来理解:

假设场景:

  • previousMillis 在接近最大值时被保存

  • 随后发生了回绕,currentMillis 变成了一个很小的值

cpp
unsigned long previousMillis = 4294967290; // 非常接近最大值
unsigned long interval = 1000; // 1秒void loop() {unsigned long currentMillis = millis();// 关键检查:当回绕发生时会发生什么?if (currentMillis - previousMillis >= interval) {// 这个条件会在回绕时正确触发吗?}
}

计算过程:

当 currentMillis 回绕到 10(假设)时:

currentMillis - previousMillis 
= 10 - 4294967290

由于是无符号整数,这个减法会产生一个非常大的正数(实际上是算术上的负数,但被解释为正数):

10 - 4294967290 = (一个很大的正数,具体是 10 + (4294967296 - 4294967290) = 16)

实际上,由于无符号整数的模运算特性:

10 - 4294967290 = 16 (因为 4294967290 + 16 = 4294967306,模 4294967296 = 10)

这个结果(16)显然大于我们的间隔(1000),所以条件判断为真,代码正确执行!

http://www.gsyq.cn/news/42325.html

相关文章:

  • 2025年11月北京房产纠纷律师排名分析:客观评价与实务参考
  • 2025年11月学生平板品牌评测榜:从双师1对1到全科AI精准学横向对比
  • 2025年11月智能学习机品牌对比榜:新课标同步与护眼大屏机型排名
  • 2025年11月学习机品牌推荐榜:AI精准学机型口碑对比评测
  • 2025年11月干皮精华产品精选榜:五款干敏肌适用精华对比
  • 2025年11月学习机品牌推荐:新课标同步榜评测盘点
  • 2025年11月黄褐斑改善产品评价榜:五款临床级单品数据解析
  • 2025年11月适合小学生的学习机推荐榜:五强参数与体验全解析
  • 2025年11月婚礼前美白产品推荐榜:准新娘淡斑评价合集
  • 2025年11月色斑淡化产品推荐榜:五款精华临床数据对比与评价
  • 2025年11月色斑淡化产品推荐榜:临床数据对比五款淡斑精华表现
  • 2025强网拟态 -- CTF方向 -- Crypto
  • 2025.11.7 月考游记 - Amy
  • 每日反思(2025_11_05)
  • CCPC济南站F题目的思考
  • 新学期每日总结(第21天)
  • [AI/LLM] 解读 Qwen 系列大模型
  • Swift 和 Tesseract OCR 解析验证码
  • 牛顿迭代法:用几何直觉理解方程求根
  • What is difference between credit memo and subsequent credit in SAP
  • 题解:AT_abc225_h [ABC225H] Social Distance 2
  • 数学分析A 定理简单整理(部分)
  • 第3章 多线程服务器的适用场合与常用编程模型 - 教程
  • 表相关操作
  • 部分页面统计用户访问时长
  • 单词故事
  • ai学习机哪个品牌好?松鼠 AI 双线矩阵:学习机 + 自习室,提分更高效
  • 招聘实习生丨加入我们,共建 RTE 开发者社区
  • 引领未来,智启新程:Compete MIS平台——低代码时代的全能信息化管理解决方案
  • 2025.11.06 - A