关于loop( ) 阻塞和非阻塞探究

一、SIR的补充

在上几篇博客中,有朋友私信问我,在ticker函数程序和中断服务程序(ISR)中写 物联网请求报错。怎么回事,在此解释。控制台如下

1.1解释

在使用 Ticker 函数和中断服务程序(ISR)时,如果在 ISR 中进行物联网请求可能会导致一些问题,因为 ISR 中需要尽量保持简洁和快速执行,而物联网请求可能涉及到网络通信,执行时间较长,容易引起不可预期的问题,比如中断嵌套、堆栈溢出等。

通常来说,在 ISR 中不应该执行耗时的操作,包括网络通信、文件操作等。如果需要在 ISR 中进行某些操作,可以考虑通过设置标志位的方式,在主循环中检查该标志位并执行相应的操作。

1.2说明

因此在实现网络请求时,请将请求程序写入loop()主循环内,简单的硬件信号输入输出程序则可以放入 多任务处理 ticker和中断执行ISR中。如下

#include <Ticker.h>Ticker ticker;
Ticker ticker1;void setup() {attachInterrupt(digitalPinToInterrupt(keyPin), handleInterrupt, FALLING);  // 设置外部中断ticker.attach_ms(10, controlLED);  // 10微秒执行一次// ------// 设置定时器,在1秒后发送设备信息ticker1.once(1, startedInstruction);
}// 1.外部中断处理函数
ICACHE_RAM_ATTR void handleInterrupt() {flag = !flag;  // 切换 LED 状态//不能在 ticker 和中断中写网络请求
}// 2.控制 LED 状态
void controlLED() {digitalWrite(ledPin, flag ? HIGH : LOW);  // 根据标志控制 LED 亮灭
}//3.ticker检测启动说明
void startedInstruction() {Serial.println("启动说明");String tag = String("/LoveMomServer/jb82IWj8q")+ "?dIdmail=" + String(DEVICE_ID) + "&netWork="+ netWork + "&deviceName=" + deviceName + "&localIp="+ localIp + "&deviceMac=" + deviceMac;Serial.println(tag);
}

二、loop也有阻塞的时候

2.1案例

网络请求写在loop中,有的请求是10秒请求一次,有的请求是20秒、甚至是5秒、1秒。这么多网络请求都写在loop函数内,请求和休眠时间各不一样。

尤其是对硬件监听digitalRead(keyPin) == LOW是毫秒级的不间歇的。强行加delay(1000),会导致程序阻塞的。

2.2阻塞情况

