![](https://img-blog.csdnimg.cn/92ce8ccdc56f451c874bbe62b8aa5a36.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
中断子系统
文章平均质量分 65
学习linux的中断子系统笔记
习惯就好zz
一个无趣的人
展开
-
中断部分目录总结
中断学习非常混乱,资料乱七八糟什么都有,需要设置一个目录来方便查找。异常与中断的概念及处理异常与中断的的流程原创 2022-02-25 21:25:49 · 207 阅读 · 0 评论 -
层级中断控制器驱动程序编写
层级中断控制器的结构说明,驱动代码编写原创 2022-06-21 18:58:59 · 356 阅读 · 0 评论 -
链式中断控制器驱动编写-Linear方式
和legacy方式对比legacylinear函数irq_domain_add_legacyirq_domain_add_linearirq_desc一次性分配完用到再分配(hwirq,virq)domain->linear_revmap[hwirq] = irq_data->irq;同左边原创 2022-05-31 20:25:58 · 197 阅读 · 0 评论 -
legacy方式代码的调试过程记录
确定设备树中使用的虚拟中断号在imx6ull的芯片用户手册中,的第三章中断中。有一些保留的寄存器可以用来触发GIC SPI中断。如何触发中断可以使用devmem2命令在直接写GIC的PENDING寄存器原创 2022-05-26 11:32:15 · 518 阅读 · 0 评论 -
链式中断控制器驱动程序编写
链式中孤单控制器的重要函数和结构体链式处理流程回顾GIC下的中断控制器涉及4个重要的部分:handleB、GPIO Domain、handleC、irq_chip原创 2022-05-01 23:01:03 · 473 阅读 · 0 评论 -
两类中断控制器处理流程
下级中断控制器的类别中断控制器可以分为两类:链式(chained)、层级(hierarchy)。100ask的分类,用来更好理解结构链式中断控制器上图左边是chained intc就是链式中断控制器。只要其中4个中触发了一个,那么33号中断被触发。当33号中断触发时,需要判断是哪个触发了33中断。这时就需要读取 chained intc中的寄存器。层级中断控制器右边是hierarchy intc 是层级中断控制器。每个中断都又一一对应,GIC处理中断号时,不需要读取hierarchy原创 2022-04-16 14:46:02 · 381 阅读 · 0 评论 -
GIC驱动程序分析
一、以及中断控制器处理流程对于irq_desc,内恶化有两种分配方法:一次分配完所有iqr_desc按需分配(用到某个中断才分配它的irq_desc)现在的内核基本使用第一种方法。假设GIC可以向CPU发出16 ~ 1019号中断,这些数字被称为hwirq。0 ~ 15用于Process之间通信,比较特殊假设要使用UART模块,它发出的中断连接到GIC的32号中断,分配的irq_desc序号为16再GIC domain中会记录(32,16)那么注册中断时就是:request_irq(原创 2022-03-30 21:29:05 · 803 阅读 · 0 评论 -
异常向量表的安装与调用
一、中断的发生、处理过程中断发生的硬件过程中断处理的软件处理流程CPU执行完当前指令,检查到发生了中断,跳到向量表保存现场、执行GIC提供的处理函数、回复现场二、异常向量表的安装2.1 复制向量表汇编代码// arch\arm\kernel\head.S1. bl __lookup_processor_type ...... 2. bl __create_page_tables3. ldr r13, =__mmap_switched4. b __enabl原创 2022-03-28 22:21:53 · 1148 阅读 · 0 评论 -
GIC介绍和编程
一、GIC介绍GIC主要功能模块有分发器(Distributor)、CPU接口单元(CPU Interface)原创 2022-03-18 09:40:51 · 2634 阅读 · 1 评论 -
中断硬件框架
一、中断路径上的3个部件中断源:中断触发的源多种多样,比如GPIO、定时器、UART、DMA等等。它们都有自己的对应的中断控制寄存器,可以进行相关设置:使能、获取状态、设置中断类型等等。中断控制器:把各种中断源发出的中断信号,汇聚到中断控制器。可以在中断控制器中设置各个中断的优先级。CPU收到中断信号后,可以读取中断控制器的寄存器,判断哪个中断有先解决。CPU:没执行完一条指令,都会判断一下是否有中断发生了。CPU也有自己的寄存器,用来使能/禁止中断,这是中断处理的总开关。CPU的中断来源不止原创 2022-03-09 21:41:52 · 898 阅读 · 0 评论 -
Linux系统对中断处理的处理
Linux中断系统变化并不大,比较重要新的是引入内核线程threaded_irq来处理中断。硬件中断Linux系统把中断的意义扩展了,对于按键中断等硬件产生的中断,称之为“硬件中断”(hard irq)。不同的硬件又不同的中断号,对应的中断处理函数也不同。软件中断还可以人为地制造中断:软件中断(soft irq),如下图所示:中断相关的代码//include/linux/interrupt.henum{ HI_SOFTIRQ=0, TIMER_SOFTIRQ, NET_TX_SO原创 2022-02-27 21:26:34 · 992 阅读 · 0 评论 -
rk3288 唤醒和休眠使用环形缓冲区改进驱动程序
使用环形缓冲区,可以在一定程序上避免按键数据丢失,关键代码如下:其实就一个队列,自己写了一个:#define MaxSize 128struct QNode { int Data[MaxSize]; int rear; int front;};typedef struct QNode *Queue;int IsEmpty(Queue Q);void AddQ(Queue PtrQ, int item);int DeleteQ(Queue PtrQ);int IsEmpty(Qu原创 2021-04-01 18:04:41 · 331 阅读 · 0 评论 -
rk3288 定时器的内部机制
深入内部机制在开发板执行[root@firefly-rk3288:/home/picture/btn_timer]# cat /proc/interrupts CPU0 CPU1 CPU2 CPU3 16: 0 0 0 0 GIC 29 Edge arch_timer 17: 99137 280332 65060原创 2021-04-04 21:07:52 · 548 阅读 · 0 评论 -
rk3288 linux中的中断处理流程
linux硬件中断,分为上下两部分。上部分简单快速,(接收到一个中断,就立即执行,但只做有限的工作)下部分稍后执行,在适合的时机,下半部会被开中断执行。中断处理原则:1.不嵌套2.越快越好下半部的处理方式有soft_irq,tasklet,workqueue三种。soft_irq用在对底半执行时间要求比较紧急或者非常重要的场合,在中断上下文执行。tasklet是在中断上下文执行workqueue是在process上下文,因此可以执行可能sleep的操作。软件中断类型系统中,注册原创 2021-03-26 18:39:11 · 575 阅读 · 0 评论 -
rk3288 poll机制学习使用
适用场景使用休眠-唤醒的方式等待某个事件发生时,有一个缺点:等待的时间可能很久。我们可以加上一个超时时间,这时就可以使用 poll 机制。1 APP 不知道驱动程序中是否有数据,可以先调用 poll 函数查询一下,poll 函数可以传入***超时时间***;2 APP 进入内核态,调用到驱动程序的 poll 函数,如果有数据的话立刻返回;3 如果发现没有数据时就***休眠一段时间***;4 当有数据时,比如当按下按键时,驱动程序的中断服务程序被调用,它会记录数据、唤醒 APP;5 当超时时间到了原创 2021-04-01 21:22:26 · 260 阅读 · 0 评论 -
rk3288 定时器使用
内核定时器定时器就是闹钟,到一定时间就做某些事。时间、做的事情==>超时时间、函数在include\linux\timer.h中涉及这些函数://设置定时器,主要初始化timer_list结构体,设置其中的函数、参数#define setup_timer(timer, fn, data) \ __setup_timer((timer), (fn), (data), 0)//向内和添加定时器timer->expires表示超时时间extern void add_timer(s原创 2021-04-04 17:16:41 · 910 阅读 · 0 评论 -
rk3288 中断下半部tasklet
适用环境中断下半部分可以执行一些时间不是很紧急的工作。内核函数中断下半部使用结构体 tasklet_struct 来表示,它在内核源码 include\linux\interrupt.h 中定义struct tasklet_struct{ struct tasklet_struct *next; /* state有2个标志位 * bit0表示TASKLET_STATE_SCHED:1执行了tasklet_schedule,已经放入tasklet队列了 * bit1表示TASKLET_原创 2021-04-05 12:56:34 · 134 阅读 · 0 评论 -
rk3288工作队列workqueue
适用环境之前的定时器、下半部tasklet,都是在中断上下文中执行,他们无法休眠。当要处理更复杂、更耗时的工作时,放在定时器或是下半部中,会使得系统很卡,并且循环等待某件事也太浪费CPU资源。如果使用线程来处理这些耗时的工作,那就可以解决卡顿的问题,因为线程可以休眠。内核中有一种更简单的使用线程的方法,“工作队列”(workqueue)。在内核初始化时就创建了内核线程,我们只需要使用“工作队列”,把“工作”放入其队列中“,内核线程就会拿出“工作”执行函数。工作队列应用场合:做的事情比较耗时,甚原创 2021-04-05 17:01:48 · 289 阅读 · 0 评论 -
rk3288 阻塞和非阻塞
适用场景阻塞:就是等待某件事情发生。比如调用read时,如果没有按键数据则read不会返回,会让进程休眠等待。其中poll中,如果传入超时事件不是0, 也是会阻塞的。使用poll时,设置超时时间0,没有数据也立即返回。但是不能让read函数及工作于阻塞方式,又工作于非阻塞方式:App调用open函数传入O_NONBLOCK,表示使用非阻塞模式,默认是使用阻塞方式。当open是O_NONBLOCK后,可以使用fcntl修改为阻塞或非阻塞。应用编程//open时设置int fd = open("原创 2021-04-04 11:00:56 · 199 阅读 · 0 评论 -
rk3288 异步通知
适用场景使用***休眠-唤醒、POLL机制***时,都需要***休眠等待***某个事件发生时,差别在于后者可以指定休眠的时长。如果不想APP休眠怎么办,那么需要驱动程序有数据时***主动通知*** App,App受到信号后执行信息处理函数。使用流程驱动程序通过发送信号给App,通知App处理数据。驱动程序发送数据给App驱动程序发送信号给App发送SIGIO的信号内核里面有相应的函数,来支持驱动发送信号给AppApp来接受信号,要让驱动发送信号给App。前提是App把自己告诉给驱动Ap原创 2021-04-03 15:03:03 · 149 阅读 · 0 评论 -
rk3288 使用100ask扩展板编写按钮中断
对 于 GPIO 按 键 , 我 们 并 不 需 要 去 写 驱 动 程 序 , 使 用 内 核 自 带 的 驱 动 程 序drivers/input/keyboard/gpio_keys.c 就可以,然后你需要做的只是修改设备树指定引脚及键值。但是自己编写相关的内容则可以更好的学习到这些功能。编程思路在设备树里指定相关的引脚,这里使用的是GPIO7_B1。然后使用pinctrl对引脚进行读取,读取函数需要在中断中进行。中断的注册是通过一系列设备树函数设定的。设置树相关的配置:在arch/arm原创 2021-03-30 09:49:06 · 373 阅读 · 0 评论 -
rk3288 poll源码学习
系统调用在内核中都是sys_xxx命名的,如open、read、write在内核中分别对应sys_open、sys_read、sys_write。所以对应poll的内核函数,分析sys_poll就可以理解poll机制。sys_poll函数在文件fs/select.c中包含了sys_poll函数。SYSCALL_DEFINE3的宏定义于include/linux/syscalls.h,展开后就有sys_poll函数。sys_poll中做了金丹的处理后,就调用do_sys_poll。SYSCALL_DE原创 2021-04-02 21:23:15 · 278 阅读 · 0 评论 -
rk3288 异常与中断的概念与流程
中断与异常arm中的中断其实就是(异常),u-boot 或是 Linux 内核,都有类似如下的代码:_start: b reset ldr pc, _undefined_instruction ldr pc, _software_interrupt ldr pc, _prefetch_abort ldr pc, _data_abort ldr pc, _not_used ldr pc, _irq //发生中断时,CPU 跳到这个地址执行该指令 **假设地址为 0x18** ldr pc原创 2021-03-26 18:38:25 · 364 阅读 · 0 评论 -
rk3288 Linux中断系统中的重要数据结构
可以从 request_irq(include/linux/interrupt.h)函数一路分析得到irq_desc结构体irqaction结构体irq_data结构体irq_domain结构体irq_chip结构体原创 2021-03-26 18:39:55 · 378 阅读 · 0 评论 -
rk3288 中断的线程化处理
适用场景复杂、耗时的事情,尽量使用内核线程来处理。工作队列用起来挺简单,但是它有一个缺点:工作队列中有多个 work,前一个 work 没处理完会影响后面的 work。解决方法有很多种,比如干脆自己创建一个内核线程,不跟别的 work 凑在一块了。在 Linux 系统中,对于存储设备比如 SD/TF 卡,它的驱动程序就是这样做的,它有自己的内核线程。对于中断处理,还有另一种方法:threaded_irq,线程化的中断处理。...原创 2021-04-08 19:36:30 · 363 阅读 · 0 评论 -
rk3288 设备树中断编写格式
按键中断编写原创 2021-03-29 10:45:46 · 963 阅读 · 0 评论 -
rk3288 在irq基础上增加休眠和唤醒
适用场景当应用程序必须等待某个事件发生,比如必须等待按键被按下时,可以使用“休眠-唤醒”机制:APP 调用 read 等函数试图读取数据,比如读取按键;APP 进入内核态,也就是调用驱动中的对应函数,发现有数据则复制到用户空间并马上返回;如果 APP 在内核态,也就是在驱动程序中发现没有数据,则 APP 休眠;当有数据时,比如当按下按键时,驱动程序的中断服务程序被调用,它会记录数据、唤醒 APP;APP 继续运行它的内核态代码,也就是驱动程序中的函数,复制数据到用户空间并马上返回。休眠函数原创 2021-04-01 16:50:48 · 991 阅读 · 0 评论 -
异常与中断的概念及处理
一、内核中断方式查询方式:简单,但是累休眠-唤醒:不累,但是休眠干不了活了poll方式:要浪费点时间,但是可以继续干活异步通知:妈妈、小孩互不耽误1.1 嵌入式系统的情况CPU运行过程中有多种中断源,汇集到中断控制器,由中断控制器选择优先级最高的中断并通知CPU。比如:① 按键、② 定时器、③ ADC转换完成、④ UART发送完数据、收到数据、⑤ 等等CPU在运行的过程中,也会被各种“异常”打断。这些“异常”有:① 指令未定义、② 指令、数据访问有问题、③ SWI(软中断)、④ 快中原创 2022-02-13 21:05:36 · 570 阅读 · 0 评论