标签: interrupt-handling

如何正确处理SIGINT以关闭文件/连接

我想在脚本中实现适当的SIGINT处理,该脚本将打开多个文件和一个数据库连接。如果脚本是CTRL + C或其他方式中断,则应将其关闭。

以前我用过 KeyboardInterrupt异常捕获CTRL + C,在那里检查了是否定义了文件/连接,如果如此,则关闭它们,然后退出。

这是否真的是pythonic方法,还是建议使用信号处理程序?例如

import signal, sys, time

def handler(signum, frame):
    print("..kthxbye")
    sys.exit(1)

def main():
    signal.signal(signal.SIGINT, handler)
    i = 0
    while True:
        print(i)
        i += 1
        time.sleep(1)

if __name__ == "__main__":
    main()
Run Code Online (Sandbox Code Playgroud)

这对我来说似乎比较干净,但我不知道如何将文件名或数据库连接传递给处理程序。

python signals exit interrupt-handling

4
推荐指数
1
解决办法
3636
查看次数

用于读取的原子块与 ARM SysTicks

我目前正在将我的DCF77 库(您可以在 GitHub 上找到源代码)从 Arduino(基于 AVR)移植到 Arduino Due(ARM Cortex M3)。我是 ARM 平台的绝对初学者。

使用基于 AVR 的 Arduino,我可以使用avr-libc来获取原子块。基本上,这会在阻止期间阻止所有中断,并在稍后再次允许中断。对于 AVR,这很好。现在对于 ARM Cortex 来说,事情开始变得复杂了。

首先:对于库的当前用途,这种方法也适用。所以我的第一个问题是:是否有类似于 ARM 的 avr-libc 的“ATOMIC”宏的东西?显然其他人已经想到了这个方向东西。由于我使用的是 gcc,我可以增强这些宏,使其几乎与 avr-libv ATOMIC 宏一样工作。我已经找到了一些CMSIS 文档,但是这似乎只提供了“enable_irq”宏而不是“restore_irq”宏。

问题 1:是否有任何库(对于 gcc)已经这样做了?

因为 ARM 有不同的优先级中断,我也可以用不同的方式建立原子性。在我的情况下,“原子”块必须只确保它们不会被 systick 中断中断。所以实际上我不需要阻止一切来使我的块“足够原子”。进一步搜索我在开发人员信息中心找到了一篇ARM 同步原语文章。特别是有一个关于无锁编程的提示。根据这篇文章,这是一个先进的概念,并且有很多关于它的出版物。在网上搜索我只找到了这个概念的一般解释,例如这里。我认为无锁实现会非常酷,但此时我对 ARM 没有足够的信心从头开始实现它。

问题 2:有没有人对 ARM Cortex M3 上的内存块的无锁读取有一些提示?

正如我已经说过的,我只需要保护较低优先级的线程免受 sysTicks 的影响。所以另一个选择是暂时禁用 sysTicks。由于我正在实施时序敏感时钟算法,因此从长远来看,这不能降低整体 sysTick 频率。不过,引入一些小的抖动就可以了。这个时候我会觉得这个最有吸引力。

问题3:有什么好办法可以在不丢失tick的情况下阻塞sysTick中断?

我还找到了semaphoresCMSIS …

c gcc arm interrupt-handling arduino-due

4
推荐指数
1
解决办法
2362
查看次数

Linux——嵌套中断

Linux 是否使用嵌套中断?

我的意思是,例如,当从任何设备提供中断服务时,可以允许在此例程中进一步中断吗?或者它涉及上半部和下半部?

编辑:

如果Linux使用嵌套中断,如何关心它们的堆栈?

linux interrupt interrupt-handling

4
推荐指数
1
解决办法
6159
查看次数

如何在不进行连续重置的情况下将esp8266从深度睡眠中唤醒