void loop() {if (sendDeviceInfoRequestCount < 3) {sendDeviceInfo();sendDeviceInfoRequestCount++;} else {Serial.println("------");}if (digitalRead(keyPin) == LOW) {sendChangeLEDRequest();while (!digitalRead(keyPin));  //按键释放时候退出while循环,防止按键按下多次触发}delay(10000);httpRequest();delay(10000);
}

在 loop() 函数中,当执行 delay(10000); 的时候,代码会暂停执行10秒钟。如果在这10秒钟内按下了按钮,digitalRead(keyPin) == LOW 将会成立,从而触发 sendChangeLEDRequest()。然而,由于 delay(10000); 正在执行,代码会一直停留在这个延迟函数中,直到时间到了才会继续执行后面的代码。因此,在延迟期间按下按钮是不会触发 sendChangeLEDRequest() 的。

2.3非阻塞逐个定时

void loop() {unsigned long currentMillis = millis();if (sendDeviceInfoRequestCount < 1) {sendDeviceInfo();sendDeviceInfoRequestCount++;} else {//Serial.println("eeeeee");}if (digitalRead(keyPin) == LOW) {sendChangeLEDRequest();while (!digitalRead(keyPin));  //等待按键释放}if (currentMillis - previousMillis >= interval) {httpRequest();previousMillis = currentMillis;  // 重置计时器}
}

millis() 函数是 Arduino 编程中常用的一个函数,用于获取从 Arduino 开始运行以来经过的毫秒数。它返回一个 unsigned long 类型的值,表示自 Arduino 开始运行以来经过的毫秒数。

在 Arduino 程序中,通常需要进行时间相关的操作,比如控制执行某些任务的时间间隔、实现定时功能等。millis() 函数可以帮助你实现这些功能,而不必使用阻塞延迟函数 delay(),从而使得 Arduino 在等待某些事件发生的同时可以执行其他任务。

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

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

相关文章

开源简单方便功能强大的Devops工具:Goploy

Goploy&#xff1a;加速您的DevOps旅程&#xff0c;拥抱无缝部署——选择Goploy&#xff0c;让您从繁琐的发布与回滚中解放出来&#xff0c;尽享高效、智能与便捷的自动化部署力量&#xff01; - 精选真开源&#xff0c;释放新价值。 概览 现在大部分流行的发布工具功能虽然强…

Leetcode-2810-故障键盘-c++

题目详见https://leetcode.cn/problems/faulty-keyboard/ 题解 这道题的关键是如何合理地使用STL&#xff0c;毕竟是一道简单题。 之前常用到的Vector容器是单向开口的连续内存空间 deque则是一种双向开口的连续线性空间&#xff0c;又称双端动态数组。所谓的双向开口&#x…

bugku-web-速度要快

发现phpsessid 从上述提示 提示发送post请求&#xff0c;并且带有参数margin 发送后发现报文头部有一个字段叫flag&#xff0c;但好像每一次flag都不一样 构建Python脚本 request requests.Session()data {margin:find, } for i in range(50):html request.post(urlhttp:/…

2024年04月在线IDE流行度最新排名

点击查看最新在线IDE流行度最新排名&#xff08;每月更新&#xff09; 2024年04月在线IDE流行度最新排名 TOP 在线IDE排名是通过分析在线ide名称在谷歌上被搜索的频率而创建的 在线IDE被搜索的次数越多&#xff0c;人们就会认为它越受欢迎。原始数据来自谷歌Trends 如果您相…

如何借助Idea创建多模块的SpringBoot项目

目录 1.1、前言1.2、开发环境1.3、项目多模块结构1.4、新建父工程1.5、创建子模块1.6、编辑父工程的pom.xml文件 1.1、前言 springmvc项目&#xff0c;一般会把项目分成多个包:controler、service、dao、utl等&#xff0c;但是随着项目的复杂性提高&#xff0c;想复用其他一个模…

mkcert生成ssl证书+nginx部署局域网内的https服务访问问题

文章目录 mkcert生成ssl证书nginx部署局域网内的https服务访问问题1、下载mkcert查看自己的电脑是arm还是amd架构 2、安装mkcert3、测试mkcert是否安装成功4、查看CA证书存放位置5、打开windows的证书控制台6、生成自签证书,可供局域网内使用其他主机访问以下是nginx部署https服…

idea Springboot 电影推荐系统LayUI框架开发协同过滤算法web结构java编程计算机网页

一、源码特点 springboot 电影推荐系统是一套完善的完整信息系统&#xff0c;结合mvc框架和LayUI框架完成本系统springboot dao bean 采用协同过滤算法进行推荐 &#xff0c;对理解JSP java编程开发语言有帮助系统采用springboot框架&#xff08;MVC模式开发&#xff09;&…

书生·浦语大模型-第二节课笔记/作业

笔记 实验一 cli-demo import torch from transformers import AutoTokenizer, AutoModelForCausalLMmodel_name_or_path "../models"tokenizer AutoTokenizer.from_pretrained(model_name_or_path, trust_remote_codeTrue, device_mapcuda:0) model AutoModelF…

【Cadence Allegro】如何差分对走线

一、创建espice模型 shift+F2或者“Analyze-Model Assigment”创建espice模型,这个操作是为了让差分线路里的串接电阻(或电感电容)变为xnet类型方便准确等长走线。 Cadence Allegro Xnet的创建详细教程 - 知乎Cadence Allegro Xnet的创建详细教程Xnet是指在无源器件的两端,…

【Go】十四、封装、继承

文章目录 1、封装2、继承3、继承的注意点 1、封装 隐藏实现细节保证数据安全&#xff08;控制变量或方法的访问范围&#xff0c;private&#xff09; Go中实现封装&#xff1a; 结构体、字段的首字母小写&#xff08;Java的private&#xff09;提供一个工厂模式函数&#xf…

微服务管理(完整)

前言&#xff1a; 分享一篇学微服务管理的过程 一&#xff0c;etcd入门 1&#xff0c;简介 1.1&#xff0c;etcd是什么 etcd是CoreOS团队于2013年6月发起的开源项目&#xff0c;它的目标是构建一个高可用的分布式键值(key-value)数据库。 官网上的一段描述&#xff1a; A…

Tomcat调优总结(Tomcat自身优化、Linux内核优化、JVM优化)

Tomcat自身的调优是针对conf/server.xml中的几个参数的调优设置。首先是对这几个参数的含义要有深刻而清楚的理解。以tomcat8.5为例&#xff0c;讲解参数。 同时也得认识到一点&#xff0c;tomcat调优也受制于linux内核。linux内核对tcp连接也有几个参数可以调优。 因此我们可…

java数据结构与算法刷题-----LeetCode695. 岛屿的最大面积

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 1. 深度优先遍历2. 广度优先 1. 深度优先遍历 这不是找最短路径&…

蓝桥杯刷题第七天

这道题一开始看真的有点简单&#xff0c;但一开始跟着案例先入为主了&#xff0c;误以为是只有两个项目想着穷举完n个人&#xff0c;&#xff08;n1&#xff09;*&#xff08;n2&#xff09;/2种情况但后面发现项目不止两个&#xff0c;用链表来好像我也不会&#xff0c;用二维…

linux编辑器——vim使用方法

文章目录 linux编辑器——vim使用方法1. vim的基本概念2. vim的基本操作3. vim正常模式命令集4. vim末行模式命令集5. vim操作总结6.简单vim配置7.参考资料 linux编辑器——vim使用方法 vi/vim的区别简单点来说&#xff0c;它们都是多模式编辑器&#xff0c;不同的是vim是vi的…

泛域名站群,泛域名程序

泛域名站群是一种利用大量类似的泛域名来建立多个网站&#xff0c;并通过这些网站链接到主网站&#xff0c;以提升主网站的排名和流量的策略。泛域名站群通常包含大量的子域名&#xff0c;这些子域名指向不同的页面&#xff0c;但它们的内容大部分是重复或相似的&#xff0c;目…

【Frida】【Android】08_爬虫之网络通信库okhttp3

&#x1f6eb; 系列文章导航 【Frida】【Android】01_手把手教你环境搭建 https://blog.csdn.net/kinghzking/article/details/136986950【Frida】【Android】02_JAVA层HOOK https://blog.csdn.net/kinghzking/article/details/137008446【Frida】【Android】03_RPC https://bl…

编译和链接(基础速通版)

翻译环境和运行环境 前提解释 电脑是不能直接执行C语言的程序代码的&#xff0c;所依赖的是翻译环境进行一个源代码运行的时候需要经过翻译环境和运行环境的处理&#xff0c;才能得到你需要的可运行程序。 这里是源文件&#xff0c;也就是 .c文件&#xff0c;通过翻译环境得…

图解PyTorch中的torch.gather函数和 scatter 函数

前言 torch.gather在目前基于 transformer or query based 的目标检测中&#xff0c;在最后获取目标结果时&#xff0c;经常用到。 这里记录下用法&#xff0c;防止之后又忘了。 介绍 torch.gather 官方文档对torch.gather()的定义非常简洁 定义&#xff1a;从原tensor中获…

Ubuntu joystick 测试手柄 xbox

Ubuntu joystick 测试手柄 xbox 测试使用Ubuntu20.04 测试环境在工控机 安装测试 实际测试使用的手柄是北通阿修罗2pro 兼容xbox Ubuntu20.04主机 连接手柄或者无线接收器后查看是否已经检测到&#xff1a; ls /dev/input找到输入中的 js0 即为手柄输入 需要安装joysti…