ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

非阻塞延时

非阻塞延时 非阻塞延时单片机 / ESP32‑Arduino阻塞延时delay (1000)调用 delay()CPU 原地干等 1000 毫秒这期间什么活都干不了不能读按键、不能刷新屏幕、不能跑 PWM、不能处理网络。程序卡住。非阻塞延时不卡死程序计时的同时代码继续往下跑可以同时干多件事。原理记录上一次执行的时间戳每次 loop 对比当前时间时间到了才执行任务没到直接跳过。核心模板Arduino / ESP32unsigned long previousTime 0; // 记录上一次触发时间const unsigned long interval 1000; // 间隔1000msvoid loop(){unsigned long now millis(); // 获取当前运行毫秒数if( now - previousTime interval ){// 到时间了执行你的任务 Serial.println(任务执行);previousTime now; // 更新时间戳开启下一轮计时}// 这里的代码会不停循环执行不会被延时卡住// 可以读触摸、刷新LVGL、网络、PWM不受上面计时影响}关键点1. millis()开机到现在走过的毫秒最大 49 天溢出一次模板写法自动兼容溢出不用处理。2. 不要在 if 里面写delay()一写又变回阻塞。3. 可以写多组独立变量实现多个定时器互不干扰比如一个 100ms 刷屏幕一个 2000 秒上报网络。对比1. 阻塞 delay(1000)- 等待的 1 秒loop 暂停啥都不处理- 简单但是 GUI、触摸、网络直接卡死LVGL 项目禁止用 delay2. 非阻塞 millis 方式- 计时在后台判断程序持续流转- ESP32 做触摸屏 LVGL、物联网、多任务必须用这套。常见踩坑❌错误把 previousTime now; 写在 if 外面计时直接失效。❌错误变量用int时间大了溢出必须用unsigned long。ESP32 还有另外两种非阻塞方案1. FreeRTOS 任务多线程创建单独 Task 做延时2. LEDC 硬件定时器、硬件中断。LVGL 开发强烈建议全部使用 millis 非阻塞延时一旦出现 delay触摸屏点击会反应迟钝。需要我给你写一个两套定时器同时跑的示例代码吗比如一个闪 LED另一个打印日志互不干扰。
返回列表