我正在使用esp8266构建IR到wifi桥。基本上,我正在构建连接到IR遥控器中的esp8266的IR接收器,以通过wifi将接收到的IR Remote按键转发到服务器。我正在使用Wemos D1 Mini。

我已经可以使用IR解码和网络转发部分了,但是它始终处于打开状态,这会消耗大量电池,尤其是考虑到99%的时间没有按下任何按钮。

我希望它在没有按下按钮一定时间后进入深度睡眠状态。

如果我将IR接收器连接到RST引脚,则可以将esp从深度睡眠中唤醒,但是问题在于随着IR不断进入,它将不断反复重置esp,这将使esp无法实际解码IR命令,因为它不断被重置。

我需要它通过RST从深度睡眠中唤醒特别是esp,但是然后忽略进一步的RST激活,直到我以编程方式再次将其发送到深度睡眠中为止。

我真正需要的是适当的gpio中断,因此在进入深度睡眠之前我可以忽略进一步的重置,但是AFAIK esp8266不支持从深度睡眠唤醒gpio中断。

我需要某种可重置的单发触发器,仅发出一个重置,直到您告诉它您将再次入睡。

我不确定如何实现此目标?有人有想法么?我宁愿不必使用另一个外部微控制器来重置esp8266,遥控器内部的空间也很狭窄,所以我宁愿不必使用很多外部部件。

sleep infrared interrupt-handling sleep-mode esp8266

4
推荐指数
1
解决办法
2万
查看次数

在硬件中断之前如何处理分支错误预测

特定向量(未屏蔽)发生硬件中断,CPU 检查 IF 标志并将 RFLAGS、CS 和 RIP 压入堆栈,同时后端仍有指令完成,其中一条指令的分支预测结果是错误的。通常管道会被刷新,前端开始从正确的地址获取,但在这种情况下,中断正在进行中。

当中断发生时,流水线中的指令会发生什么情况?

我已经读过这篇文章,显然解决方案是立即刷新管道中的所有内容,这样就不会发生这种情况,然后生成指令将 RFLAGS、CS、RIP 推送到 TSS 中内核堆栈的位置;然而,问题出现了,它如何知道与最新架构状态关联的 (CS:)RIP,以便能够将其推送到堆栈上(假设前端 RIP 现在将领先)。这类似于 port0 上的采取分支执行单元如何知道当采取预测结果错误时应该获取的 (CS:)RIP 的问题——是编码到指令中的地址以及预言?当你想到陷阱/异常时,也会出现同样的问题,CPU需要将当前指令(故障)或下一条指令(陷阱)的地址推送到内核堆栈,但是它是如何计算出这条指令的地址的当它处于管道的中途时——这让我相信地址必须被编码到指令中并使用长度信息计算出来,这可能全部在预解码阶段完成。

pipeline intel cpu-architecture interrupt-handling branch-prediction

4
推荐指数
1
解决办法
1067
查看次数

管道中的软件中断会发生什么情况?

读完这篇文章后:

当中断发生时,流水线中的指令会发生什么情况?

关于软件中断会发生什么情况的信息并不多,但我们确实了解到以下内容:

相反,异常(例如页面错误)会标记受影响的指令。当该指令即将提交时,异常之后的所有后续指令都将被刷新,并且指令获取将被重定向。

我想知道管道中的软件中断(INT 0xX)会发生什么,首先,它们何时被检测到?它们是否可能在预解码阶段被检测到?在指令队列中?在解码阶段?或者他们到达后端并立即完成(不进入保留站),依次退休,退休阶段发现这是一条 INT 指令(看起来很浪费)。

假设它在预解码时被拾取,必须有一种方法向 IFU 发出信号以停止获取指令,或者确实对其进行时钟/电源门控,或者如果它在指令队列中被拾取,则必须有一种在队列中之前刷新指令的方法。然后必须有一种方法向某种逻辑(“控制单元”)发出信号,例如为软件中断生成微指令(索引到 IDT、检查 DPL >=CPL >=段 RPL 等),天真的建议,但如果有人更好地了解这个过程,那就太好了。

