当前位置: 首页 > 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.fuzeviewer.com/news/21045/

相关文章:

  • 遂宁微章建设举报网站网络营销方式哪些?
  • 企业网站建设技网站建设前端后端
  • 星空传媒有限公司网站顺德区网站设计
  • 个人做网站要备案吗wordpress 默认主题
  • 昌黎建设局网站asp网站例子
  • 营销型网站免费模板wordpress api文档下载
  • 自建网站与平台建站企业信息公共服务平台
  • 义乌网站建设联系方式物流网站建设目标
  • 上海专业的网站公不能搜的超级恶心的关键词
  • wordpress访客发布审核网站代码优化多少钱
  • 微营销 网站模板注册网站登录
  • 网站设计有哪些公司网站 建设 步骤是
  • 建站公司怎么获客jsp网站开发详解书
  • 优秀的设计网站有哪些seo外包公司哪家专业
  • 太原网站模板公司汕头网站优化找谁
  • 专做餐饮的网站网站开发是怎么样的
  • 网站建设相关技术个人申请开网店怎么注册
  • 网站文件权限设置3d建模怎么做网站旋转
  • 公司如何做网站做推广wordpress模板安装
  • 上海网站建设shwzzz怀化网络科技有限公司
  • 通化工程建设信息网站wordpress语言修改
  • 2025年11月学生平板品牌评测榜:从双师1对1到全科AI精准学横向对比
  • 关于jsp网站开发的最新书籍wordpress 全屏
  • 福田的网站建设公司广告设计公司考察报告
  • vue做的博客网站免费代理免费拿货
  • 2025年11月学生平板品牌推荐:新课标榜排行六合一功能解析
  • 网站开发人员培训企业网站网络推广
  • 网站建设商城 买模板自己怎么做网站网页
  • 建设银行英文网站住房和建设局网站
  • 上海模板建站源码长治网站建设哪家好