首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

RTOS内功修炼记(三)—— 内核到底是如何管理中断的?

STM32 HAL库的中断处理 STM32提供的HAL库中提供了默认的中断处理函数,在stm32l4xx_it.c中,以外部中断为例: ?...中断处理有何变化? 在RTOS内核中,不再单纯的只有一个main函数在跑,而是系统中「同时存在多个任务」,由内核根据不同的任务优先级进行抢占式调度执行。...然而在RTOS中,因为同时存在多个任务,所以当中断处理程序执行完返回的时候,一脸懵逼,我该返回哪个任务???...; ② 在即将退出之前调用一次tos_knl_irq_leave; 比如在知识回顾中我编写的按键中断处理程序,如果改到TencentOS-tiny中,如下: void EXTI2_IRQHandler(...② 「RTOS中,较复杂的中断处理程序应该设计为一个任务,在中断处理程序中去激活/唤醒该任务执行」。 ③ 禁止在临界段代码中调用各种API,会影响系统实时性,还可能会引起系统崩溃。

2.4K21

【深度】韦东山:一文看看尽linux对中断处理的前世今生

id=e58aa3d2d0cc 中断处理函数需要调用C函数,这就需要用到栈。 中断A正在处理的过程中,假设又发生了中断B,那么在栈里要保存A的现场,然后处理B。...在处理B的过程中又发生了中断C,那么在栈里要保存B的现场,然后处理C。 如果中断嵌套突然暴发,那么栈将越来越大,栈终将耗尽。...在单芯片系统中,假设中断处理很慢,那应用程序在这段时间内就无法执行:系统显得很迟顿。 在SMP系统中,假设中断处理很慢,那么正在处理这个中断的CPU上的其他线程也无法执行。...在Linux系统中使用中断是挺简单的,为某个中断irq注册中断处理函数handler,可以使用request_irq函数: ? 在handler函数中,代码尽可能高效。...06 下半部要做的事情太多并且很复杂:工作队列 在中断下半部的执行过程中,虽然是开中断的,期间可以处理各类中断。但是毕竟整个中断的处理还没走完,这期间APP是无法执行的。

92620
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    聊聊 Linux 中断机制

    中断的历史原因 在聊中断机制之前,我想先和大家聊一聊中断机制出现的前因后果。...) PS/2 鼠标口中断 IRQ13 0x2d(45) 数学协处理器中断 IRQ14 0x2e(46) 硬盘中断 IRQ15 0x2f(47) 保留 在系统刚刚初始化后,内核在 head.s 程序中会对所有...一般保护性错误:是指在英特尔 x86 架构和 AMDx86-64 架构和其它架构中的一种中断情况,指正在运行的程序(内核或用户态程序)违反处理器架构中保护措施的情况。...最常见的情况就是 Linux 中的这些中断不会所有的都用到,有些中断是保留中,另外对于系统中所使用的一些中断,内核会在其初始化过程中重新设置这些中断描述符,让他们指向实际的处理过程。...另外,在设置中断描述符表 IDT 表时 Linux 内核使用了中断门和陷阱门两种门描述符。它们之间的区别在于对标志寄存器 EFLAGS 中的中断允许标志 IF 的影响。

    10210

    Linux中断下半部实现机制

    中断上、下半部产生背景 由于内核中中断不允许嵌套,在程序进入中断后,系统会关闭中断接收,这段时间内,其他中断都无法处理导致中断无法响应,因此需要当前进入的中断子服务函数越快越好。...但是在一些特殊情况下,中断要处理的事情可能是复杂且冗长的,为解决这种问题, 中断上下半部的概念顺势而生。将中断拆成两部分,上半部用来处理紧急的事情;下半部用来处理不紧急的事情。 2....在退出函数,销毁: tasklet_kill(&kpd_keymap_tasklet); (2) 工作队列方式: 在tasklet方式中,虽然开中断了,期间可处理系统各种中断,但是软中断的优先级也会导致其他的线程无法运行...如果时间过长,会导致系统卡顿且APP也无法运行的现象。此时选择内核线程来处理下半部:在中断上半部将下半部处理函数放入工作队列,且唤醒工作队列线程,然后退出中断。...(3) 线程中断:由于工作队列每次只能处理一个中断下半部,但是内核支持多线程,因此出现为每一个中断下半部开辟一个线程处理。将多个中断的下半部线程分配给多个CPU上执行,提高效率。

    3.2K10

    Linux系统GIC驱动程序分析

    回顾GIC中断处理流程 1.1 一级中断控制器处理流程 1.2 多级中断控制器处理流程 2. GIC中的重要函数和结构体 3....GIC初始化过程 2.1 内核支持多种GIC 2.2 在设备树里指定GIC 2.3 gic_of_init分析 3. 申请GIC中断 3.1 在设备树里指定中断 3.2 内核对设备树的处理 4....1.1 一级中断控制器处理流程 对于irq_desc,内核有两种分配方法: 一次分配完所有的irq_desc 按需分配(用到某个中断才分配它的irq_desc 现在的内核基本使用第1种方法。...irq_chip:中断使能、屏蔽、清除,放在irq_chip中的各个函数里实现 irq_domain 申请中断时 在设备树里指定hwirq、flag,可以使用irq_domain...申请GIC中断 3.1 在设备树里指定中断 3.2 内核对设备树的处理 函数调用过程如下,使用图片形式可以一目了然: 函数调用过程如下,使用文字格式方便复制: 4.

    4.2K21

    实时操作系统

    从这几个特性可以归纳出一个共性:被自旋锁保护的临界区代码执行时,它不能因为任何原因放弃处理器。 在普通内核中,自旋锁保护的临界区不可被抢占。...中断线程化 标准内核中,中断具有最高优先级,可以无条件抢占当前任务,而且中断来临的时机以及执行的时间长短都是未知的,这样就会影响系统线程的执行时间,使得系统的处理增加了不确定因素,导致无法满足实时性的要求...实时内核将中断的处理过程线程化,中断处理程序不是在单独的中断上下文中执行,而是由内核线程处理中断请求。中断执行过程受到线程调度策略控制,与其他线程公平竞争处理器资源,可以被抢占。...结构体,不同点主要体现在内核初始化创建 init 线程时,中断线程化的中断在 init() 函数中还将调用 init_hardirqs(kernel/irq/manage.c(已经打过上文提到的补丁)...不难看出,不管是线程化还是非线程化的中断,最终都会执行 handle_IRQ_event() 函数来调用相应的中断处理函数,只是线程化的中断处理函数是在内核线程中执行的。

    2.4K90

    Linux实时补丁即将合并进Linux 5.3

    二、中断线程化 中断线程化是实现Linux实时性的一个重要步骤,在Linux标准内核中,中断是最高优先级的执行单元,不管内核当时处理什么,只要有中断事件,系统将立即响应该事件并执行相应的中断处理代码,除非当时中断关闭...在Ingo Molnar的实时补丁中,中断线程化的实现方法是: 对于IRQ,在内核初始化阶段init(该函数在内核源码树的文件init/main.c中定义)调用init_hardirqs(该函数在内核源码树的文件...kernel/irq/manage.c中定义)来为每一个IRQ创建一个内核线程,IRQ号为0的中断赋予实时优先级49,IRQ号为1的赋予实时优先级48,依次类推直到25,因此任何IRQ线程的最低实时优先级为...在IRQ子系统位置的kernel/irq/handle.c文件中)来处理。...对于已经线程化的情况,中断处理线程被唤醒并开始运行后,将调用do_hardirq(在源码树的IRQ子系统位置的文件kernel/irq/manage.c中定义)来处理相应的中断,该函数将判断是否有中断需要被处理

    3.7K20

    Linux系统驱动之两类中断控制器处理流程_链式和层级

    处理流程对比 在这里插入图片描述 参考资料: linux kernel的中断子系统之(七):GIC代码分析 Linux 4.9.88内核源码 Linux-4.9.88\drivers...\gpio\gpio-mxc.c Linux-4.9.88\arch\arm\boot\dts\imx6ull.dtsi Linux 5.4内核源码 Linux-5.4\drivers\pinctrl...它底下的4个中断触发时,都会导致GIC的33号中断被触发。 处理中断时,需要分辨:是谁触发了GIC 33号中断?这需要读取"chained intc"中的寄存器。...,老方法 也可以用到时再分配:linear,新方法 假设这4个irq_desc的序号为100~103,在GPIO domain中记录(0,100) (1,101)(2,102) (3,103) 对于KEY...在GIC domain中记录(100,234) (101,235)(102,236) (103,237) 在GPIO domain中记录(0,234) (1,235)(2,236) (3,237) 对于

    1.1K41

    在实时操作系统里面随便怎么写代码都能硬实时吗?

    比如中断1在执行的过程中,来了中断2,而中断2对应的事情是必须要决定性时延的,由于IRQ1的中断服务程序也是码农写的,我们无法确定这个中断服务程序要执行多久。...内核里面会屏蔽中断的API如local_irq_disable、spin_lock_irqsave等 前文已经多次指出,在驱动程序中调用local_irq_disable()函数往往被视为一个潜在的问题或者说是...它通常用于一个特定的场景,即当中断服务程序与线程之间存在潜在的竞态条件时。作为内核程序员,我相信你已经非常熟悉这样的经典用法了,这已经成为了内核编程中的常规操作,体现出了内核编程的严谨性和技巧性。...通过改进内核的调度策略和中断处理机制,preempt-rt使得Linux能够更好地满足实时应用的需求。 相对于其他RTOS,Linux在处理实时任务时确实有其独特之处。...用户空间的应用无法直接访问或修改内核代码,只能通过系统调用等接口与内核进行交互。 因此,在Linux中,实现实时任务的确定性调度时延就显得尤为重要。

    33421

    Ingo Molnar 的实时补丁

    二、中断线程化 中断线程化是实现Linux实时性的一个重要步骤,在Linux标准内核中,中断是最高优先级的执行单元,不管内核当时处理什么,只要有中断事件,系统将立即响应该事件并执行相应的中断处理代码,除非当时中断关闭...在Ingo Molnar的实时补丁中,中断线程化的实现方法是: 对于IRQ,在内核初始化阶段init(该函数在内核源码树的文件init/main.c中定义)调用init_hardirqs(该函数在内核源码树的文件...kernel/irq/manage.c中定义)来为每一个IRQ创建一个内核线程,IRQ号为0的中断赋予实时优先级49,IRQ号为1的赋予实时优先级48,依次类推直到25,因此任何IRQ线程的最低实时优先级为...在IRQ子系统位置的kernel/irq/handle.c文件中)来处理。...对于已经线程化的情况,中断处理线程被唤醒并开始运行后,将调用do_hardirq(在源码树的IRQ子系统位置的文件kernel/irq/manage.c中定义)来处理相应的中断,该函数将判断是否有中断需要被处理

    1.1K20

    Linux驱动实践:中断处理中的【工作队列】 workqueue 是什么鬼?

    目录 工作队列是什么 驱动程序 编译、测试 别人的经验,我们的阶梯! 大家好,我是道哥,今天我为大伙儿解说的技术知识点是:【中断处理中的下半部分机制-工作队列】。...在刚开始介绍中断处理的时候,曾经贴出下面这张图: 图中描述了中断处理中的下半部分都有哪些机制,以及如何根据实际的业务场景、限制条件来进行选择。...根据先来后到的原则,工作队列中后加入的工作项,就可能因为前面工作项的处理函数执行的时间太长,从而导致时效性无法保证。 因此,这里存在一个系统平衡的问题。...关于工作队列的基本知识点就介绍到这里,下面来实际操作验证一下。 驱动程序 之前的几篇文章,在驱动程序中测试中断处理的操作流程都是一样的,因此这里就不在操作流程上进行赘述了。...操作系统在捕获到键盘中断之后,会依次调用此中断的所有中断处理程序,其中就包括我们注册的 myirq_handler 函数。

    2K40

    中断与异常简介与分析

    还有一个例子就是,假设我需要实现一个led驱动或者其它的驱动,在内核驱动中,我需要将相应的物理地址ioremap成为一个虚拟地址,当驱动调用结束后,还应当取消相应的地址映射,这其实就是在内核态进行的操作...打个比方在ARM处理器的异常种类就有不少,有未定义指令异常,软中断异常,快中断异常等等。异常是由程序错误产生的,或者是内核必须处理的异常条件产生的。...那么在linux内核中的中断其实也是和单片机类似的,只不过linux内核的中断定义的比较丰富,但是基本思想还是一样的。linux内核处理中断有一种叫做中断信号的机制。...中断信号的来临必将会引起中断的处理,那么中断处理必须要满足以下的约束: 1、linux内核在响应中断以后必须要进行的操作分为两部分:我们把非常重要的,非常紧急的处理程序让内核立即去运行。...image.png 在linux中也有这么一张表: image.png 在linux内核中,每一个能够发出中断请求的硬件设备控制器都有一条名为IRQ的输出线。

    1.2K30

    内核中断系统中的设备树

    都取出来执行一遍,在irq_net中要访问网卡来判断下中断是否是网卡产生的,如果不是则返回不做任何处理,如果是则做网络处理 链表支持 共享中断, ?...wdt samsung_time_irq对应中断号是29,在irqs.h中对应的宏是 #define IRQ_TIMER3 S3C2410_IRQ(13) 2440使用第三个定时器作为系统滴答,使用老内核中断号都是固定...    a.1 在设备树中的描述     a.2 在内核中的驱动 b....对于S3C2440, 还有: gpf/gpg irq controller     b.1 在设备树中的描述(在pinctrl节点里)     b.2 在内核中的驱动 (在pinctrl驱动中) (...2) 设备的中断 a.1 在设备节点中描述(表明使用"哪一个中断控制器里的哪一个中断, 及中断触发方式") a.2 在内核中的驱动 (在platform_driver.probe中获得IRQ资源, 即中断号

    1.2K31

    Linux驱动同步与互斥

    1.3.2.1 ATOMIC_OP在UP系统中的实现 对于ARMv6以下的CPU系统,不支持SMP。原子变量的操作简单粗暴:关中断,中断都关了,谁能来打断我?...③ 程序A正在用户态运行,发生了中断:内核处理完中断,继续执行程序A的用户态指令的前夕,它会判断是否应该切换程序。...1.4.5.2 在用户上下文与Softirqs之间加锁 假设这么一种情况:程序A运行到内核态时,正在访问一个临界资源;这时发生了某个硬件中断,在硬件中断处理完后会处理Softirq,而某个Softirq...在硬件中断服务例程中不需要使用spin_lock_irq(),因为当它在执行的时间Softirq是不可能执行的;它可以使用spin_lock()用来防止别的CPU抢占。...因为Linux不支持中断嵌套,即当前CPU正在处理中断A时,中断B不可能在当前CPU上被处理,不需要再次去禁止中断;当前CPU正在处理中断A时,假如有另一个CPU正在处理中断B,它们使用spin_lock

    2.4K10

    宋宝华:在实时操作系统里面随便怎么写代码都能硬实时吗?

    比如中断1在执行的过程中,来了中断2,而中断2对应的事情是必须要决定性时延的,由于IRQ1的中断服务程序也是码农写的,我们无法确定这个中断服务程序要执行多久。...内核里面会屏蔽中断的API如local_irq_disable、spin_lock_irqsave等 前面笔者已经反复强调过,在驱动程序里面调用local_irq_disable()通常都是一个bug,...因为它无法修复另外一个核上运行的线程、中断服务程序与本核线程之间的竞争。...尽管在单核处理器里面调用这个API是通常安全的,但是我们哪怕是在单核编程,都要假装自己是多核的样子,这个是在Linux里面写代码跨平台的最基本常识。...风在吼,马在叫,娃儿在咆哮。今天就谈到这里,明天接着谈。我相信你还有很多的疑惑,比如很多童鞋说,你刚才提到的Linux的一些硬实时的毛病,在RTOS里面其实也都有,我会给你一个交代。

    2.9K41

    38.Linux驱动调试-根据系统时钟定位出错位置

    当内核或驱动出现僵死bug,导致系统无法正常运行,怎么找到是哪个函数的位置导致的?...答,通过内核的系统时钟,因为它是由定时器中断产生的,每隔一定时间便会触发一次,所以当CPU一直在某个进程中时,我们便在中断函数中打印该进程的信息 1.先来回忆下 在之前的第5章内核中断运行过程:分析过...\include\asm-arm\arch-s3c2410\Irqs.h 而S3C2410 Timer Tick,就是我们的系统时钟计数值,在内核中就是jiffies这个全局变量,每隔一段时间+1。...所以S3C2410 Timer Tick的中断号为30 4.接下来便来修改asm_do_IRQ()函数 在asm_do_IRQ()中,添加以下带红色的字(#ifdef 1 .........2) HZ也是一个宏,代表每S的频率,比如每隔10ms加1,那么HZ就等于100 5.测试运行 接下来,我们便安装一个带有while(1)死循环的驱动,然后通过测试程序,内核便会一直在while(1)

    1.7K100

    Linux内核37-内核数据的同步访问

    然而,内核有时候可以在不使用锁或禁止中断的前提下执行这种插入操作。比如,系统调用服务例程中,系统调用插入新元素到一个单链表中,而中断处理程序或可延时函数异步遍历这个列表,就无须锁的保护。...禁止中断 自旋锁 异常处理程序+可延时函数 禁止软中断 自旋锁 中断处理程序+可延时函数 禁止中断 自旋锁 中断处理程序+可延时函数+异常处理程序 禁止中断 自旋锁 在了解这些不同的内核控制路径访问的数据结构应该如何保护之前...而所谓的同步中断肯定就是CPU自身产生的中断,也就是所谓的异常。比如,除零操作就会产生硬件错误,在嵌入式内核中很常见这之类的错误。...对于这类错误,首先应该能避免就避免,这是我们嵌入式开发者或者内核开发者必须要考虑的工作;实在无法避免(有时候可能还要故意产生硬件异常,比如Linux就利用页错误做特殊处理),就要编写异常处理程序进行必要处理...所以,无论哪种情况都不会发生死锁的情况。 为了方便处理多核系统中这种局部中断禁止和自旋锁结合在一起使用的情况,Linux提供了一些宏,如下表所示。单核系统中,这些宏只能禁止中断或者禁止内核抢占。

    92720

    eBPF 入门开发实践教程十:在 eBPF 中使用 hardirqs 或 softirqs 捕获中断事件

    hardirqs 和 softirqs 是 Linux 内核中两种不同类型的中断处理程序。它们用于处理硬件设备产生的中断请求,以及内核中的异步事件。...硬件中断处理程序通常用于处理设备驱动程序中的事件,例如设备数据传输完成或设备错误。softirqs 是软件中断处理程序。它们是内核中的一种底层异步事件处理机制,用于处理内核中的高优先级任务。...收集到的信息可以用于分析内核中的性能问题和其他与中断处理相关的问题。为了捕获 hardirqs 和 softirqs,可以遵循以下步骤:在 eBPF 程序中定义用于存储中断信息的数据结构和映射。...编写 eBPF 程序,将其挂载到相应的内核函数上,以捕获 hardirqs 或 softirqs。在 eBPF 程序中,收集中断处理程序的相关信息,并将这些信息存储在映射中。...通过上述方法,我们可以在 eBPF 中使用 hardirqs 和 softirqs 捕获和分析内核中的中断事件,以识别潜在的性能问题和与中断处理相关的问题。

    27310

    扫码

    添加站长 进交流群

    领取专属 10元无门槛券

    手把手带您无忧上云

    扫码加入开发者社群

    相关资讯

    热门标签

    活动推荐

      运营活动

      活动名称
      广告关闭
      领券