我还想知道当这个过程受到干扰时它如何处理它,即发生硬件中断(记住陷阱不会清除 EFLAGS 中的 IF),现在必须开始一个全新的中断处理和 uop 生成过程,它将如何处理之后回到处理软件中断的状态。

x86 pipeline intel interrupt-handling

4
推荐指数
1
解决办法
977
查看次数

stm32如何判断中断源?

我最近在 stm32 项目中使用了 Default_Handler,但无法弄清楚它的外壳是什么:

  .section .text.Default_Handler,"ax",%progbits
Default_Handler:
Infinite_Loop:
    b   Infinite_Loop <--- here!
Run Code Online (Sandbox Code Playgroud)

默认情况下,许多中断被映射到默认处理程序,我可以找出实际中断原因的唯一方法是为所有中断(60+)编写处理程序并暂停调试器中的代码。呸!

我在谷歌上没有找到一个好的答案,所以我想我为其他人(或者很可能在 6 个月内为我自己)记录了解决方案......

stm32 interrupt-handling

4
推荐指数
1
解决办法
2432
查看次数

我的中断处理程序是应该禁用中断还是ARM处理器自动执行?

我们小组正在使用自定义驱动程序在共享I2C总线上连接四个MAX3107 UART.四个MAX3107的中断通过ARM9处理器(LPC3180模块)上的GPIO引脚连接(即通过逻辑或"动作共享中断").当这些器件中的一个或多个中断时,它们将配置为电平敏感中断的GPIO线拉低.我的问题是否需要禁用处理程序代码中的特定中断行.(我应该补充一点,我们正在运行Linux 2.6.10).

基于我阅读关于中断的几个特定于ARM的应用笔记,似乎当ARM处理器收到中断时,它会自动禁用(屏蔽?)相应的中断线(在我们的例子中,这似乎是对应于我们选择的GPIO引脚).如果这是真的,那么似乎我们不应该在我们的中断处理程序代码中禁用此GPIO引脚的中断,因为这样做似乎是多余的(尽管它似乎工作正常).换句话说,在我看来,如果ARM处理器在发生中断时自动禁用GPIO中断,那么如果有的话,我们的中断处理程序代码应该只需要在设备服务后重新启用中断.

我们使用的中断处理程序代码包括disable_irq_nosync(irqno);在处理程序的最开头和处理程序enable_irq()末尾的相应代码.如果ARM处理器已经禁用了中断线(在硬件中),这些调用会产生什么影响(即调用disable_irq_nosync()后跟一个调用enable(irq())

arm interrupt linux-kernel interrupt-handling

3
推荐指数
1
解决办法
4499
查看次数

什么是遗留中断?

我正在研究一个项目,我试图找出如何在ARM体系结构的全局中断控制器中处理中断.我正在使用pl390中断控制器.我看到有一条线被称为遗留中断,它绕过了分配器逻辑.假设可以将2个中断编程为传统中断.任何人都可以帮助解释遗留中断究竟是什么吗?我试着在网上搜索没有任何运气.

arm interrupt interrupt-handling

3
推荐指数
1
解决办法
1143
查看次数

找一个免费的中断插槽

一些小丑(BIOS/DOS/TSR ......)在中断向量表中写入了随机数据.我知道这是因为拆卸告诉了我.

通常在占用中断向量之前,我验证所选的IVT插槽是空的.但是,有了所有这些留下来的数据,一个不起眼的应用程序如何知道钩住特定的中断向量仍然是安全的?

虽然我的程序员参考描述了DOS功能25小时SetInterruptVector

" 安全地修改中断向量以指向指定的中断处理程序"

我不认为这种预先存在的虚假内容太过关注.到目前为止安全!


是否有一些巧妙的方法可以绝对确定中断向量是免费的?

x86 assembly dos interrupt-handling

3
推荐指数
1
解决办法
121
查看次数