0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Linux为什么中断不允许休眠

麦辣鸡腿堡 来源:嵌入式Linux系统开发 作者:Jasonangel 2023-09-27 17:48 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

Linux 为什么中断不允许休眠?

所谓的睡眠,就是调用 schedule 让出 CPU,调度器选择另外个进程继续执行,这个过程涉及进程栈空间的切换。

1、假如中断上下文中调用 schedule ,此时获取的 struct thread info 数据结构是发生中断时该进程栈信息,而不是中断上下文调用 schedule 时任何信息。这就导致再也无法返回中断上下文中调用 schedule 的地方。

2、中断上下文处于关中断中,需要发送个 EOI 通知 GIC 中断处理结束,GIC 和CPUinterface 才会进入下一次中断处理。如果中途 schedule,那么整个系统的中断都会被屏蔽掉。

一般进入中断后,需要关中断,也会关抢占,同时注意不可以调用schedule。

unhandled interrupt 和 spurious interrupt

未处理中断和虚假中断

在中断处理的最后,总会有一段代码如下:

irqreturn_t

handle_irq_event_percpu(structirq_desc*desc,structirqaction*action)

{

……

if(!noirqdebug)

note_interrupt(irq,desc,retval);

returnretval;

}

note_interrupt就是进行unhandled interrupt和spurious interrupt处理的。对于这类中断,linux kernel有一套复杂的机制来处理,你可以通过command line参数(noirqdebug)来控制开关该功能。

当发生了一个中断,但是没有被处理(有两种可能,一种是根本没有注册的 specific handler,第二种是有 handler,但是 handler 否认是自己对应的设备触发的中断),怎么办?毫无疑问这是一个异常状况,那么 kernel 是否要立刻采取措施将该 IRQ disable 呢?也不太合适,毕竟 interrupt request 信号线是允许共享的,直接 disable 该 IRQ 有可能会下手太狠,kernel 采取了这样的策略:如果该 IRQ 触发了 100,000 次,但是 99,900 次没有处理,在这种条件下,我们就是 disable 这个 interrupt request line。

中断线和中断号是一个意思。

相关的控制数据在中断描述符中,如下:

structirq_desc{

……

unsignedintirq_count;--------记录发生的中断的次数,每100,000则回滚

unsignedlonglast_unhandled;-----上一次没有处理的IRQ的时间点

unsignedintirqs_unhandled;------没有处理的次数

……

}

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cpu
    cpu
    +关注

    关注

    68

    文章

    11218

    浏览量

    222977
  • Linux
    +关注

    关注

    88

    文章

    11628

    浏览量

    218010
  • 中断
    +关注

    关注

    5

    文章

    913

    浏览量

    43566
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    为保医疗质量不允许开展互联网医疗诊治?

    互联网时代,很多人都已经习惯了通过网络解决很多问题,包括看病找医生。在线辅助问诊是否合法?对此,国家卫计委新闻发言人宋树立表示:互联网上涉及医学诊断治疗是不允许开展的,只能做健康方面的咨询。
    发表于 04-13 09:46 1266次阅读

    “tc1.3”编译报错不允许使用向量表编号TriCore™怎么解决?

    “tc1.3” TriCore™ 不允许使用矢量表编号
    发表于 01-22 08:33

    NgdBuild:486不允许属性“SIM_MODE”

    “BU2_U0_blk_mem_generator_valid.cstr_ramloop [3] .ram.r_v5_noinit.ram_SP.WIDE_P RIM36.TDP”上不允许属性“SIM_MODE”。该属性将被忽略。这可以吗?ISE版本
    发表于 10-10 11:48

    请问SPI不允许在main函数中对SD卡操作吗?

    请问下,我在一个定时中断里使用原子哥写SD的程序写SD卡,在mian函数的循环里同样也有对SD卡的操作(SD_Init(),MSD_WriteBuffer),这时我发现程序有一定概率在出定时中断后不跑了,把main函数中对SD卡操作的函数都去掉后就完全没有这个问题了。难道
    发表于 07-11 04:35

    电压互感器二次侧为什么不允许短路

    变压器的工作原理是什么?变压器是由哪些部分组成的?电流互感器二次侧为什么不允许开路?电压互感器二次侧为什么不允许短路?
    发表于 08-09 06:48

    电流互感器与电压互感器二次侧为什么不允许开路

    变压器的工作原理是什么?变压器是由哪些部分组成的?电流互感器二次侧为什么不允许开路?电压互感器二次侧为什么不允许短路?
    发表于 08-23 06:14

    FreeRTOS的某些内容是不允许MDMA读取内存吗?

    验证了 RAM 地址存在于 AXI 内存中,所以似乎 FreeRTOS 的某些内容不允许 MDMA 读取内存?// Write operationMDMA_Channel0-&gt
    发表于 12-07 07:47

    STM32H7时钟为什么不允许调整?

    时钟不允许调整。通常它不应该发出警告。
    发表于 12-14 06:52

    TTL门电路为什么输出端不允许并联相接呢?

    TTL门电路为什么输出端不允许并联相接?希望能从三极管的角度解释一下,最好有图解。
    发表于 04-28 11:06

    不允许32位传输的i.MX 8是否有限制?

    字节的 DMA 传输(DMA 控制器在设备内部,因此它会进行 PCI 总线主传输)并且该传输从未开始或完成,所以看起来 4 字节的传输大小是太小。较大的传输(8 个或更多字节)工作正常。 不允许
    发表于 05-11 06:34

    网络电视不允许直播世界杯?

    2018世界杯比赛不允许在互联网电视平台上进行赛事的直播和延时播出,否则都属于违规,只能在赛事结束后提供比赛点播服务。
    的头像 发表于 06-08 09:44 5796次阅读

    AVR单片机外部中断实例及下载烧录的方法

    中断向量位于Boot Loader 区,那么执行应用区代码时中断是禁止的。401不允许运行于Boot Loader 区的LPM 指令从应用区读取数据。若中断向量位于Boot Load
    发表于 04-09 15:05 2466次阅读
    AVR单片机外部<b class='flag-5'>中断</b>实例及下载烧录的方法

    为什么中性线不允许单独断开

     在我们通常所用的TN系统中,不管单相电路还是三相电路,零线和地线一样在任何情况下都是不允许断开的,也就是说零线不允许经过开关和保险丝。零线在电工学里用PEN表示,中性线用N表示,保护线(地线)用PE表示。我们生活中所用、通常所说的零线实际上在电工学里叫“中性线”。
    的头像 发表于 12-22 03:42 1.1w次阅读
    为什么中性线<b class='flag-5'>不允许</b>单独断开

    减速机为什么不允许有轴向窜动现象?

    减速机为什么不允许有轴向窜动现象? 减速机是一种用来改变输入轴传动力矩和转速的装置。作为机械设备的核心部件之一,减速机在各个行业中起到非常重要的作用,广泛应用于机械传动系统中。 在减速机
    的头像 发表于 11-23 10:46 2507次阅读

    电力系统不允许发生谐振的原因

    电力系统谐振是指在电力系统中,由于某些特定条件的满足,导致系统内部的电感和电容元件相互配合,形成一种振荡现象。谐振现象在电力系统中是不允许发生的,因为它会带来一系列严重的问题和危害。以下是对电力系统
    的头像 发表于 08-22 14:21 2085次阅读