问题标签 [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 投票
1 回答
378 浏览

embedded - RTOS - 等待队列中的不同数据

我正在对 TI 的电路板进行编程,并且我希望能够以某种方式将两个不同的 ISR 发布到任务的消息队列中。那部分工作正常。但是,在接收端,是否有任何智能方式让任务挂在其队列上,并根据 ISR 发布的数据对数据执行不同的操作?

基本上,我有一个 LCD 更新任务,它显示来自我的电机的信息。但是,如果我有一个电机传感器 ISR 和一个按钮按下 ISR,它们发送不同的信息进行更新,这可以在一个队列中完成吗?

0 投票
2 回答
3355 浏览

assembly - 当你禁用中断时会发生什么,你如何处理你不知道如何处理的中断?

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

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

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

  • PIC 是否以某种方式告诉设备“CPU 很忙”之类的?

  • 还是发生了其他事情?

另外,您如何处理您不知道如何处理的中断?
有什么方法可以告诉 PIC(或设备,如果您不知道设备是什么),“是的,我收到了您的消息,但我不知道如何处理它”?

0 投票
3 回答
762 浏览

c - 在 32 位 Open Watcom C 中生成 FAR 跳转指令

我需要生成一个远跳转指令来跳转到另一个 ISR(中断服务程序)。我正在开发一个 32 位 FreeDOS 应用程序。

阅读 OW 手册(cguide.pdfclr.pdf)后,我想出了两种成功编译的方法,没有任何警告或错误

我想出的另一种方法是:

现在我的问题是以上两种方法中哪一种更正确或更好?有什么想法或意见吗?

有没有其他方法可以做到这一点?

0 投票
2 回答
1249 浏览

dos - 用 DOS32/A 替换平面内存模式下的硬件中断

我有一个关于如何在平面内存模式下替换硬件中断的问题......

  1. 关于我的申请...
    • 通过结合Watcom CDOS32/A创建。
    • 为在 DOS 模式下运行而编写(不在 OS 模式下)
    • 使用 DOS32/A 现在我可以访问 >1M 内存并分配大内存以使用...(以平面内存模式运行!!!)
  2. 目前的问题...
    • 我想为一张 PCI 卡写一个 ISR(中断服务程序)。因此我需要“替换”硬件中断。
    • 前任。PCI 卡的中断线 = DOS 中的 0xE。这意味着该设备将通过 8259 的 IRQ 14 发出中断。

但是我没有如何实现我的目标,在平面模式下替换这个中断?

@resource 我发现... - 在 watcom C 的库中,有一个示例使用 _dos_getvect、_dos_setvect 和 _chain_intr 来挂钩 INT 0x1C...我测试了这段代码,发现没问题。但是当我将它应用于我的案例时:INT76(其中 IRQ 14 是 "INT 0x76" <- (14-8) + 0x70 )然后什么也没发生......

  • 我检查了硬件中断是否生成,但我自己的 ISR 没有被调用......

我会失去什么吗?或者我可以使用任何功能来实现我的目标?

==================================================== ==============

[20120809] 我尝试使用DPMI调用0x204 和 0x205并发现MyISR()仍未被调用。我描述了我所做的如下,也许你们都可以给我一些建议!

1)使用内联汇编实现DPMI调用0x204和0x205并测试OK...

前任。使用 DPMI 0x204显示 16 个 IRQ 的中断向量,我得到 ( selector:offset ) 以下结果:8:1540 (INT8), 8:1544 (INT9),....., 8:1560 (INT70), 8 :1564 (INT71),..., 8: 157C (INT77)

前任。使用DPMI 0x205设置IRQ14(INT76)的中断向量,返回CF=0,表示成功

2)创建我自己的 ISR MyISR() 如下:

3)通过 DPMI 调用 0x205设置新的中断向量:

然后 sts = 0(CF=0) 表示成功!

  • 这里有一件奇怪的事情是:我的应用程序在平面内存模型中运行,我认为 MyISR() 的选择器应该为 0...但是如果 DPMI 调用 0x205 的选择器 = 0,那么我得到 CF=1 和 AX = 0x8022,表示“无效的选择器”!

4)让硬件中断产生,证据是:

  • PCI 设备配置寄存器 0x​​5 bit2(中断禁用)= 0
  • PCI 设备配置寄存器 0x​​6 bit3(中断状态) = 1
  • PCI 设备配置寄存器 0x​​3C/0x3D(中断线)= 0xE/0x2
  • 在 DOS 中,中断模式是 PIC 模式(8259 模式)和基于引脚的(MSIE=0)

5)显示tick的值,发现还是“0” ...

