我有一个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)
通过每次迭代,都不应该询问用户输入.
当您禁用中断时(使用clix86中的指令),究竟发生了什么?
PIC是否等待您打开中断,并在发生这种情况时触发中断?(如果是这样,它等待多长时间,如果时间'到期'会发生什么?)
中断 - 从设备的角度来看 - 是否被发送到"黑洞",没有响应?
PIC是否以某种方式告诉设备"CPU正忙"或什么?
还是会发生其他事情?
另外,你如何处理一个你不知道如何处理的中断?
有没有办法告诉PIC(或设备,如果你不知道设备是什么),"是的,我收到你的消息,但我不知道该怎么办"?
很奇怪处理器/ CPU在执行除零指令时对intel cpu和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) 当我阅读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
什么是链式IRQ?做什么chained_irq_enter和chained_irq_exit做什么,因为在中断发生后IRQ线被禁用,但是chained_irq_enter调用与屏蔽中断有关的功能.如果该行已被禁用,为什么要屏蔽中断?
我目前正在尝试实现一个可以在Google Go中调用中断信号的函数.我知道如何拦截来自控制台的中断信号signal.Notify(interruptChannel, os.Interrupt),但是,我找不到实际发送中断信号的方法.我发现你可以向一个进程发送一个信号,但我不确定这是否可用于发送一个顶级中断信号.
有没有办法从golang函数中发送一个中断信号,该函数可以被正在侦听系统中断信号的任何东西捕获,或者是golang不支持的东西?
我知道它"分配一个中断线",但是
> 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
我对裸机编程非常陌生,以前从未接触过中断,但我一直在 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 指令?
偶尔我会得到意外的中断,我的代码里面挂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)
等等......或者尝试推断我的代码如何生成哪个中断.但谁有这样的时间?