标签: interrupt-handling

如何将用户中断添加到无限循环?

我有一个ruby脚本,从下面无限打印数字从1开始.如何通过终端中的"Ctrl + C"或"q"键使脚本停止无限执行?

a = 0
while( a )
  puts a
  a += 1
  # the code should quit if an interrupt of a character is given
end
Run Code Online (Sandbox Code Playgroud)

通过每次迭代,都不应该询问用户输入.

ruby interrupt infinite-loop interrupt-handling

7
推荐指数
2
解决办法
3248
查看次数

禁用中断时会发生什么,以及如何处理不知道如何处理的中断?

当您禁用中断时(使用clix86中的指令),究竟发生了什么?

  • PIC是否等待您打开中断,并在发生这种情况时触发中断?(如果是这样,它等待多长时间,如果时间'到期'会发生什么?)

  • 中断 - 从设备的角度来看 - 是否被发送到"黑洞",没有响应?

  • PIC是否以某种方式告诉设备"CPU正忙"或什么?

  • 还是会发生其他事情?

另外,你如何处理一个你不知道如何处理的中断?
有没有办法告诉PIC(或设备,如果你不知道设备是什么),"是的,我收到你的消息,但我不知道该怎么办"?

x86 assembly interrupt isr interrupt-handling

7
推荐指数
2
解决办法
2038
查看次数

处理器如何处理除零的情况

很奇怪处理器/ CPU在执行除零指令时对intel cpu和Linux执行的操作.如何将错误中继到应用程序,以便它可以记录错误或通知开发人员?

谢谢!

cpu operating-system signals interrupt interrupt-handling

7
推荐指数
2
解决办法
8840
查看次数

如何延迟Linux中断处理程序(我知道通常不会睡觉)

我正在开发一个嵌入式Linux ARM系统,它需要通过按特定顺序关闭一些电源(通过GPIO控制)来对电源故障信号作出反应.这个过程需要尽快启动,所以我安装了一个中断处理程序来检测这个电源故障.

问题是我们需要在关闭每个电源之间引入一点延迟.我知道在中断处理程序中通常不允许延迟,但如果这个处理程序永远不会返回(电源失败!),那就完全可以了.

我试图通过使用所描述的方法来引入延迟这篇文章,但我不能为我的生活其实导致可测量的延迟(在示波器上观察到的).

我做错了什么,我该怎么做?

以下是相关代码.

/* This function sets en_gpio low, then waits until pg_gpio goes low. */
static inline void powerdown(int en_gpio, int pg_gpio)
{
    /* Bring the enable line low. */
    gpio_set_value(en_gpio, 0);
    /* Loop until power good goes low. */
    while (gpio_get_value(pg_gpio) != 0);
}

