physical interrupt and virtual interrupt

1、中断

---- physical interrupt:物理中断/硬件中断

---- virtual interrupt:虚拟中断/软件中断

从本质上来讲,中断是一种电信号,当设备有某种事件发生时,它就会产生中断,通过总线把电信号发送给中断控制器。如果中断的线是激活的,中断控制器就把电信号发送给处理器的某个特定引脚。处理器于是立即停止自己正在做的事,跳到中断处理程序的入口点,进行中断处理。

(1) 硬中断

由与系统相连的外设(比如网卡、硬盘)自动产生的。主要是用来通知操作系统系统外设状态的变化。比如当网卡收到数据包的时候,就会发出一个中断。我们通常所说的中断指的是硬中断(hard irq)。

(2) 软中断

为了满足实时系统的要求,中断处理应该是越快越好。linux为了实现这个特点,当中断发生的时候,硬中断处理那些短时间就可以完成的工作,而将那些处理时间比较长的工作,放到中断之后来完成,也就是软中断(soft irq)来完成。

(3) 中断嵌套

Linux下硬中断是可以嵌套的,但是没有优先级的概念,也就是说任何一个新的中断都可以打断正在执行的中断,但同种中断除外。软中断不能嵌套,但相同类型的软中断可以在不同CPU上并行执行。

(4) 软中断指令

int是软中断指令。中断向量表是中断号中断处理函数地址的对应表。

int n - 触发软中断n。相应的中断处理函数的地址为:中断向量表地址 + 4 * n。

(5)硬中断和软中断的区别

软中断是执行中断指令产生的,而硬中断是由外设引发的。硬中断的中断号是由中断控制器提供的(NMI硬中断中断号系统指定为02H),软中断的中断号由指令直接指出,无需使用中断控制器。硬中断是可屏蔽的(NMI硬中断不可屏蔽),软中断不可屏蔽。硬中断处理程序要确保它能快速地完成任务,这样程序执行时才不会等待较长时间,称为上半部。软中断处理硬中断未完成的工作,是一种推后执行的机制,属于下半部。

(1) 硬中断的开关

简单禁止和激活当前处理器上的本地中断:

local_irq_disable();

local_irq_enable();

保存本地中断系统状态下的禁止和激活:

unsigned long flags;

local_irq_save(flags);

local_irq_restore(flags);

(2) 软中断的开关

禁止下半部,如softirq、tasklet和workqueue等:

local_bh_disable();

local_bh_enable();

需要注意的是,禁止下半部时仍然可以被硬中断抢占。

(3) 判断中断状态

#define in_interrupt() (irq_count()) // 是否处于中断状态(硬中断或软中断)

#define in_irq() (hardirq_count()) // 是否处于硬中断

#define in_softirq() (softirq_count()) // 是否处于软中断


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
TIM8 break interrupt和TIM12 global interrupt是针对不同的定时器的中断。在使用这些中断之前,需要先配置好对应的定时器。 对于TIM8 break interrupt,可以按照以下步骤使用: 1. 配置TIM8定时器,使其工作在所需的模式下。 2. 使能TIM8的中断,并设置中断优先级。 3. 在中断服务函数中进行处理,例如重置计数器或执行其他操作。 示例代码: ```c // 配置TIM8定时器 TIM8->CR1 |= TIM_CR1_ARPE; // 自动重载寄存器使能 TIM8->CR1 |= TIM_CR1_URS; // 仅用于更新事件触发中断 TIM8->DIER |= TIM_DIER_UIE; // 允许更新中断 TIM8->BDTR |= TIM_BDTR_BKE; // 使能break功能 TIM8->BDTR |= TIM_BDTR_BKP; // 使能break事件 TIM8->EGR |= TIM_EGR_UG; // 产生更新事件,初始化定时器 // 使能TIM8中断 NVIC_EnableIRQ(TIM8_BRK_TIM12_IRQn); // 使能TIM8的break中断 NVIC_SetPriority(TIM8_BRK_TIM12_IRQn, 2); // 设置中断优先级 // 中断服务函数 void TIM8_BRK_TIM12_IRQHandler(void) { // 处理中断 TIM8->SR &= ~TIM_SR_UIF; // 清除中断标志 // ... } ``` 对于TIM12 global interrupt,可以按照以下步骤使用: 1. 配置TIM12定时器,使其工作在所需的模式下。 2. 使能TIM12的中断,并设置中断优先级。 3. 在中断服务函数中进行处理,例如重置计数器或执行其他操作。 示例代码: ```c // 配置TIM12定时器 TIM12->CR1 |= TIM_CR1_CEN; // 使能定时器 TIM12->DIER |= TIM_DIER_UIE; // 允许更新中断 TIM12->PSC = 1000; // 设置预分频器 TIM12->ARR = 5000; // 设置自动重载寄存器,产生5000个时钟周期后触发中断 // 使能TIM12中断 NVIC_EnableIRQ(TIM8_BRK_TIM12_IRQn); // 使能TIM12的中断 NVIC_SetPriority(TIM8_BRK_TIM12_IRQn, 2); // 设置中断优先级 // 中断服务函数 void TIM8_BRK_TIM12_IRQHandler(void) { // 处理中断 TIM12->SR &= ~TIM_SR_UIF; // 清除中断标志 // ... } ``` 需要注意的是,不同的定时器可能有不同的中断类型和中断优先级,需要根据实际情况进行配置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值