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

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

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

2.2K21

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

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

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

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.1K21

Linux中断下半部实现机制

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

3.1K10

实时操作系统

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

2.3K90

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.6K20

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定义)来处理相应中断,该函数将判断是否有中断需要被处理

1K20

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个中断触发时,都会导致GIC33号中断被触发。 处理中断时,需要分辨:是谁触发了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) 对于

1K41

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

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

16210

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

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

1.8K40

中断与异常简介与分析

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

1.1K30

内核中断系统设备树

都取出来执行一遍,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.1K31

Linux驱动同步与互斥

1.3.2.1 ATOMIC_OPUP系统实现 对于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.3K10

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

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

2.7K41

手把手教你中断唤醒系统

resume 函数系统整体 resume 时候,会调用每个外设注册 resume 函数, resume 函数调用 disable_irq_wake ,表示该中断系统运行时不需要。... resume 函数,调用 disable_irq_wake ,恢复原始中断触发路径。...至于 probe 函数书写, GPIO 子系统和中断子系统系列文章都讲过这些函数使用,大家可以去网站查看: http://www.linuxer.vip note:该 demo 只用来唤醒系统...,如果你中断 I2C 等设备驱动,唤醒系统后要立刻在中断处理函数中进行 I2C 通信,写法不太一样,但是框架相同。...另外,该驱动中断处理函数没做什么东西,因此唤醒后执行完中断处理函数后又会睡过去。

1.4K20

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

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

88920

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

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

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

19510
领券