如果ISR运行时发生中断会发生什么
what happens if interrupt occurs while ISR running?
我正在编程arduino,我在引脚2下降沿上附加了一个中断。当我在ISR时,ISR并没有执行所有的线路。在完成所有线路之前,如果下降边缘再次出现,会发生什么?中断是从头开始还是忽略它。这里我说的是第二针的唯一中断。
Atmel处理器在中断时禁用中断:
(第4.4节:位7–I:全局中断启用)
全局中断启用位必须设置为已启用。然后执行单独的中断启用控制在单独的控制寄存器中。如果全局中断启用寄存器被清除时,没有任何中断独立于单独的中断启用设置。I位由硬件清除中断发生后,并由RETI指令设置为启用后续中断。I位也可以通过带有SEI和CLI指令的应用程序,如中所述指令集引用。
进一步:
外部中断标志寄存器-EIFR
•位7..0–INTF6、INTF3-INTF0:外部中断标志6、3-0当INT[6;3:0]引脚上的边缘或逻辑变化触发中断请求,INTF7:0变为设置(一)。如果SREG中的I位和设置EIMSK中相应的中断使能位INT[6;3:0](一),MCU将跳转到中断向量。标志已清除当执行中断程序时。或者,标志可以是通过向其中写入逻辑标志来清除。这些标志总是被清除当INT[6;3:0]被配置为电平中断时。请注意,当在INT3:0中断被禁用的情况下进入睡眠模式,输入这些引脚上的缓冲区将被禁用。这可能会导致逻辑变化在将设置INTF3:0标志的内部信号中。
换句话说,当检测到另一个中断时,标志寄存器将设置该位,并在再次启用中断时(如果没有采取单独的操作,则从中断返回)执行该中断。
http://www.atmel.com/Images/Atmel-7766-8-bit-AVR-ATmega16U4-32U4_%20Datasheet.pdf
如果你愿意,你可以实现在中断服务例程期间启用中断的代码,但你必须确保在这一点之后的代码是完全可重入的,和/或屏蔽当前中断(当你不久后没有得到另一个中断时,一些中断服务例程非常难以处理,如果你在该处理程序中得到另一次中断,那几乎是不可能的)。然而,通常情况下,正确的操作系统会启用所有其他中断,这意味着写入EIMSK寄存器。
一般来说,最好简单地在中断处理程序中收集必要的信息,将其存储在"安全"的地方(循环缓冲区很好),并发出新数据可用于系统中的常规任务的信号,并在那里处理数据。
[此外,据我所知,中断中没有任何东西可以停止函数调用-只要你了解自己在做什么,并且没有问题,例如从中断和常规代码同时调用函数]
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 警告处理为错误这里有什么问题
- 什么时候调用组成单元对象的析构函数
- #定义c-预处理器常量..我做错了什么
- 努力将整数转换为链表。不知道我在这里做错了什么
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 什么时候在C++中返回常量引用是个好主意
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- C++避免重复声明的语法是什么
- c++库的公共头文件中应该包含什么
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 如果在获取互斥锁之后发生中断,会发生什么
- 是什么变化导致C++中ABI中断
- 在中断例程中使用C++对象(和volatile)的正确方法是什么
- 为什么 itr = vector.erase(itr) 在循环中导致内存库中断?我在这里做错了什么吗?
- 如果ISR运行时发生中断会发生什么
- 在共享库的构造函数(_init部分)中,如何知道什么函数被中断了?
- 查找硬件中正在使用的中断驱动程序的命令是什么?
- 为什么此代码被认为是可重复的,以及当操作系统中断线程时究竟会发生什么
- 当我不输出变量时,代码中断;我什么时候工作。