问题标签 [irq]
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.
linux - request_irq 成功但从未检测到中断
我在 ARM 处理器上运行嵌入式 linux 3.2.6。我正在使用修改版的 atmel 串行驱动程序来控制我设备上的 4 个 USART 端口。当我使用用内核编译的驱动程序时,一切正常。但我想将驱动程序作为内核模块运行。我进行了所有必要的更改并禁用了内部驱动程序,一切似乎都很好。4 个 tty 设备注册成功,我可以看到我的所有探测和初始化功能都正常工作。
所以这就是问题所在:当我尝试写入任何设备时,我的“开始传输”函数被调用,但随后等待来自 usart 的中断,该中断从未发生。所以写入只是挂起,使用逻辑分析仪我可以看到 RTS 被断言但 tx 线上没有字节显示。我知道我对 request_irq 的调用成功,但我从未在 /proc/interrupts 中看到任何 irq 条目。在驱动程序中,我还尝试使用 request_irq 为 gpio 线注册一个单独的中断处理程序,这工作正常。
我知道这是一个可能很难诊断的问题,但我正在寻找任何可能的建议,这些建议可以引导我朝着正确的方向寻找解决方案。如果您需要任何澄清,请告诉我。谢谢
linux - 为什么 ARM 在 ISR 结束时处理 IPI
我正在研究 Linux 上的 IRQ 处理。我有一个问题,为什么我们需要在每个 ISR [for SMP] 结束时处理 IPI。IPI 有什么特别之处吗?为什么我们不在 do_asm_IRQ 中处理其他中断。
任何建议将不胜感激。
http://lxr.oss.org.cn/source/arch/arm/include/asm/entry-macro-multi.S?v=3.5.2;a=arm
linux - 如何激活linux中的所有ksoftirqds?(关于linux内核的net stack)
我在 4 核英特尔机器上有一个多队列 NIC 卡,我将 NIC 卡的每个队列绑定在一个 cpu 内核上(设置 /proc/irq/xxx/smp_affinity)假设 core0 上的 queue0,core1 上的 queue1 等等。
据说软中断将在发生硬件中断的同一个内核上调用。为什么 ksoftirqd 不能在我的机器上并行运行?它只是一个内核线程(如 ksoftirqd/2)将使用 100% 的内核,但其他内核线程为 0%
当我使用
我可以看到所有的包甚至都分发到了所有的 NIC 队列中。
更新:
这里是100%softirq问题的解决方案,如果你能看懂中文 http://hi.baidu.com/higkoo/item/42ba6c353bc8aed76d15e9c3(请看#7)如果不行,哪个博客说你可以再加一张卡,这个问题将得到解决
timer - 暂时禁用定时器中断
我正在 stm32f4xx uC 上用 C 语言开发一个嵌入式项目。
我有一段代码连续执行循环操作 XYZ,有时 TIM4 中断会更改一些全局参数并导致操作 XYZ 重新启动。
代码是这样的:
XYZ 是一项复杂的操作,涉及在缓冲区和其他缓冲区之间传输数据。
TIM4 中断处理程序执行此操作:停止 XYZ 并更改一些影响 XYZ 操作的全局变量。
所以基本上我希望 XYZ 重复执行,TIM4 中断来停止 XYZ,更改参数,然后必须通过使用新的全局参数重新启动 XYZ 来重新启动循环。
问题是:由于 XYZ 有许多指令,TIM4 IRQ 可能会在它的中间出现,并且在 IRQHandler 更改全局变量之后,操作从 XYZ 的中间恢复,这会破坏程序。
我的初始解决方案:使用 __disable_irq() 禁用线路 A 上的中断,并使用 __enable_irq() 在线路 B 上恢复它们
失败,因为 XYZ 复杂操作必须使用其他中断(TIM4 除外)。
下一个解决方案仅禁用线路 A 上的 TIM4 中断:
并在 B 行重新启用它:
失败,因为我丢失了中断:当 int 恢复时,在 XYZ 期间到达的中断被忽略。这是一个大问题(其中一个原因是 TIM4 IRQHandler 更改了全局变量,然后再次激活 TIM4 以便稍后发出中断,我这样做是因为中断之间的周期不同)。
谁能给我一个解决这个问题的方法?有没有更好的方法来禁用/恢复 TIM4 IRQ 而不会丢失任何中断?
assembly - IRQ 在 LPC238 (Crossworks + GCC) 上无法正常工作
我目前正在使用 Crossworks ARM (2.1),我的 LPC2368 MCU 上的中断有一些问题。
两个操作过程(在 UART 示例中):
1)工作一:
- 整个 uart 初始化和 IRQ 实现位于 main.c 文件中
- 代码是使用 VECTORED_IRQ_INTERRUPTS 标志构建的,因为 Crossworks 需要它
- 一切正常(回声测试仪正在响应)
- 从 IRQ 退出后,cpu 将其模式更改为主管(它也设置了构建标志)这很酷并且可以工作..
2)不工作之一:
- cpu 由位于除 main.c ((ProjDir)/SystemCtrl/) 之外的其他目录中的其他文件中的例程初始化
- uart初始化函数设置在嵌套目录((ProjDir)/SystemCtrl/LPC/libuart)
- 启动后一切正常。波特率很好,UART 已正确初始化
第一件坏事:当第一次收到数据时,IRQ被正确调用。但接收到的数据不同(即发送:0x31,接收:0x82)。
第二个坏事:即使接收到错误的数据,echo 也会向 PC 发送不同的值!(即发送:0x31,接收:0x82,回显将发送:0xFE)
第三个坏事:IRQ 正在退出并且 CPSR 中的 IRQ 模式仍然设置!I 标志未清除。IRQ 具有属性((interrupt(IRQ)))。并且仍然无法正常工作。
有人知道吗?我不知道出了什么问题。我什至更改了堆栈大小(我认为它可能在奇怪的空间中以某种方式丢失了)。嵌套目录如何破坏一切?它还使用干净的项目进行了测试,无需更改任何设置。
embedded - FIQ 和 IRQ 混合使用导致内核冻结,为什么?
3 个中断使能,1 个 UART 到 IRQ(串行端口),Timer1 到 IRQ(控制闪烁的 LED),Timer0 到 FIQ(生成输出步进信号)。
第一个 FIQ 处理程序为空:
IRQ 处理程序:
上面的代码运行良好,LED 闪烁、UART 响应和其他功能都很好。但是在我向 FIQ 处理程序添加了一些代码之后,主要是设置一个计数器(uint16)并让 IO 变为高/低:
CPU 将在启动后几秒钟(约 2 秒)锁定自身,然后 LED 停止闪烁,UART 无响应。甚至变量 cts 在开始时也设置为 0(因此无法输入 if())。
我首先认为这可能是因为 timer0 设置得太快(这样更多的 FIQ 堆叠在一起而更少被清除)。所以我将 timer0 设置为不那么频繁。而且..好吧,启动时似乎没问题,LED一直闪烁......但是如果我通过串行端口(UART)发送一些字符,系统会立即再次锁定。-_-!怎么了?
请,如果我错过了要写在这里的任何重要信息,请告诉我。
c - 实时C编程vicInstallHandler需要帮助理解
我去过我需要比评论更详细地理解这段代码,soemone可以帮忙吗?
linux-kernel - 对于共享中断线,我如何找到要使用的中断处理程序?
对于共享中断线,我可以有多个中断处理程序。内核将依次调用该特定共享行的所有处理程序。据我所知,每个处理程序在调用时都会通知内核它是否是要调用的正确处理程序。
我的问题是这是如何确定的,有没有办法检查内存映射寄存器,告诉特定设备的状态,或者是否有其他硬件机制?处理程序如何知道相应的设备确实是发出中断的设备?
此信息是否通过设备和处理器中断线之间的中断控制器中继?
linux - 为了处理 arm cortex A9 上的中断,Linux 内核需要多少条指令?
我想估计ARM
cortex A9
单个内核处理 IRQ 所需的操作码数量。
假设我使用 Linux 内核,调用和执行3.4
需要多少操作码?irq
irq_handler
linux-kernel - in_irq() 可靠吗?
您可以知道您处于硬件中断中,因为 in_irq() 返回 true。
小心。请注意,如果禁用中断,这将返回误报(见下文)。
在 Linux 内核 2.6.32 或 x86 上的更新版本中,是否真的in_irq()
可能返回非零而不是在 hardirq 上下文中?
在我对内核 2.6.32 (Debian 6) 和 3.4 (OpenSUSE 12.1) 的实验中,in_irq()
从进程上下文调用时总是返回 0,即使它是在 和 之间调用local_irq_disable()
的local_irq_enable()
。当我使用禁用中断而不是local_irq*
.
从内核的源代码中,我目前看不到如何in_irq()
返回误报。有人可以澄清一下吗?
编辑:我也尝试了*_irqsave()
和*_irq()
spinlock API 以及local_irq_save()
/ local_irq_restore()
,结果是一样的,也就是说,in_irq()
当中断被禁用时返回 0 。通过 x86 上的机器指令显式禁用中断cli
也不会强制 in_irq() 返回非零值。