问题标签 [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.
embedded - RTOS - 等待队列中的不同数据
我正在对 TI 的电路板进行编程,并且我希望能够以某种方式将两个不同的 ISR 发布到任务的消息队列中。那部分工作正常。但是,在接收端,是否有任何智能方式让任务挂在其队列上,并根据 ISR 发布的数据对数据执行不同的操作?
基本上,我有一个 LCD 更新任务,它显示来自我的电机的信息。但是,如果我有一个电机传感器 ISR 和一个按钮按下 ISR,它们发送不同的信息进行更新,这可以在一个队列中完成吗?
assembly - 当你禁用中断时会发生什么,你如何处理你不知道如何处理的中断?
当您禁用中断(使用cli
x86 中的指令)时,究竟会发生什么?
PIC 是否等待您打开中断,并在发生这种情况时触发中断?(如果是这样,它等待多长时间,如果时间“到期”会发生什么?)
从设备的角度来看,中断是否会被发送到“黑洞”而没有响应?
PIC 是否以某种方式告诉设备“CPU 很忙”之类的?
还是发生了其他事情?
另外,您如何处理您不知道如何处理的中断?
有什么方法可以告诉 PIC(或设备,如果您不知道设备是什么),“是的,我收到了您的消息,但我不知道如何处理它”?
c - 在 32 位 Open Watcom C 中生成 FAR 跳转指令
我需要生成一个远跳转指令来跳转到另一个 ISR(中断服务程序)。我正在开发一个 32 位 FreeDOS 应用程序。
阅读 OW 手册(cguide.pdf和clr.pdf)后,我想出了两种成功编译的方法,没有任何警告或错误。
我想出的另一种方法是:
现在我的问题是以上两种方法中哪一种更正确或更好?有什么想法或意见吗?
有没有其他方法可以做到这一点?
dos - 用 DOS32/A 替换平面内存模式下的硬件中断
我有一个关于如何在平面内存模式下替换硬件中断的问题......
- 关于我的申请...
- 通过结合Watcom C和DOS32/A创建。
- 为在 DOS 模式下运行而编写(不在 OS 模式下)
- 使用 DOS32/A 现在我可以访问 >1M 内存并分配大内存以使用...(以平面内存模式运行!!!)
- 目前的问题...
- 我想为一张 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 设备配置寄存器 0x5 bit2(中断禁用)= 0
- PCI 设备配置寄存器 0x6 bit3(中断状态) = 1
- PCI 设备配置寄存器 0x3C/0x3D(中断线)= 0xE/0x2
- 在 DOS 中,中断模式是 PIC 模式(8259 模式)和基于引脚的(MSIE=0)
5)显示tick的值,发现还是“0” ...
因此我认为 MyISR() 没有被正确调用......
c - 登录 ISR、sprintf()、printk() 还是其他?
在尝试记录/调试 ISR 时,我看到:
1)sprintf()
在“O'Reilly Linux 设备驱动程序”中用作示例
与 printf() 不同,sprintf() 写入内存而不是控制台,并且似乎没有重入或阻塞问题,对吗?但我在其他论坛上看到了反对 sprintf() 的言论。我不确定这是否只是因为它的性能开销,或者其他?
2)printk()
是另一个我见过人们使用但被指责的问题,再次是性能问题(也许没有别的?)
如今,在 Linux 中记录或调试 ISR 时,通常使用什么好的方法/功能?
interrupt - 静态定义的 IDT
我正在开发一个对启动时间有严格要求的项目。目标架构是在 32 位保护模式下运行的基于 IA-32 的处理器。确定可以改进的领域之一是当前系统动态初始化处理器的 IDT(中断描述符表)。由于我们没有任何即插即用的设备并且系统是相对静态的,我希望能够使用静态构建的 IDT。
然而,这对于 IA-32 架构来说是很麻烦的,因为 8 字节的中断门描述符拆分了 ISR 地址。ISR 的低 16 位出现在描述符的前 2 个字节中,其他一些位填充接下来的 4 个字节,最后 ISR 的最后 16 位出现在最后 2 个字节中。
我想使用一个 const 数组来定义 IDT,然后简单地将 IDT 寄存器指向它,如下所示:
等等
显然这不起作用,因为在 C 中这样做是非法的,因为 myIsr 不是常量。它的值由链接器解析(它只能做有限的数学运算)而不是编译器。
关于如何做到这一点的任何建议或其他想法?
谢谢,
linux - 发出信号并中断比较
根据各种参考资料,我对Linux 中信号的主观定义是“用于通知进程发生特定事件的触发器。这里的事件可能是指软件异常。此外,信号也可能用于 IPC 机制。 " 我的问题是
- 我认为只有异常(软件中断)是通过信号通知的。硬件中断的情况呢?
- 信号的各种来源是什么?在我看来,内核始终是信号的来源。(用于 IPC 时除外)
- 信号处理程序和 ISR 之间的区别?
- 信号阻塞和中断屏蔽的区别?
c - 使用自定义 ISR 通过 c 中的寄存器进行简单算术
我正在编写一个程序,我必须在其中制作自己的 ISR 并执行基本算术运算,例如当我将 AH 设置为 1 时,它应该添加 BX 和 CX 寄存器。当 AH 设置为 2 时,它应该对 BX 和 CX 寄存器进行减法运算。
我的问题是产生的结果不准确。我的代码如下:
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 是否有某种方法可以在避免上述竞争条件的同时揭露自身?
deadlock - 小型嵌入式系统上 IRQ 中的自旋锁
我正在一个没有操作系统的 ARM 微控制器上开发一个小型嵌入式系统。它有几种不同类型的中断发生(按钮按下、A 到 D 转换、定时器等)并且只有一个线程在运行。
我想要一个 FIFO 事件队列来处理,其中每个中断服务例程将其事件添加到队列中,并且主(也是唯一的)线程从队列中删除要处理的事件。显然在中断服务例程中访问队列数据结构是危险的,但是自旋锁会导致死锁,因为如果主线程有锁并且发生中断,ISR 将永远等待锁。
当然,我已经知道我可以在主线程处理队列时禁用中断,但这并不理想。
在这里进行的最佳方式是什么?
谢谢