问题标签 [interrupt-handling]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
514 浏览

assembly - 自定义中断描述符表混淆

我正在编写一个在保护模式下运行的小型操作系统。我到了要加载自定义中断描述符表的地步,但我不知道从哪里开始。我已经阅读了 OS Dev wiki上的一些内容,但有一些问题需要回答。

在 OS Dev wiki 上,它说the first 32 (0-31) interrupts are reserved and used by the CPU, as exceptions, so don't use those for APIs or IRQs.问题是,如果我正在加载我的自定义中断表,我不需要为所有这些中断提供条目吗?

此外,wiki 声明 BIOS 将 IRQ0-7 映射到中断 8-15。如果是这种情况,IRQ中断不会与保留中断冲突吗?

有什么我没有得到的吗?中断 0-31 是在单独的表中还是什么?有人请指点我正确的方向并把事情弄清楚。

0 投票
1 回答
4050 浏览

timer - Avr-gcc:定时器/计数器中断与 UART 冲突?

请考虑以下示例(在 Arduino IDE 0022、Ubuntu 11.04、Arduino AtMEGA 2560 上尝试过),我正在尝试启动定时器/计数器中断并同时使用 ArduinoSerial类:

例如,通过串行打印输出将是:

...然后所有处理都将停止(由 LED 引脚 13 和 34 都没有动作表示);我想,这就是你在芯片世界中所说的 BSOD :) 从表面上看,一旦 ISR 例程第一次启动,就会停止。

