问题标签 [isr]

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 投票
3 回答
8193 浏览

debugging - 断点可以在 ISR 中使用吗?

断点可以在中断服务例程 (ISR) 中使用吗?

0 投票
1 回答
120 浏览

windows-mobile - 将驱动程序从 PPC2003 移植到 WM6:未调用 ISR

我正在尝试移植我为使用 iPAQ hx4700 的 CF 端口的自定义设备开发的驱动程序。

目标是运行 Windows Mobile 6 的新 iPAQ 210。尽管 WM6(和 Windows CE 5.0)切换到新的驱动程序架构,但它声称支持旧版驱动程序。

中断处理部分外,一切正常(注册、内存映射等) 。我注册了我的 ISR,CardRequestIRQ()但是当生成 IRQ 时,我的 ISR 永远不会被调用。

请注意:我正在开发一个定义明确的平台(iPAQ 210),所以没有 Platform Builder、OAL、...

有没有人有过这种事情的经验可以帮助我对这件事有所了解?

0 投票
11 回答
102494 浏览

arm - FIQ和IRQ中断系统有什么区别?

我想知道任何微处理器中FIQ和IRQ中断系统的区别,例如:ARM926EJ。

0 投票
2 回答
11773 浏览

interrupt - How CPU finds ISR and distinguishes between devices

I should first share all what I know - and that is complete chaos. There are several different questions on the topic, so please don't get irritated :).

1) To find an ISR, CPU is provided with a interrupt number. In x86 machines (286/386 and above) there is a IVT with ISRs in it; each entry of 4 bytes in size. So we need to multiply interrupt number by 4 to find the ISR. So first bunch of questions is - I am completely confused in mechanism of CPU receiving the interrupt. To raise an interrupt, firstly device shall probe for IRQ - then what ? The interrupt number travels "on IRQ" towards CPU? I also read something like device putting ISR address on data bus ; whats that then ? What is the concept of devices overriding the ISR. Can somebody tell me few example devices where CPU polls for interrupts? And where does it finds ISR for them ?

2) If two devices share an IRQ (which is very much possible), how does CPU differs amongst them ? What if both devices raise an interrupt of same priority simultaneously. I got to know there will be masking of same type and low priority interrupts - but how this communication happens between CPU and device controller? I studied the role of PIC and APIC for this problem, but could not understand.

Thanks for reading. Thank you very much for answering.

0 投票
1 回答
2430 浏览

linux-device-driver - 如何在驱动程序代码中注册一个函数作为它的 ISR

根据我之前关于 Linux 内核开发的问题得到的反馈,

我编写了一个驱动程序(在 Linux 内核 v2.6.32 中),通过将其与现有驱动程序进行比较并大量“借用”其代码。司机注册很好。init() 和 probe() 工作正常。我还可以访问外围设备寄存器。:-)

但是我对IRQ/ISR有点模糊。外围设备是输入设备,并在 GPIO 引脚上引发中断。

我如何从当前状态继续处理 IRQ 并执行我的 ISR 功能?

0 投票
2 回答
526 浏览

x86 - 发生不可屏蔽中断时的中断控制器的服务中寄存器位

我有以下问题(关于x86架构):

当不可屏蔽中断(例如NMI)中断正在进行的可屏蔽中断时会发生什么?当服务可屏蔽中断或服务中寄存器中的所有位都被清除时,抢占中断的相应 ISR(服务中寄存器)标志是否保持设置在中断控制器的 ISR 寄存器中?

提前致谢。

0 投票
4 回答
28551 浏览

assembly - 如何为中断服务程序保存 x86_64 上的寄存器?

我正在查看学校项目中的一些旧代码,并尝试在我的笔记本电脑上编译它时遇到了一些问题。它最初是为旧的 32 位版本的 gcc 编写的。无论如何,我试图将一些程序集转换为 64 位兼容代码并遇到一些障碍。

这是原始代码:

pusha在 64 位模式下无效。那么在 64 位模式下,在 x86_64 汇编中执行此操作的正确方法是什么?

pusha在 64 位模式下无效肯定是有原因的,所以我觉得手动推送所有寄存器可能不是一个好主意。

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 投票
2 回答
374 浏览

compiler-construction - 68040 If Else 的分支错误

那里有什么好的 68k 汇编程序员吗?我正在为摩托罗拉 68040 使用商业 Green Hills 编译器,我从代码中看到了一些非常奇怪的行为。有时,代码会进行 if/else 比较,并选择错误的分支。例如:

代码有时会d!?我发现无论何时发生此错误,总会有一个特定的 ISR 中断比较。我查看了为 ISR 生成的程序集,发现了一些对我来说没有意义的东西。首先,看起来浮点状态寄存器 FPSR、FPCR 和 FPIAR 没有保存在 ISR 中。这可以解释为什么 if/elses 选择了错误的分支。FPSR 寄存器用于确定比较的结果,如果该寄存器在 ISR 中被覆盖,则分支可能会采用错误的路径。以下是编译器生成的入口和出口程序集:

我查看了 Programmer's Reference Manual 并且找不到任何暗示 FSAVE 或 FMOVEM 保存 FP 状态寄存器的内容。实际上,我看到一条评论表明它没有,“FSAVE 不保存浮点单元的程序员模型寄存器;它只保存机器的用户不可见部分。” 所以我添加了一些我自己的程序集来保存 ISR 开始时的寄存器,并在最后恢复它们,这极大地提高了性能,但我仍然看到一些问题。以下是我所做的补充;备份变量在 C 代码中键入为 unsigned long:

我很难相信编译器实际上存在错误,因为没有保存寄存器。所以我开始查看 FPx 和 Dx 的值,看看它们是否恢复到正确的值,看起来它们不是。但是,我不是 100% 不会用我的修改来污染汇编代码。以下是我为保存寄存器添加的代码;调试变量的类型为无符号长整数:

简而言之,我的问题是,

1) 生成的程序集是否存在问题,因为它没有保存 FPSR、FPCR 和 FPIAR 寄存器,以及

2)当我进入和退出 ISR 时,我是否正确保存了寄存器的值?

如果我有另一个编译器可以比较,那就太好了。不幸的是,我无法将调试器附加到代码中。我在 C/C++/C#/Java/Python/PHP/等方面有丰富的经验,但我远非汇编专家。

任何想法表示赞赏!

0 投票
1 回答
1351 浏览

c++ - ISR 中使用的循环缓冲区,声明为 volatile,会出错。为什么 ?如何解决这个问题?

有一个名为 'ByteBuffer' 的 Arduino 库(在此处找到),它是一个循环缓冲区实现。我通过取消对所有非字节数据类型的支持并添加了一些便利方法,对它进行了轻微修改(称为“ByteBufferPro”)。我打算在我的中断服务例程中使用它,这已经在做一些繁重的工作了。为了减轻 ISR 的一些工作量,我打算让 ISR 在循环缓冲区中推送信息字节(因为捕获/存储它们是时间关键的),但该信息的实际处理不是时间关键的,我在主循环()中做的。

按照可以在 ISR 中更新的任何变量在声明中都应具有“volatile”限定符的逻辑,我确实将缓冲区声明为 volatile,但现在我看到了这些编译错误:-

想知道是什么原因,以及如何解决这个问题?考虑到关于“this”指针的 cribbage,我有一种感觉,如果我将 ByteBuffer 的实现从 C++ 转换为 C(OO 到程序),这应该是一种简单的修复方法,尽管我真的很喜欢 OO语义。会这样做,如果没有其他办法。