/* This is my attempt at a delay function. */
#define DELAY_COUNT 1000000000
static void delay(void)
{
    volatile u_int32_t random;
    volatile u_int32_t accum;
    volatile u_int32_t i;

    get_random_bytes((void*)&random, 4);
    accum …
Run Code Online (Sandbox Code Playgroud)

c linux delay interrupt-handling

7
推荐指数
1
解决办法
3537
查看次数

函数参数传入Linux内核中断处理程序(从asm到C)

当我阅读Linux内核源码时,我遇到了这段代码:

__visible void __irq_entry smp_apic_timer_interrupt(struct pt_regs *regs)   
{
    struct pt_regs *old_regs = set_irq_regs(regs);

    entering_ack_irq();
    local_apic_timer_interrupt();
    exiting_irq();

    set_irq_regs(old_regs);
}
Run Code Online (Sandbox Code Playgroud)

该函数smp_apic_timer_interrupt()有一个参数.调用此函数是通过一段汇编语言代码:

ENTRY(apic_timer_interrupt)
     RING0_INT_FRAME;     
     ASM_CLAC;           
     pushl_cfi $~(0xef);
     SAVE_ALL;         
     TRACE_IRQS_OFF
     movl %esp,%eax;
     call smp_apic_timer_interrupt; // <------call high level C function       
     jmp ret_from_intr;      
     CFI_ENDPROC;           
ENDPROC(apic_timer_interrupt)
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚高级C函数如何smp_apic_timer_interrupt()获取其参数(通过哪个寄存器)?

x86 assembly calling-convention linux-kernel interrupt-handling

7
推荐指数
2
解决办法
1225
查看次数

什么是linux中的链接irq,何时需要使用?

什么是链式IRQ?做什么chained_irq_enterchained_irq_exit做什么,因为在中断发生后IRQ线被禁用,但是chained_irq_enter调用与屏蔽中断有关的功能.如果该行已被禁用,为什么要屏蔽中断?

linux irq linux-kernel interrupt-handling embedded-linux

7
推荐指数
2
解决办法
3301
查看次数

如何在golang中发送中断信号?

我目前正在尝试实现一个可以在Google Go中调用中断信号的函数.我知道如何拦截来自控制台的中断信号signal.Notify(interruptChannel, os.Interrupt),但是,我找不到实际发送中断信号的方法.我发现你可以向一个进程发送一个信号,但我不确定这是否可用于发送一个顶级中断信号.

有没有办法从golang函数中发送一个中断信号,该函数可以被正在侦听系统中断信号的任何东西捕获,或者是golang不支持的东西?

signals interrupt go interrupt-handling

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

request_irq()在内部做什么?

我知道它"分配一个中断线",但是

> what is happening after request_irq()?
> How a particular handler is getting called on receiving interrupt?
Run Code Online (Sandbox Code Playgroud)

任何人都可以用代码snipet解释它吗?

kernel interrupt linux-device-driver linux-kernel interrupt-handling

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

处理中断和使用 WFI risc-v cpu 指令的预期/正确方法是什么?

我对裸机编程非常陌生,以前从未接触过中断,但我一直在 RISC-V FE310-G002 SOC 供电的开发板上学习。

我一直在阅读有关 RISC-V WFI(等待中断)指令的内容,并且从手册中来看,听起来您不能依靠它来实际休眠核心。相反,它仅建议系统可以停止执行,并且应该将指令视为 NOP。然而,这对我来说似乎毫无用处。考虑以下 ASM 程序片段:

wfi_loop:
WFI
J wfi_loop
Run Code Online (Sandbox Code Playgroud)

由于不能依赖 WFI,因此必须执行此操作。然而,从中断处理程序中执行 MRET 后,您仍然会陷入循环中。因此,您必须使其以全局变量为条件,该全局变量的值在中断处理程序中更新。这看起来非常混乱。

此外,如果您的实现实际上遵循 WFI 指令,并且在执行 WFI 指令之前触发了中断,则整个内核将停止运行,直到触发其他中断,因为它将在 WFI 指令之前返回。

当没有工作要做时,该指令的唯一正确用法似乎是在内核调度程序内部。但即便如此,我认为您也不会想从中断处理程序返回到此类代码,而是从头开始重新启动调度程序算法。但这也会是一个问题,因为你必须以某种方式回滚堆栈,等等......

我一直在脑子里思考这个问题,但似乎无法找到安全的用途。也许,如果您以原子方式使用 CSRRS 启用中断,然后立即调用 WFI,如下所示:

CSRRSI zero, mie, 0x80
wfi_loop:
WFI
J wfi_loop
NOP
NOP
Run Code Online (Sandbox Code Playgroud)

然后确保在从中断处理程序调用 MRET 之前将 mepc 寄存器增加 8 个字节。在返回之前,还必须在中断处理程序内部的 mie 寄存器中再次禁用中断。只有当 WFI、J 和 NOP 都编码为 4 字节指令时,无论是否使用压缩指令,该解决方案才是安全的。它还取决于在 CSRRSI 指令启用后,程序计数器在可能触发中断之前到达 WFI 指令。然后,这将允许在代码中的安全位置触发中断,并以中断等待它的循环的方式返回。

我想我只是想了解我可以从硬件中获得什么行为,以及如何正确调用中断并返回并使用 WFI 指令?

assembly interrupt interrupt-handling riscv riscv32

7
推荐指数
2
解决办法
5838
查看次数

Atmel Studio Dummy_Handler

偶尔我会得到意外的中断,我的代码里面挂Dummy_Handler()exceptions.c爱特梅尔工作室框架(ASF)的.我正在使用Arduino Due的ATSAM3X8E微控制器.

void Dummy_Handler(void)
{
    while(1) {
    }
}
Run Code Online (Sandbox Code Playgroud)

任何想法如何确定它是哪个中断

当然,我可以用独特的虚处理程序替换这个单处理程序,每个异常一个.(大约有五十个.)例如,更改相同的exception.c文件中的每一行:

void HardFault_Handler  ( void ) __attribute__ ((weak, alias("Dummy_Handler")));
Run Code Online (Sandbox Code Playgroud)

对此

void HardFault_Handler  ( void ) __attribute__ ((weak, alias("Dummy_HardFault_Handler")));
Run Code Online (Sandbox Code Playgroud)

等等......或者尝试推断我的代码如何生成哪个中断.但谁有这样的时间?

exception-handling arduino interrupt-handling atmel atsam3x

6
推荐指数
1
解决办法
7261
查看次数