标签: irq

可以使用 MSI-X 设备设置 IRQ 关联(Linux)吗?

我过去在 Linux 上通过设置 proc 文件的值来设置 IRQ 关联。[1] 但是,我注意到,当我在使用 MSI-X 的设备 (PCIe) 的系统上执行此操作时,我想为例如 NIC 设置关联性,IRQ 的每个内核的 /proc/interrupt 计数器都会增加,并且不是针对我设置的单核。在非 MSI-X 系统中,指定的内核响应中断。

我正在使用 Linux 内核 3.11。

简短:可以为使用 MSI-X 中断的设备设置 IRQ 关联吗?

[1] https://www.kernel.org/doc/Documentation/IRQ-affinity.txt

affinity irq linux-kernel

5
推荐指数
1
解决办法
1299
查看次数

自定义RS485协议

我正在为分布式系统中的串行通信编写一个简单的多点RS485协议.我正在使用一个可寻址的模型,其中从设备被给予一个20ms的窗口来响应.主uC轮询连接的设备以​​进行更新,并相应地做出响应.我使用了校验和并采取必要的超限预防措施,以确保连接的设备不会响应格式错误的消息.事实证明,这种方法在大约99%的情况下都有效,但如果在通信会话期间引入了新设备,则会丢失数据包.插入新设备"热"将对从设备监控的信号产生负面影响,如果只是在极短的时间内.我是工程的软件方面,但是如何在不尝试重新创建TCP的情况下缓解这种情况呢?我们使用轮询模型,因为它很快并且对我们的应用程序来说工作得很好,不需要RTOS功能.我在每个cpu上有很多周期,用基本术语来思考.

c embedded irq rs485

4
推荐指数
1
解决办法
2003
查看次数

request_threaded_irq()在驱动程序中使用为什么不request_irq()?两者有什么不同?

我发布这是讨论request_threaded_irq的线程,但我没有得到任何答复.所以我刚刚发布它.

我正在研究用于电容式触摸屏的触摸屏驱动程序.它使用request_threaded_irq()调用而不是request_irq().我无法理解两者之间的基本差异.它说 :-

名称

request_threaded_irq - 分配中断线

概要

int request_threaded_irq(unsigned int irq,irq_handler_t handler,irq_handler_t thread_fn,unsigned long irqflags,const char*devname,void*dev_id);

参数

  1. irq - 要分配的中断线
  2. handler - IRQ发生时要调用的函数.线程中断的主处理程序如果为NULL且thread_fn!= NULL,则安装默认的主处理程序
  3. thread_fn - 从irq处理程序线程调用的函数如果为NULL,则不会创建irq线程
  4. irqflags - 中断类型标志
  5. devname - 声明设备的ascii名称
  6. dev_id - 传递回处理函数的cookie

Handler和Thread_fn参数是令人困惑的.此外,驱动程序中没有定义工作功能.

这是我所指的司机.

有人可以帮我理解这个吗?

kernel irq

4
推荐指数
1
解决办法
2万
查看次数

Linux内核需要多少指令来处理手臂皮层A9上的中断?

我想估计一个ARM cortex A9核心处理IRQ 所需的操作码数量.

假设我使用Linux内核3.4,调用irq和执行它需要多少操作码irq_handler

linux arm irq linux-device-driver linux-kernel

4
推荐指数
2
解决办法
1177
查看次数

/ proc/interrupts如何更新?

我想知道如何 /proc/interrupts更新?

它只有irq探测过的驱动程序,还是包含irqs系统中所有可能的列表?

c linux irq linux-kernel

4
推荐指数
2
解决办法
7889
查看次数

Linux内核ARM异常堆栈初始化

我在飞思卡尔i.MX6(ARM Cortex-A9)上使用Linux内核3.0.35.在运行内核OOPS后,我试图理解异常堆栈初始化.这是我到目前为止所发现的.

arch/arm/kernel/setup.c中的cpu_init()中,我看到异常堆栈被初始化:

struct stack {
    u32 irq[3];
    u32 abt[3];
    u32 und[3];
} ____cacheline_aligned;

static struct stack stacks[NR_CPUS];

