标签: interrupt-handling

中断描述符表(IDT)修改

在linux内核的控制流程中,发现控件移动到具有中断位置的IDT(例如:0x80系统调用).然后控制移动到适当的系统调用.另请阅读IDT仅在引导时初始化.

我想更多地了解来自真实内核的IDT信息,例如它的位置.还想知道,在其他任何时候它被修改了吗?

请帮忙.

linux interrupt system-calls linux-kernel interrupt-handling

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

当我们使用irq_set_chained_handler时,irq线是否会被禁用?

当我们使用irq_set_chained_handler时,当我们为关联的处理程序提供服务时,irq行不会被禁用,就像request_irq一样.

irq linux-device-driver linux-kernel interrupt-handling embedded-linux

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

Linux 串行通信与中断

我有两个设备通过串行端口相互连接。一个作为主人,另一个作为奴隶。

主设备是一个基于 ARM 的套件,运行 Linux。

目前的情况是master发送命令然后轮询com端口直到slave回复。

现在我不想使用轮询。我需要处理器执行其他任务,直到从机回复。

我知道解决方案是使用中断,但找不到更多详细信息。我找到了一些使用信号的解决方案。它以非阻塞模式读取 tty,然后在数据准备好时发送 io 信号。

那么,串行通信中中断和信号有什么区别呢?当使用中断时我应该编写设备驱动程序或内核模块等吗?为了不使用轮询,还有其他有效的解决方案吗?

linux signals serial-port linux-kernel interrupt-handling

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

软件生成的中断和软件生成的异常有什么区别?

我正在阅读英特尔手册 3A 第 6 章中断和异常处理。

\n\n

中断和异常分别有3个来源。

\n\n

对于软件生成的中断,它说:

\n\n
\n

INT n 指令允许通过提供中断向量号作为操作数从软件内部生成中断。例如,INT 35 指令强制隐式调用中断 35 的中断处理程序。从 0 到 255 的任何中断向量都可以用作该指令中的参数。然而,如果使用处理器 xe2x80x99 预定义的 NMI 向量,则处理器的响应将与以正常方式生成的 NMI 中断的响应不同。如果在此指令中使用向量号 2(NMI\n 向量),则会调用 NMI 中断处理程序,但不会激活处理器\xe2\x80\x99s NMI 处理硬件。\n 软件中生成的中断INT n 指令不能被 EFLAGS 寄存器中的 IF 标志屏蔽。

\n
\n\n

对于软件生成的异常,它说:

\n\n
\n

INTO、INT 3 和 BOUND 指令允许在软件中生成异常。这些指令允许在指令流中的点处执行异常条件检查。例如,INT 3 会导致生成断点异常。INT\nn指令可用于模拟软件中的异常;但有一个限制。如果 INT n 为架构定义的异常之一提供向量,则处理器会生成正确向量的中断(以访问异常处理程序),但不会将错误代码推送到堆栈上。即使相关的硬件生成的异常通常会产生错误代码,情况也是如此。在处理异常时,异常处理程序仍会尝试从堆栈中弹出错误代码。由于没有推送错误代码,处理程序将弹出并丢弃 EIP(代替丢失的错误代码)。这会将返回值发送到错误的位置。

\n
\n\n

那么,有什么区别呢?似乎都利用了int n指令。如何判断一段汇编代码中是否产生异常或中断?

\n

x86 exception interrupt interrupt-handling

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

SOFTIRQ 上下文之间的抢占

我有一个具有以下配置的系统;

  • SMP 平台(但我只关注本地 CPU)和抢占关闭
  • ISR A -> raise_softirq(1)
  • ISR B -> raise_softirq(2)

当 SOFTIRQ 1 运行时,中断 B 出现,然后 ISR B 启动。当 ISR B 发生 irq_exit() 时,它将调用 softirq。因此,它将调度 SOFTIRQ 2(不处理被中断的 SOFTIRQ 1)。

是正确的说法吗?

另一个问题。此时,如果 SOFTIRQ 1 禁用“bottom_half”,我们检测到下半部分被禁用并跳过 SOFTIRQ 2 的执行?提前致谢!

linux-kernel interrupt-handling

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

PIC如何知道键盘是键盘,应该映射到IRQ#1?

我读过OSDev Wiki的一篇文章,而不是IRQ#1匹配键盘.但PIC如何知道键盘是键盘,那么它应该映射到IRQ#1?

