一、基本概念【针对硬件中断=中断】
1、程序可控,而中断不可控。
中断何时运行,在哪里运行,无法控制。
2、中断函数
既没有形参,又不可能返回参数。就是因为直接和硬件接触,也不可能给硬件返回参数,也不可能传递一个什么参数。
3、中断向量表:
处理器能处理的所有中断提前定义好函数,
中断的所有运行地址,提前定义好,形成一张表格。
3.1、向量:
①up:向量,有大小和方向,向量是中断函数的入口地址。【不理解什么是大小,什么是方向】
②这个向量,不能理解为物理学中的向量,而应理解为数学中的向量:中学物理或工程上常说有大小有方向的量就叫矢量,其实这只是形象化的说法,不够严格,这和数学上的定义是有区别的。
③线性代数中,方向性怎么定义?
单纯的向量空间里没有方向。定义方向性需要内积。定义了内积的线性空间叫做欧几里得空间。 {R}^n 就是一个欧几里得空间。有了内积,就可以定义夹角cos⟨a,b⟩,因此就有了方向性。
④其他观点:我个人的观点是矢量和直角坐标本质上是分离的,直角坐标对于矢量来说只是一种数学上的刻画罢了,类似的刻画还有像极坐标,球面坐标这样的。
参考:https://www.zhihu.com/question/267731204
4、中断分类
(1)中断源角度分类:
硬件中断=中断:
- 
内部硬件中断:内部模块产生的,定时器之类的。
- 不可屏蔽
 - 定时中断:可预见的。
 - 内部硬件中断,包括定时中断,=软中断?
 
 - 
外部硬件中断(硬中断/随机中断):引脚电平的变化引起的中断,比如GPIO,串口,USB等。
- 随机中断:随机的,无法事先预见发生时间。
 - 分类:
- 可屏蔽:
 - 中断控制器:
 
 
 
软件中断=异常=软件触发的中断:
- 缺页等由软件产生的错误
 - 故障fault,陷阱trap,终止abort
 - 系统调用,属于软件中断:
- 调用操作系统接口,退出用户态,进入内核执行。
 - 主动做的。
 
 
软中断vs软件中断
软中断(softIRQ)=中断下半部机制。ISR运行时间不易过长,linux将中断中的一部分逻辑推后执行,这就是softIRQ,它完全由软件实现;
由于ISR运行时间不易过长,且不能睡眠,linux将中断中的一部分逻辑推后执行,于是诞生了软中断机制。实际上出现在内核代码中的术语“软中断(softirq)”常常表示可延迟函数的所有种类,即tasklet、softirq、work queue都可以统称为“软中断”,为了不产生混淆,我们使用更加广泛的统称:中断下(底)半部。
软件中断(Software Interrupt),从软件中断指令而来。在32位x86中,为了实现linux用户态到内核态的切换,linux使用软中断指令“int 0x80”来触发异常,切换CPU特权级,实现系统调用。
参考图:【和我的分类不完全一样】

(2)ARM处理器处理角度,一般分类:
正常中断请求:
快速中断请求:有的ARM处理器支持,有的不支持。
5、中断案例(51单片机)
抽象层无法理解/有争议/说不清时,要转到具体的实际案例中,直观看到实际手册,则会一目了然!
参考:
https://www.bilibili.com/video/BV1ht4y1m794
二、中断过程
上半部分&下半部分
Linux中断的相关内容,一定会看到这样的描述:中断处理分为上半部分和下半部分。
上半部分不能消耗太多的时间,主要处理与硬件相关的重要工作;其他不重要的工作,都放在下半部分去做。
例如:如果使用工作队列来实现下半部分的工作,只需要2步动作:
//1. 定义处理函数
static struct work_struct mywork;
static void mywork_handler(struct work_struct *work)
{
    printk("This is myword_handler...\n");
}
//2. 在中断处理函数中,注册函数
INIT_WORK(&mywork, mywork_handler);                                                         
schedule_work(&mywork);
1、中断需要BootLoader引导
中断向量表的拷贝是嵌入式程序启动时要做的一件事:
程序每次上电,都需要BootLoader引导,即把中断向量表拷贝到RAM中。一断电就没有了,所以每次上电都需要BootLoader引导。
2、中断发生时,地址如何处理:栈+PC
(1)首先要把当前地址压栈记录,
(2)然后,处理器会把中断地址从中断向量表中读出来,放到PC中。程序计数器PC,可记录当前执行的指令地址。
3、出错情况:
(1)跑飞:①使能中断后,需要写中断函数定义,如果没写,相应地址找不到函数,程序就会跑飞。②中断中有一个比较长的延时函数,也会造成程序的跑飞。【头脑一片空白,不知道该干啥】
(2)回不去:中断完成后,没有把状态量给清除【把PC的当前中断地址清除后,PC会自动去栈顶取出最近的原地址。不清除当前PC的中断地址,也就导致PC没有办法自动取原地址】,就会永远在中断函数中循环,回不到原地址去了。
参考:
https://www.bilibili.com/video/BV1zJ411X7v1 【这个视频是嵌入式小姐姐讲的,主要讲硬件中断=中断,但在后台开发中也有软件中断=异常。】
https://www.bilibili.com/video/BV1qd4y137qY
https://www.cnblogs.com/sewain/p/15704361.html
https://zhuanlan.zhihu.com/p/360683396
https://blog.csdn.net/weixin_42240667/article/details/105071373
https://www.bilibili.com/video/BV1ht4y1m794 【这个视频是嵌入式入门的一系列教程。讲中断这节时,依据51单片机的手册,有线路图,直观好理解】
            
 
作者:西伯尔            
 
出处:http://www.cnblogs.com/sybil-hxl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 
                    
                
                
            
        
浙公网安备 33010602011771号