数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 152|回复: 16

[Arduino] 这种情况,中断怎么处理

[复制链接]
发表于 4 小时前 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x



以前没用过中断,听说是中断中不能处理延时函数,但是很多中断事件过程涉及到延迟,
这样的话怎么用中断方式解决?有这方面经验的坛友说说看
发表于 4 小时前 | 显示全部楼层
中断是否延时或调用延时函数取决于程序的功能和自己的喜好,如果程序很简单,想延时多久就延时多久,如果程序还有其它功能,比如有按键、显示、ADC……如果卡在中断中的时间太长,程序执行会有电脑卡顿的感觉,这时就不能在中断中长时间延时了。

中断中调用延时函数可以这样处理:
(1)把延时函数定义为可重入函数(效率低,不推荐);
(2)把延时函数复制一份(如果有多个不同优先级的可嵌套中断调用延时函数就复制多份),改个函数名且仅在同一优先级中断中调用同一个。

如果响应中断后实在要延时较长时间,可以这样处理:
(1)中断中仅设置响应标志,然后在主循环中延时(一般情况推荐);
(2)中断中开启定时器中断,然后在定时器中断中处理延时之后的事务(需要精确延时时使用)。


打赏

参与人数 1家元 +30 收起 理由
人艰不拆了 + 30

查看全部打赏

回复 支持 反对

使用道具 举报

 楼主| 发表于 4 小时前 | 显示全部楼层
mmxx2015 发表于 2025-9-16 08:45
中断是否延时或调用延时函数取决于程序的功能和自己的喜好,如果程序很简单,想延时多久就延时多久,如果程 ...

哈哈,多谢指点,看来你很有经验啊
回复 支持 反对

使用道具 举报

 楼主| 发表于 4 小时前 | 显示全部楼层
mmxx2015 发表于 2025-9-16 08:45
中断是否延时或调用延时函数取决于程序的功能和自己的喜好,如果程序很简单,想延时多久就延时多久,如果程 ...

如果响应中断后实在要延时较长时间,可以这样处理:
(1)中断中仅设置响应标志,然后在主循环中延时(一般情况推荐);

我就是把它扔到主循环里了,但是何时进主循环是随机的,不是时间十分精确,稍微有点不理想,其实我是想在中断里开个定时器来处理,哈哈,看来在中断外处理基本也就是这个模式了
回复 支持 反对

使用道具 举报

发表于 4 小时前 | 显示全部楼层
弄个变量,中断执行一次给变量加1,主循环根据变量的值就知道中断了多少次,比如循环100次就执行一下对应的函数,同时给变量清零
回复 支持 反对

使用道具 举报

 楼主| 发表于 4 小时前 | 显示全部楼层
wangxiangtan2 发表于 2025-9-16 09:04
弄个变量,中断执行一次给变量加1,主循环根据变量的值就知道中断了多少次,比如循环100次就执行一下对应的 ...

哈哈,你真聪明啊
回复 支持 反对

使用道具 举报

发表于 3 小时前 | 显示全部楼层
参考5楼的方法直接用定时器中断好了,中断一次就对应一个延时的时间基数而后用变量累计起来,根据自己的延时需求设定时基和计数次数就好了。
回复 支持 反对

使用道具 举报

发表于 3 小时前 | 显示全部楼层
原则上来说,中断的时间越短越好。在多任务处理中更是要快进快出。
既然是初学者,那就无所谓。任务单一,可以初始在中断中延时。
回复 支持 反对

使用道具 举报

 楼主| 发表于 3 小时前 | 显示全部楼层
慕名而来 发表于 2025-9-16 09:20
参考5楼的方法直接用定时器中断好了,中断一次就对应一个延时的时间基数而后用变量累计起来,根据自己的延 ...

中断是外部中断,不是计时器中断
回复 支持 反对

使用道具 举报

发表于 3 小时前 | 显示全部楼层
wangxiangtan2 发表于 2025-9-16 09:04
弄个变量,中断执行一次给变量加1,主循环根据变量的值就知道中断了多少次,比如循环100次就执行一下对应的 ...

这个方法好!无敌
回复 支持 反对

使用道具 举报

发表于 3 小时前 | 显示全部楼层
人艰不拆了 发表于 2025-9-16 09:23
中断是外部中断,不是计时器中断

不知道你的用途,但如果设定好优先级后嵌套使用也无不可。
回复 支持 反对

使用道具 举报

发表于 3 小时前 | 显示全部楼层
人艰不拆了 发表于 2025-9-16 08:54
如果响应中断后实在要延时较长时间,可以这样处理:
(1)中断中仅设置响应标志,然后在主循环中延时(一 ...

这取决于精度要求,如果是按键之类的,按下30mS响应和按下25mS、35mS响应是看不出区别的,主循环任务要分片分时执行,尽量不扎堆,就像一周7天每天上8小时,不要一天20小时干不完活一天整天睡大觉,这样定时就比较准了。
回复 支持 反对

使用道具 举报

发表于 3 小时前 | 显示全部楼层
看帖子很长知识
回复 支持 反对

使用道具 举报

发表于 2 小时前 | 显示全部楼层
不知道具体情况,为什么要在字段里延时。一般这种情况可以在中断和时间中断里综合处理。
回复 支持 反对

使用道具 举报

发表于 2 小时前 | 显示全部楼层
完全不懂,进来学习高精尖
回复 支持 反对

使用道具 举报

发表于 1 小时前 | 显示全部楼层
给个全局变量,中断发生的时候就修改全局变量值,
根据需求决定延时是否为硬性要求(即这个延时是否需要其触发源提前取消延时)进而决定延时期间是否禁止继续出现中断请求(即延时期间临时关闭中断响应),这个时候保证延时精度就可以用定时器了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 微信登录

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-9-16 13:11 , Processed in 0.234000 second(s), 9 queries , Gzip On, Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

快速回复 返回顶部 返回列表