void cpu_init(void)
{
    struct stack *stk = &stacks[cpu];

    ...<snip>

    /*
     * setup stacks for re-entrant exception handlers
     */
    __asm__ (
     "msr   cpsr_c, %1\n\t"
    "add    r14, %0, %2\n\t"
    "mov    sp, r14\n\t"
    "msr    cpsr_c, %3\n\t"
    "add    r14, %0, %4\n\t"
    "mov    sp, r14\n\t"
    "msr    cpsr_c, %5\n\t"
    "add    r14, %0, %6\n\t"
    "mov    sp, r14\n\t"
    "msr    cpsr_c, %7"
        :
        : "r" (stk),
          PLC (PSR_F_BIT …
Run Code Online (Sandbox Code Playgroud)

stack arm interrupt irq linux-kernel

4
推荐指数
1
解决办法
2817
查看次数

检索ARM Cortex M0上的异常的返回地址

我试图在我的代码中检索IRQ处理程序的返回地址.我的目标是在看门狗定时器到期之前和复位之前使用WDT_IRQHandler()保存PC的值以进行调试.我也在用其他IRQ测试这种方法来检查我是否掌握了这个想法.但似乎我没有.

我已经阅读了可用的文档.我知道当异常发生时,8个寄存器被推送到堆栈:R0,R1,R2,R3,R12,LR,PC和XPSR.

我还读过堆栈自动双字对齐.所以在我看来,检索返回地址就像这样简单:

  • 使用__builtin_frame_address(0)检索sp地址;
  • 添加堆叠PC的偏移量(0x18),并读取值,该值应该是处理程序返回时将恢复到PC的值.

检查附加的调试器,似乎不是这种情况,该内存地址的内容并不总是指向闪存区域,甚至指向有效区域,并且在任何情况下,它都不是PC在POP指令.

代码工作正常,所以我认为这是一个问题,我理解它是如何工作的.

如果我检查反汇编,在某些IRQ中,在POPping(?)之前向sp添加一个常量

00001924: 0x000009b0 ...TE_IRQHandler+280   add     sp, #36 ; 0x24
00001926: 0x0000f0bd ...TE_IRQHandler+282   pop     {r4, r5, r6, r7, pc}
Run Code Online (Sandbox Code Playgroud)

在其他IRQ中,这不会发生.

我知道可能会发生更多的寄存器被推送到堆栈,所以我如何确定在哪个偏移量来检索PC?

如果我在代码仍在IRQ处理程序中时检查SP周围的内存转储,我可以发现返回地址,但它始终位于一个奇怪的位置,与SP相比具有负偏移.我无法理解如何获得正确的地址.

stack arm watchdog irq cortex-m

4
推荐指数
1
解决办法
1618
查看次数

如何从x86中的中断处理程序获取中断号?

在x86上以保护模式触发中断时,是否可以找出触发的中断号?例如,假设我调用了int 0xFF.在处理程序中我可以找到int 0xFF被调用?

x86 assembly interrupt irq

3
推荐指数
1
解决办法
1647
查看次数

request_threaded_irq的"处理函数"中的I2c读取和写入操作如何影响整个驱动程序.

我有一个带处理函数的驱动程序代码和request_threaded_irq的线程函数,类似于:

irq-handler fn()
{
      /*disable device interrupt*/
      i2c read from register;
      set disable bit to client-device-interrupt 
      i2c write back;
      return IRQ_WAKe_THREAD;
}



irq-thread fn()
{
      i2c read from register;
      ....
      ....
      /*enable device interrupt*/
      i2c read from register;
      set enable bit to client-device-interrupt 
      i2c write back;
      /*Rest of the operation*/
      ..........
      ..........
      return IRQ_HANDLED;
}
Run Code Online (Sandbox Code Playgroud)

关于上述实施,我几乎没有问题.

  1. "处理程序fn"中的2 i2c操作是否需要相当长的时间.

  2. 我是否需要在"handler fn"atomic中进行位操作?

  3. 我应该将执行操作直到"启用设备中断"从"线程fn"移动到"处理程序fn"(这将花费我多4次i2c操作和一位操作完全)? - 根据上面的代码实现,我有可能错过中断的原因.

  4. 如果我这样做(根据问题3).它如何影响其他设备中断.(因为我基本怀疑硬IRQ上下文中的"处理程序fn"是否在禁用中断的情况下运行)

请为我提供一个针对上述场景的良好和最佳解决方案.

提前致谢.

interrupt irq linux-device-driver linux-kernel

3
推荐指数
1
解决办法
2729
查看次数

Linux下Raspberry Pi上的计时器中断

是否可以在Raspberry Pi上设置硬件计时器外设并在特定时间(在Linux下运行)获得中断?有图书馆/例子吗?

我知道当引脚通过connectionPi(当以管理员权限运行时)发生引脚更改时,您会得到一个irq,因此,如果有一个免费的定时器外设,这似乎是可能的。

Pi论坛上的此帖子暗示有一个免费的STC注册,并且注册提供了一些信息,但被标记为“ BareMetal”,我认为这意味着不涉及Linux?

背景:我知道这根本不是Linux的优势,但是我有兴趣向Espruino JS解释器添加硬件计时器功能。它最初是为微控制器设计的,包含一些希望通过计时器IRQ运行的代码(例如,用于软件PWM,定时脉冲以及其他位和鲍勃)-如果在线程中运行,则该部分实际上是无用的。

timer interrupt irq raspberry-pi

3
推荐指数
1
解决办法
8408
查看次数