目录
前言
1、在CortexM内核中,当系统响应一个中断时
2、用与非门和或非门可以实现其他基本门电路。进而实现任何逻辑电路
3、cpu interface提供了功能包含
4、以Cortex-M3内核为例,如果某个中断在得到响应之前,其请求信号以若干的脉冲的方式呈现,则处理器处理的方式是
5、在Linux中,中断分为向量中断和非向量中断
6、对于ARM的处理器,中断给处理器提供了触觉,使处理器能够感知到外界的变化,从而实时的处理。ARM cortex-A系列处理器,提供了4个管脚给soc,实现外界中断的传递,分别是
7、关于中断的描述
8、总线fault是一种严重的错误
9、在Cortex-M系列内核架构中,总线fault 状态寄存器(BFSR)用来记录总线fault中断源,关于总线fault 状态寄存器中断源的描述
10、在CortexM内核中,已经内建了对中断嵌套的全力支持,无需使用汇编写代码,只需要为每个中断适当地建立优先级就可以
11、能够触发中断的信号叫中断源,常见的中断源有
12、存储器管理中断多与MPU有关,其诱因常常是某次访问触犯了MPU设置的保护策略
13、CortexM的Fault 类异常不包括
14、在CortexM内核中,建立一个外部中断的正确顺序
15、中断可分为内部中断和外部中断
16、电机的类型有很多种,若按照能量转换的角度进行划分,可分为
17、在Cortex-M3内核架构中,如果需要动态地更改中断向量表,则对于任何器件来说,中断向量表的起始处都必须包含的向量是
18、中断优先级
19、中断4状态
20、在系统中,中断处理是由内核执行的最敏感的任务之一,因为它必须满足一些约束条件
21、关于GIC中断的边沿触发处理说法
22、IRI与cpu interface通过gic stream协议传输信息,传输的信息,是以包为单位。包,分为两类包
23、中断延迟的定义
24、下面对Linux中IDT的描述
25、关于Linux中struct irq_domain的描述
26、NVIC 中断控制器是物联网芯片常用的中断控制器,在NVIC 的中断控制及状态寄存器中,记录当前正服务中断编号的寄存器是
本周日常学习的内容是中断相关的专项练习,中断也算是博主一个渐进明细的知识点,本篇整理了相关易错点和较为重要的知识点。
当CM3开始响应一个中断时,系统内部主要有以下操作:
入栈: 把8个寄存器的值压入栈
取向量:从向量表中找出对应的服务程序入口地址
选择堆栈指针MSP/PSP,更新堆栈指针SP,更新连接寄存器LR,更新程序计数器PC。
重定位向量是在系统初始化时完成的
cpu interface提供了以下的功能:
将中断请求发送给cpu
对中断进行认可(acknowledging an interrupt)
中断完成识别(indicating completion of an interrupt)
设置中断优先级屏蔽
定义中断抢占策略
决定当前处于pending状态最高优先级中断
中断信号一般是接入到中断控制器中,中断控制器需要判断和过滤中断信号,如果某个中断在得到响应之前,其请求信号以若干的脉冲的方式呈现,中断处理器视为只有一次中断请求,多出的请求脉冲会全部错失。这是情况发生一般是中断请求太快,以致于超出处理器反应限度
在linux中,根据中断入口跳转方法的不同,中断分为向量中断和非向量中断。采用向量中断的CPU 通常为不同的中断分配不同的中断号,当检测到某中断号的中断到来后,就自动跳转到与该中断号对应的地址执行。不同中断号的中断有不同的入口地址。非向量中断的多个中断共享一个入口地址,进入该入口地址后再通过软件判断中断标志来识别具体是哪个中断。也就是说,向量中断由硬件提供中断服务程序入口地址,非向量中断由软件提供中断服务程序入口地址。
ARM cortex-A系列处理器,提供了4个管脚给soc,实现外界中断的传递。分别是:
nIRQ: 物理普通中断
nFIQ: 物理快速中断
nVIRQ: 虚拟普通中断
nVFIQ: 虚拟快速中断
当发生中断嵌套时,比如先发生中断1,紧接着中断2打断了中断1,导致中断2执行,中断2执行完成后继续执行中断1,从而导致后发生的中断先执行,因此我们常说中断的嵌套处理会改变中断处理的次序
通常情况下当发生除0时,会产生中断,但Cortex-M3&M4中可以屏蔽该中断,不过不建议屏蔽该中断
中断是可以嵌套的,刚才描述是中断1和中断2就属于中断嵌套现象
通常使用的系统调用,如果深入系统调用的实现机制,就会发现,其内部实际上是通过中断从而从用户态进入核心态。
总线错误在实际工程中应该尽量避免,严重会导致系统崩溃。关于总线fault,我们需要了解:欲使能总线fault 服务例程,需要在NVIC 的“系统Handler 控制及状态寄存器”中置位BUSFAULTENA 位。要注意的是:在使能之前,总线fault 服务例程的入口地址必须已经在向量表中配置好,否则就成了作法自毙——程序可能跑飞。总线faults 发生时,只要没有同级或更高优先级的异常正在服务,且FAULTMASK=0,就会执行总线fault 的服务例程。如果在检测到总线fault 时还检测到了更高优先级的异常,则先处理后者,而总线fault 则被标记成悬起。最后,如果总线fault 被除能,或者总线fault 发生时正在处理同级或更高优先级异常,则总线fault 被迫成为“硬伤”——上访成硬fault,使得最后执行的是硬fault 的服务例程。如果在硬fault 服务例程的执行中又产生了总线fault,内核将进入锁定状态。
总线fault 状态寄存器中断源描述正确如下:
STKERR R/Wc :入栈时发生错误
UNSTKERR R/Wc :出栈时发生错误
IMPRECISERR R/Wc :不精确的数据访问违例
PRECISERR R/Wc : 精确的数据访问违例
IBUSERR R/Wc :取指时的访问违例
在使用中断嵌套时我们需要注意:
NVIC和CM3处理器会为我们排出优先级解码的顺序,会自动入栈和出栈。因此,在某个异常正在响应时,所有优先级不高于它的异常都不能抢占之,而且它自己也不能抢占自己。
所有服务例程都只使用主堆栈。所以当中断嵌套加深时,对主堆栈的压力会增大。并且何时嵌套多少级也是不可预料的。如果主堆栈的容量本来就已经所剩无几了,中断嵌套又突然加深,则主堆栈有被用穿的凶险。
另一个要注意的,是相同的异常是不允许重入的。因为每个异常都有自己的优先级,并且在异常处理期间,同级或低优先级的异常是要阻塞的,因此对于同一个异常,只有在上次实例的服务例程执行完毕后,方可继续响应新的请求。
中断系统中,常见的中断源有:
外部设备请求中断。一般的外部设备(如键盘、打印机和A / D转换器等)在完成自身的操作后,向CPU发出中断请求,要求CPU为他服务。
故障强迫中断。系统在一些关键部位都设有故障自动检测装置。如运算溢出、存储器读出出错、外部设备故障、电源掉电以及其他报警信号等,这些装置的报警信号都能使CPU中断,进行相应的中断处理。
实时时钟请求中断。在控制中遇到定时检测和控制,为此常采用一个外部时钟电路控制其时间间隔。需要定时时,CPU发出命令使时钟电路开始工作,一旦到达规定时间,时钟电路发出中断请求,由CPU转去完成检测和控制工作。
数据通道中断。数据通道中断也称直接存储器存取(DMA)操作中断,如磁盘、磁带机或CRT等直接与存储器交换数据所要求的中断。
程序自愿中断。CPU执行了特殊指令或由硬件电路引起的中断是程序自愿中断,当用户调试程序时,程序自愿中断检查中间结果或寻找错误所在而采用的检查手段,如断点中断和单步中断等。
存储器管理中断是实际应用中遇到最多的异常情况之一,能够触发存储器管理中断的原因坑你是访问了 MPU 设置区域覆盖范围之外的地址,往只读寄存器 写数据,用户级下访问了只允许在特权级下访问的地址和在不可执行的存储器区域试图取指。这里需要注意的是,即使没有MPU在不可执行的存储器区域试图取指也会触发存储器管理中断。
总线 faults
存储器管理 faults
用法 faults
硬 fault
正确的顺序是
1. 当系统启动后,先设置优先级组寄存器。
2. 如果需要重定位向量表,先把硬fault和NMI服务例程的入口地址写到新表项所在的地址中。
3. 配置向量表偏移量寄存器,使之指向新的向量表。
4. 为该中断建立中断向量。
5. 为该中断设置优先级。
6. 使能该中断
中断可分为内部中断和外部中断,内部中断的中断源来自CPU内部如:软件中断指令、溢出、除法错误等,操作系统从用户态切换到内核态需借助CPU内部的软件中断。外部中断的中断源来自CPU外部,由外设提出请求。定时器属于CPU外设定时模块,因此属于外部中断。
从能量转换的角度,发电机为机械能转换为电能,电动机为电能转换为机械能,变压器为电能形式转换。从电流的角度划分为直流电机和交流电机。从运动方式划分为旋转电机、直线电机、静止电机。从使用场合划分为潜水电机、防爆电机、航空电机。
如果需要动态地更改向量表,则对于任何器件来说,向量表的起始处都必须包含以下向量:
主堆栈指针(MSP)的初始值
复位向量
NMI
硬 fault 服务例程
除了主堆栈指针和复位向量这两个系统启动必须使用的,后两者也是必需的,因为有可能在引导过程中发生这两种异常。
对于每一个中断而言,有以下4个状态:
inactive:中断处于无效状态
pending:中断处于有效状态,但是cpu没有响应该中断
active:cpu在响应该中断
active and pending:cpu在响应该中断,但是该中断源又发送中断过来
中断处理是由内核执行的最敏感的任务之一,它必须满足下列约束:
中断应该被尽可能快地处理完。
中断处理程序必须编成使相应的内核控制路径能以嵌套的方式执行。
内核在处理一个中断时,可接受新的中断。但存在一个临界区,中断必须被禁止。
所以在常见的中断编程中,中断的设计一般将中断处理程序分为两部分执行,即上半部和下半部函数。上半部为中断被禁止的临界区,执行关键而紧急的任务,如把接收到的帧拷贝到输入队列,以便下半部函数执行时能进行处理。
中断可以丰富编程逻辑和架构
边沿触发处理:
外部边沿中断到达,中断状态被置为pending状态。
软件读取IAR寄存器值,表示PE认可该中断,中断状态被置为active状态
软件中断处理完毕后,写EOIR寄存器,表示优先级重置。过一段时间后,写DIR寄存器,中断状态被置为idle状态。
RI与cpu interface通过gic stream协议传输信息,传输的信息,是以包为单位。包,分为两类包:
命令包,分为redistributor命令包,cpu interface命令包
响应包,分为redistributor响应包,cpu interface响应包
AXI-stream协议,每次传输2个字节,多次传输,组成一个包。不同的包,大小不是一样的,比如有的是16个字节,有的是8个字节
在设计实时系统时,必须对中断延迟进行严肃和仔细地估算,因为这对程序执行的流程有着重大的影响。中断延迟的定义是从检测到某中断请求,到执行了其服务例程的第一条指令时,已经流逝了的时间。
对于大多数人来说,不会过多的关注IDT,通常在Linux中只需使用中断的API来进行中断配置和处理,但中断是怎么工作起来的呢?实际上IDT起着比较重要的作用,IDT需要在内核引导的过程中进行初始化的
硬中断号:中断控制器是采用硬中断号标识外设的中断。
软中断号:CPU需要通过该号来识别中断,假如有多个中断控制器,每个中断控制器各自对应16个从0到15的中断号,那CPU收到这个号后,不知道这个中断是从哪一个中断控制器派发过来的,因此引出了irq_domain的概念
在系统启动分配irq_domain时,就会调用函数__irq_domain_add把irq_domain加入到该链表张
除了线性映射外,还有基树映射,直接映射等,这些方法目前内核中有对应API接口,如irq_domain_add_linear, irq_domian_add_tree等
在实际应用中,我们调试程序有时需要知道当前中断服务号是多少,我们可以查看NVIC中断控制器。在NVIC 的中断控制及状态寄存器中,记录当前正服务中断编号的寄存器IPSR。EXTI_IMR是中断屏蔽寄存器,EXTI_EMR是事件屏蔽寄存器。EXTI_RTSR是上升沿触发选择寄存器。