因此我认为 MyISR() 没有被正确调用......

0 投票
1 回答
900 浏览

c - 登录 ISR、sprintf()、printk() 还是其他?

在尝试记录/调试 ISR 时,我看到:

1)sprintf()在“O'Reilly Linux 设备驱动程序”中用作示例

与 printf() 不同,sprintf() 写入内存而不是控制台,并且似乎没有重入或阻塞问题,对吗?但我在其他论坛上看到了反对 sprintf() 的言论。我不确定这是否只是因为它的性能开销,或者其他?

2)printk()是另一个我见过人们使用但被指责的问题,再次是性能问题(也许没有别的?)

如今,在 Linux 中记录或调试 ISR 时,通常使用什么好的方法/功能?

0 投票
1 回答
627 浏览

interrupt - 静态定义的 IDT

我正在开发一个对启动时间有严格要求的项目。目标架构是在 32 位保护模式下运行的基于 IA-32 的处理器。确定可以改进的领域之一是当前系统动态初始化处理器的 IDT(中断描述符表)。由于我们没有任何即插即用的设备并且系统是相对静态的,我希望能够使用静态构建的 IDT。

然而,这对于 IA-32 架构来说是很麻烦的,因为 8 字节的中断门描述符拆分了 ISR 地址。ISR 的低 16 位出现在描述符的前 2 个字节中,其他一些位填充接下来的 4 个字节,最后 ISR 的最后 16 位出现在最后 2 个字节中。

我想使用一个 const 数组来定义 IDT,然后简单地将 IDT 寄存器指向它,如下所示:

等等

显然这不起作用,因为在 C 中这样做是非法的,因为 myIsr 不是常量。它的值由链接器解析(它只能做有限的数学运算)而不是编译器。

关于如何做到这一点的任何建议或其他想法?

谢谢,

0 投票
3 回答
38328 浏览

linux - 发出信号并中断比较

根据各种参考资料,我对Linux 中信号的主观定义是“用于通知进程发生特定事件的触​​发器。这里的事件可能是指软件异常。此外,信号也可能用于 IPC 机制。 " 我的问题是

  • 我认为只有异常(软件中断)是通过信号通知的。硬件中断的情况呢?
  • 信号的各种来源是什么?在我看来,内核始终是信号的来源。(用于 IPC 时除外)
  • 信号处理程序和 ISR 之间的区别?
  • 信号阻塞和中断屏蔽的区别?
0 投票
0 回答
181 浏览

c - 使用自定义 ISR 通过 c 中的寄存器进行简单算术

我正在编写一个程序,我必须在其中制作自己的 ISR 并执行基本算术运算,例如当我将 AH 设置为 1 时,它应该添加 BX 和 CX 寄存器。当 AH 设置为 2 时,它应该对 BX 和 CX 寄存器进行减法运算。

我的问题是产生的结果不准确。我的代码如下:

0 投票
1 回答
574 浏览

linux-kernel - Linux IRQ:在 ISR 中取消屏蔽 IRQ

我有一个 IRQ 正在使用handle_level_irq(). 大多数时候,ISR 要求安排下半部分,但偶尔,它能够确定它是虚假的,并且不想安排下半部分(出于性能原因)。问题是,在后一种情况下,存在竞争条件。如果 ISR 确定它是虚假的,它将取消屏蔽中断并准备退出(注意——此时 ISR 不受保护desc->lock)。但是随后,在第二个 CPU 上触发了中断,根据handle_level_irq(),抓取desc->lock,屏蔽 IRQ,确定 ISR 正在第一个 CPU 上进行,因此它解锁desc->lock并退出。然后第一个 CPU 上的原始 ISR 也将退出,使中断一直被屏蔽。

除非我需要,否则我希望能够不安排下半部分,那么 ISR 是否有某种方法可以在避免上述竞争条件的同时揭露自身?

0 投票
1 回答
732 浏览

deadlock - 小型嵌入式系统上 IRQ 中的自旋锁

我正在一个没有操作系统的 ARM 微控制器上开发一个小型嵌入式系统。它有几种不同类型的中断发生(按钮按下、A 到 D 转换、定时器等)并且只有一个线程在运行。

我想要一个 FIFO 事件队列来处理,其中每个中断服务例程将其事件添加到队列中,并且主(也是唯一的)线程从队列中删除要处理的事件。显然在中断服务例程中访问队列数据结构是危险的,但是自旋锁会导致死锁,因为如果主线程有锁并且发生中断,ISR 将永远等待锁。

当然,我已经知道我可以在主线程处理队列时禁用中断,但这并不理想。

在这里进行的最佳方式是什么?

谢谢