hardware assembly operating-system interrupt interrupt-handling

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

x86除法异常-返回地址

当尝试在 x86 程序集中为引导加载程序编写一些例程时,我遇到了一个错误,当发生除法错误时,程序将陷入无限循环。通过调查,我发现调用 int 0 会正常通过异常处理程序,然后继续执行程序的其余部分。为 x86 编写自己的异常处理程序,发生除法错误异常时的返回地址是指令的地址,这意味着它将永远循环执行除法。这是正常行为还是 Virtualbox/我的 cpu 特有的错误?

org 0x7c00      ;put all label addresses at offset 0x7c00

xor ax, ax      ;set up all segment registers
mov ds, ax
mov ax, 0x9000
mov ss, ax
mov sp, 0x1000
mov ax, 0xB800  ;video text memory starts at this address
mov es, ax

mov ah, 0x00
mov al, 0x02
int 0x10        ;go into 80x25 monochrome text

mov [0x0000], word DivideException
mov [0x0002], word 0x0000

xor di, di
xor bx, bx …
Run Code Online (Sandbox Code Playgroud)

x86 assembly virtualbox interrupt-handling x86-16

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

在哪个地方中断可以中断C中的功能?

我正在用ISO C90编写代码,它禁止混合声明和代码.所以我有这样的事情:

int function(int something)
{
    int foo, ret;
    int bar = function_to_get_bar();
    some_typedef_t foobar = get_this_guy(something);

    spin_lock_irqsave(lock);

    /*
    Here is code that does a lot of things
    */

    spin_unlock_irqrestore(lock);

    return ret;
}
Run Code Online (Sandbox Code Playgroud)

问题是硬件或软件中断是否发生,它可以在哪个地方中断我的功能,它是否也可以在变量声明中发生?

为什么我问这是因为我需要这个函数不被中断打断.我想使用spin_lock_irqsave()来确保,但我想知道中断是否可以在变量声明中中断我的函数?

c linux-kernel interrupt-handling spinlock

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

同一EXTI Line STM32上有多个中断

对于PA1和PC1的例子,是否可以从相同的EXTI线获得多个中断,它们都在EXTI1上.

因此,通过点击PA1上的按钮,LED在PB6上亮起,然后点击PC1,LED在PC0上切换.

微控制器==> STM32F091

这是我用于2个不同行的中断的代码:

//PC1
SYSCFG->EXTICR[0] |= SYSCFG_EXTICR1_EXTI1_PA;
EXTI->IMR = EXTI_IMR_MR1;
EXTI->RTSR = EXTI_RTSR_TR1;
EXTI->FTSR = EXTI_FTSR_TR1; 
//PB0
SYSCFG->EXTICR[0] |= SYSCFG_EXTICR1_EXTI1_PC;
EXTI->IMR |= EXTI_IMR_MR1; 
EXTI->RTSR |= EXTI_RTSR_TR1; 
EXTI->FTSR |= EXTI_FTSR_TR1;
NVIC_EnableIRQ(EXTI0_1_IRQn);
NVIC_SetPriority(EXTI0_1_IRQn,0);
Run Code Online (Sandbox Code Playgroud)

中断处理程序:

void EXTI0_1_IRQHandler(void)
{
if ((EXTI->PR & EXTI_PR_PR1) == EXTI_PR_PR1)  /* Check line 1 has triggered      the IT */
{
EXTI->PR = EXTI_PR_PR1; /* Clear the pending bit */
GPIOC->ODR ^= 1<<0;
}
if ((EXTI->PR & EXTI_PR_PR0) == EXTI_PR_PR0)  /* Check line 0 has triggered  the IT …
Run Code Online (Sandbox Code Playgroud)

c interrupt stm32 interrupt-handling

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

当中断例程中的变量发生变化时,确实需要volatile关键字

我正在使用nrf52微控制器(CORTEX 34F)处理器.我对主循环进行了变量检查,在主循环和定时器中断程序中都进行了修改.

  1. 主循环检查变量是否为真:

    • 执行条件代码

    • 将变量设置为false

  2. 定时器中断例程每10 ms将变量设置为true

没有volatile关键字,代码似乎不起作用,但当我将变量设置为volatile它似乎工作,但我不相信,因为:

  1. 首先我认为cortex M4f不包含数据缓存
  2. 第二:这个案例是handeld的编译器(arm keil)

任何答案,请;

if true执行正文代码2.列出项目

c embedded volatile interrupt-handling

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