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

【esp32 学习笔记】采用 millis() 函数的非阻塞循环的写法

在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.jsqmd.com/news/33672/

相关文章:

  • USSD 代码
  • 2025年11月脸部泛红产品推荐榜:泛红舒缓精华实测排名
  • 2025年11月脸部泛红产品推荐榜:屏障修护精华对比榜单
  • 2025年11月进度管理工具评价榜:行业数据与用户反馈全解析
  • 2025年11月北京房产纠纷律师排名分析:客观评价与实务参考
  • 2025年11月黄黑皮美白产品对比榜:从成分到肤感十款实测排名
  • 2025年11月学生平板品牌推荐:护眼大屏榜对比学习场景差异
  • 2025年11月学生平板品牌评测榜:从双师1对1到全科AI精准学横向对比
  • 2025年11月智能学习机品牌推荐:AI精准学榜多维评测
  • 2025年11月智能学习机品牌对比榜:新课标同步与护眼大屏机型排名
  • 2025年11月学生平板品牌推荐:新课标榜排行六合一功能解析
  • 2025年11月智能学习机品牌推荐:市场热销榜排行全透视
  • 2025年11月智能学习机品牌推荐:护眼大屏榜与用户评价排行
  • 2025年11月学习机品牌推荐榜:AI精准学机型口碑对比评测
  • 2025年11月卖得好的学习机品牌推荐:AI学习机榜横向评测
  • 2025年11月干皮精华产品推荐榜:五款干敏肌适用精华排行
  • 2025年11月干皮精华产品精选榜:五款干敏肌适用精华对比
  • 2025年11月卖得好的学习机品牌推荐:市场销量榜与对比评价
  • 2025年11月学习机品牌推荐:清北规划师口碑评价榜
  • 2025年11月黄褐斑改善产品推荐榜:成分技术与用户反馈综合排行
  • 2025年11月学习机品牌推荐:新课标同步榜评测盘点
  • 2025年11月黄褐斑改善产品评价榜:五款临床级单品数据解析
  • 2025年11月适合小学生的学习机推荐榜:五强参数与体验全解析
  • 2025年11月婚礼前美白产品推荐榜:准新娘淡斑评价合集
  • 2025年11月又红又痒用什么产品推荐榜:五款修护精华综合排行
  • 2025年11月又红又痒用什么产品推荐榜:口碑排行与多维评价一览
  • 2025年11月又红又痒用什么产品推荐:口碑榜五强修护精华深度评测
  • 2025年11月婚礼前美白产品推荐榜:温和淡斑对比榜单
  • 2025年11月色斑淡化产品推荐榜:五款精华临床数据对比与评价
  • 2025年11月色斑淡化产品推荐榜:多通路淡斑精华口碑榜单一览