如果您取出“寄存器更新部分”,则串行打印输出会按预期永远运行 - 而且(如预期),没有 ISR 正在运行。然而,如果“寄存器更新部分”被留下,而两条“ Serial.println(...”行被注释了——那么程序只打印“Hello from setup”——但中断确实运行(如引脚 34 上的脉冲所证明的那样)。

这似乎告诉我,你不能同时在 ATMega2560 上运行定时器 ISR 和 UART——这很愚蠢,因为我之前曾成功地在 ATMega328 上使用过同样的方法。

所以,我想知道我想要做的事情(串行打印输出和引脚脉冲)在这种架构下是否根本不可能 - 或者我只是在设置中遗漏了一些东西?

提前感谢您的任何答案,干杯!

(只是想注意这个 Serial 类实际上是在 Arduino IDE 包中 HardwareSerial.cpp 中的一个类定义上运行的;并且这个类定义了接收 USART 中断例程;认为这可能是问题所在 - 但我再次使用了相同的方法在 ATMega328 中,我看到它工作的地方..)

编辑:在Avr-gcc 上重新发布:定时器/计数器中断与 UART 冲突?- Arduino 论坛

0 投票
4 回答
2296 浏览

java - 停止等待网络活动的线程的正确方法是什么?

毫无疑问,过去曾以各种形式提出过这个问题,但对于特定场景并没有那么多。

在等待通过 UDP 接收网络消息时停止阻塞的线程的最正确方法是什么。

例如,假设我有以下线程:

现在,更正确的方法是使用该interrupt()方法吗?例如添加以下方法:

我唯一担心的是,是socket.receive()不是一种不可中断的阻塞方法?我想到的一种方法是在该方法调用中实现上述中断方法,socket.close()然后runSocketException. 或者也许不是while(true)使用在中断方法中翻转的某些状态。这是最好的方法吗?还是有更优雅的方式?

谢谢

0 投票
4 回答
36742 浏览

linux-kernel - SoftIRQ 和 Tasklet 之间的区别

在研究 Linux 中断处理时,我发现 Tasklet 和 SoftIRQ 是执行“下半部分”(优先级较低的工作)的两种不同方法。我理解这一点(非常真实的需要)。

不同之处在于,SoftIRQ 是可重入的,而 Tasklet 则不是。相同的 SoftIRQ 可以在不同的 CPU 上运行,而 Tasklet 则不是这样。

虽然我从表面上理解这一点,但我无法理解这两个功能的要求。在什么情况下我们可以使用这些设施?如何识别我现在应该使用 Tasklet,然后使用 SoftIRQ。

另外,我们所说的 Tasklet 是在 SoftIRQ 上制作的是什么意思?在我用 LKML 阅读的一本书中,有关于删除 Tasklet 的争论。我完全糊涂了,为什么要引入这样的功能?有些短视(没有冒犯的意思)?

对此的任何指示都会有很大帮助。

0 投票
1 回答
974 浏览

interrupt-handling - PIC(可编程中断控制器)和VIM(向量中断控制器)有什么区别?

ARM 处理器相关文档中谈到了 VIC,我相信 PIC 来自 Intel 阵营。它们在概念上是否相同?

0 投票
2 回答
2102 浏览

gcc - 用 GNU(GCC 和 GAS)替换 DOS 中的定时器中断处理程序

正如标题所暗示的,我正在尝试用我自己的一个替换 DOS 中的 Timer 中断的现有处理程序。在广泛搜索各种解决方案后,我发现了一些完全可以做到这一点的汇编代码,我什至设法编译和测试它,并看到它可以工作。

现在的问题是我找到的代码(见下文)是为 TASM 编写的,我希望将它与我正在编写的一些 C 代码一起使用,我用 GCC 编译这些代码。

我试图将代码转换为 GAS(GNU 汇编器)语法,但我似乎无法让它工作(在我多次尝试期间,我大多经历过一种或另一种崩溃)。

如果有人能用解决方案启发我,我将不胜感激(无论是 GAS 可以编译的汇编代码的工作版本,还是在 C 中完成整个事情的方法——“中断”关键字不起作用, “属性((中断))”等也没有——甚至是在 TASM 和 GCC 之间架起桥梁的一种方式)。

我还应该提到我正在使用的 DOS 系统实际上是一个 OracleVM VirtualBox 管理器,它运行一个安装了 FreeDOS 的虚拟机,而我用于 C 的编译器是 DJGPP 开发环境提供的 GCC .

这是我拥有的工作 TASM 代码(取自http://www.programmersheaven.com/mb/x86_asm/276128/276185/re-redefining-the-timer-interrupt-handler/):

它完全适用于我的机器。我启动程序,看到控制台的整个第一行都被不断变化的彩色字符所取代。

这是我将上述代码转换为 GAS 语法的尝试:

我使用以下命令编译我的文件(称为“ttv2.s”):

当我运行生成的 EXE 文件(在组装和链接过程中没有警告或错误)时,程序崩溃并出现错误“异常 0D in ring 0”(以及许多寄存器值)。但是,TASM 版本可以顺利运行!所以我猜我转换代码的方式或者我构建最终EXE的方式有问题。或两者。

一些额外的信息,如果它以任何方式有帮助:

  • 如果我删除安装命令 (the int $0x21),则不会发生崩溃,程序会等待我按下一个键然后退出。
  • 如果我保留安装命令,但删除等待键命令(int $0x16),程序立即退出,并且没有崩溃。
  • 如果我保留安装命令,并将wait-for-key 命令替换为活动延迟循环(一个简单的 40 亿次迭代循环),程序崩溃的方式与 wait-for-key 命令到位时相同,但几秒钟后,而不是立即。
  • 在崩溃的两种情况下(按键或延迟),即使我只删除了两个安装命令之一,程序也会崩溃。

在此先感谢您提供的任何和所有帮助,并为冗长的帖子感到抱歉...

0 投票
1 回答
354 浏览

assembly - 在 ISR 中调用 Int 13h

我已经在实模式下通过汇编为 int 9h 编写了 ISR。在这个 ISR 中,我调用 INT 13h, AH=0x02 来在硬盘上写入一些数据。但是数据不会写入硬盘。同样 int 13h, ah=0x02 也不起作用(从硬盘读取数据)。调用 int 13h 后,进位标志为 On,但 AH 和 AL 为零。当我在 ISR 之外使用此代码时,它就起作用了!为什么 ISR 中的 INT13h 不起作用,但其他中断(例如 INT10h)正常工作?

0 投票
1 回答
279 浏览

assembly - 如何处理中断?

我的任务是编写一个程序来处理除零异常。我很难找到有关这方面的信息。据我了解,我需要更改中断向量表中的第 0 个条目,但我该怎么做呢?我看到有一个 LIDT 指令,但是我不需要写整个表吗?

请注意,我将在 16 位模式下工作。

0 投票
4 回答
24981 浏览

linux - 用户空间中的 Linux 中断处理

在 Linux 中,在用户空间代码中而不是在内核空间中处理设备中断的选项有哪些?

0 投票
2 回答
14476 浏览

java - 中断()没有按预期工作(中断如何工作?)

我想中断一个线程,但调用interrupt()似乎不起作用。下面是示例代码:

但输出看起来像线程 1 仍在运行。任何人都可以解释这一点以及如何interrupt()工作?谢谢!