历史上的今天
返回首页

历史上的今天

今天是:2025年02月03日(星期一)

2020年02月03日 | s5pv210中断体系

2020-02-03 来源:eefocus

一、什么是中断?

1、中断的发明是用来解决宏观上的并行需要的。宏观就是从整体上来看,并行就是多件事情都完成了。

2、微观上的并行,就是指的真正的并行,就是精确到每一秒甚至每一刻,多个事情都是在同时进行的。宏观上面的并行并不等于围观的并行,有时候宏观上是并行的,微观上

是串行的。

3、为什么需要中断?因为单核CPU实际无法并行的,但是通过中断机制,可以实现假并行(宏观上的并行,微观上实际还是串行的)。

 

二、异常和中断的区别和联系

1、针对SoC来说,发生复位、软中断、中断、快速中断、取指令异常、数据异常等,我们都统一叫异常。所以说:中断其实是异常的一种。

2、异常的定义就是突发事件,打断了CPU的正常常规业务,CPU不得不跳转到异常向量表中去执行异常处理程序;中断是异常的一种,一般特指SoC内的内部外设产生的打断SoC

常规业务,或者外部中断(SoC的GPIO引脚传回来的中断)。

 

三、SoC对中断的实现机制:异常向量表

(1)异常向量表是CPU中某些特定地址的特定定义。当中断发生的时候,中断要想办法通知CPU去处理中断,怎么做到?这就要靠异常向量表。

(2)在CPU设计时,就事先定义了CPU中一些特定地址作为特定异常的入口地址(譬如定义0x00000000地址为复位异常向量地址,则发生复位异常时CPU会自动跳转到0x00000000地

址去执行指令。又譬如外部中断对应的异常向量地址为0x30000008,则发生外部中断后,CPU会硬件自动跳转到0x30000008地址去执行指令。)

(3)以上讲的是CPU硬件设计时对异常向量表的支持,下来就需要软件支持了。硬件已经决定了发生什么异常CPU自动跳转PC到哪个地址去执行,软件需要做的就是把处理这个异

常的代码的首地址填入这个异常向量地址。

(4)异常向量表中各个向量的相对位置是固定的,但是他们的起始地址是不固定的,各种SoC可以不一样,而且复杂ARM中还可以让用户来软件设置这个异常向量表的基地址。

(5)扩展到所有架构的CPU中:所有架构(譬如51单片机、PIC单片机)的CPU实现中断都是通过异常向量表实现的,这个机制是不变的;但是不同CPU异常向量表的构造和位置是

不同的。

 

四、s5pv210异常向量表的编程处理

1、像内存一样去访问异常向量表

(1)S5PV210的异常向量表可以改变(在CP15协处理器中),以适应操作系统的需求。但是目前系统刚启动时,此时DRAM尚未初始化,程序都在SRAM中运行。210在iRAM中设置了

异常向量表,供暂时性使用。

(2)查210的iROM application note文档中iRAM的地址分配,可知,iRAM中的异常向量表起始地址为0xD0037400。知道了异常向量表的起始地址后,各个异常对应的入口就很好

知道了。

总结:当我们将异常处理程序的首地址和异常向量表绑定起来后,异常处理初步阶段就完成了。到目前可以保证相应异常发生后,硬件自动跳转到对应异常向量表入口去执行

时,可以执行到我们事先绑定的函数。

 

2、为什么中断处理要先在汇编中进行

(1)中断处理要注意保护现场(中断从SVC模式来,则保存SVC模式下的必要寄存器的值)和恢复现场(中断处理完成后,准备返回SVC模式前,要将保存的SVC模式下的必要寄存

器的值恢复回去,不然到了SVC模式后寄存器的值乱了,SVC模式下原来正在进行的常规任务就被你搞坏了)。

(2)保存现场包括:第一:设置IRQ栈;第二,保存LR;第三,保存R0~R12

(3)为什么要保存LR寄存器?要考虑中断返回的问题。中断ISR执行完后如何返回SVC模式下去接着执行原来的代码。中断返回其实取决于我们进入中断时如何保存现场。中断返

回时关键的2个寄存器就是PC和CPSR。所以我们在进入IRQ模式时,应该将SVC模式下的下一句指令的地址(中断返回地址)和CPSR保存起来,将来恢复时才可以将中断返回地址

给PC,将保存的CPSR给CPSR。

(4)中断返回地址就保存在LR中,而CPSR(自动)保存在(IRQ模式下的)SPSR中。

 

3、汇编保存现场和恢复现场

(1)保护现场关键是保存:中断处理程序的返回地址,r0-r12(cpsr是自动保存的)

(2)恢复现场主要是恢复:r0-r12,pc,cpsr

 

五、s5pv210的向量中断控制寄存器

1、异常处理的2个阶段

可以将异常处理分为2个阶段来理解。第一个阶段是异常向量表跳转;第二个阶段就是进入了真正的异常处理程序irq_handler之后的部分。

(1)第一个阶段之所以能够进行,主要依赖于CPU设计时提供的异常向量表机制。第一个阶段的主要任务是从异常发生到响应异常并且保存/恢复现场、跳转到真正的异常处理程序处。

(2)第二个阶段的目的是识别多个中断源中究竟哪一个发生了中断,然后调用相应的中断处理程序来处理这个中断。

 

2、S3C2440的第二阶段处理过程

(1)第一个问题,怎么找到具体是哪个中断:S3C2440的中断控制器中有一个寄存器(32位的),寄存器的每一个位对应一个中断源(为了解决支持更多中断源,2440又设计了

一个子中断机制。在一级中断寄存器中有一些中断是共用的一个bit位,譬如AC97和WDT。对于共用中断,用子中断来区分究竟是哪一个发生了中断)

(2)第二个问题,怎么找到对应的isr的问题:首先给每个中断做了个编号,进入isr_handler之后先通过查阅中断源寄存器和子中断寄存器(中哪一位为1)确定中断的编号,然后

用这个编号去isr数组(isr数组是中断初始化时事先设定好的,就是把各个中断的isr的函数名组成一个数组,用中断对应的编号作为索引来查询这个数组)中查阅得到isr地址。

评价:2440的中断处理设计不是特别优秀:第一个过程中使用子中断搞成2级的很麻烦;第二个过程中计算中断编号是个麻烦事,很耗费时间。而中断处理的时间是很宝贵的(

系统有一个性能指标,叫实时性。实时性就是中断发生到响应的时间,这个时间越短越好。)

 

3、S5PV210的第二阶段处理过程

(1)第一个问题,怎么找到具体是哪个中断:S5PV210中因为支持的中断源很多,所以直接设计了4个中断寄存器,每个32位,每位对应一个中断源。(理论上210最多支持128个

中断,实际支持不足128个,有些位是空的);210没有子中断寄存器,每个中断源都是并列的。当中断发生时,在irq_handler中依次去查询4个中断源寄存器,看哪一个的哪

一位被置1,则这个位对应的寄存器就发生了中断,即找到了中断编号。

(2)第二个问题,怎么找到对应的isr的问题:210中支持的中断源多了很多,如果还使用2440的那一套来寻找isr地址就太慢了,太影响实时性了。于是210开拓了一种全新的寻

找isr的机制。210提供了很多寄存器来解决每个中断源对应isr的寻找问题,具体寻找过程和建立过程见下节,实现的效果是当发生相应中断时,硬件会自动的将相应isr推入一

定的寄存器中,我们软件只要去这个寄存器中执行函数就行了。

 

4、总结:第一阶段都相同,第二阶段各不同

(1)第一阶段(异常向量表阶段)2440和210几乎是完全相同的。实际上几乎所有的CPU在第一阶段都是相同的。

(2)第二阶段就彼此不同了。各个SoC根据自己对实时性的要求,和支持的中断源的多少,各自发明了各自处理中断,找到中断编号,进一步找到对应isr地址的方式。

 

五、S5PV210中断处理的主要寄存器

1、VICnINTENABLE和VICnINTENCLEAR
(1)VICnINTENABLE 对应interrupt enable,INTENCLEAR对应interrupt enable clear
(2)INTENABLE寄存器负责相应的中断的使能,INTENCLEAR寄存器负责相应的中断的禁止。
(3)当我们想使能(意思就是启用这个中断,意思就是当硬件产生中断时CPU能接收的到)某个中断时,只要在这个中断编号对应的VICnINTENABLE的相应bit位写1即可

(注意这个位写1其他位写0对其他位没有影响);如果我们想禁止某个中断源时,只要向VICnINTENCLEAR中相应的位写1即可。注意:这里的设计一共有2种:有些CPU

是中断使能和禁止是一个寄存器位,写1就使能写0就进制(或者反过来写1就进制写0就使能),这样的中断使能设计就要非常小心,要使用我们之前说过的读改写三部曲来操作;

另一种就是使能和禁止分开为2个寄存器,要使能就写使能寄存器,要禁止就写禁止寄存器。这样的好处是我们使能/禁止操作时不需要读改写,直接写即可。

 

2、VICnINTSELECT
(1)设置各个中断的模式为irq还是fiq。一般都设置成irq

(2)IRQ和FIQ究竟有何区别。210中支持2种中断,irq和fiq。irq是普通中断,fiq是快速中断。快速中断提供一种更快响应处理的中断通道,用于对实时性要求很高的中断源。

fiq在CPU设计时预先提供了一些机制保证fiq可以被快速处理,从而保证实时性。fiq的限制就是只能有一个中断源被设置为fiq,其他都是irq。
(3)CPU如何保证fiq比irq快?有2个原因:第一,fiq模式有专用的r8~r12,因此在fiq的isr中可以直接使用r8-r12而不用保存,这就能节省时间;第二,异常向量表中fiq是最

后一个异常向量入口。因此fiq的isr不需要跳转,可以直接写在原地,这样就比其他异常少跳转一次,省了些时间。

 

3、VICnIRQSTATUS和VICnFIQSTATUS
(1)中断状态寄存器,是只读的。当发生了中断时,硬件会自动将该寄存器的对应位置为1,表示中断发生了。软件在处理中断第二阶段的第一阶段,就是靠查询这个寄存器来得到中断编号的。

 

4、VICnVECTPRIORITY0~VICnVECTPRIORITY31
(1)中断优先级设置寄存器,设置多个中断同时发生时先处理谁后处理谁的问题。一般来说高优先级的中断可以打断低优先级的中断,从而嵌套处理中断。当然了有些硬件/软件可以

设置不支持中断嵌套。

 

5、VICnVECTADDR0~VICnVECTADDR31、VICnADDR

(1)这三个寄存器和210中断处理第二阶段的第二阶段有关。
(2)VICnVECTADDR0到31这32个寄存器分别用来存放真正的各个中断对应的isr的函数地址。相当于每一个中断源都有一个VECTADDR寄存器,程序员在设置中断的时候,把这个

中断的isr地址直接放入这个中断对应的VECTADDR寄存器即可。
(3)VICnADDR这个寄存器是只需要读的,它里面的内容是由硬件自动设置的。当发生了相应中断时,硬件会自动识别中断编号,并且会自动找到这个中断的VECTADDR寄存器,然

后将其读出复制到VICnADDR中,供我们使用。这样的设计避免了软件查找中断源和isr,节省了时间,提高了210的中断响应速度。

 

六、s5pv210中断处理编程实践

本代码并没有提供完整的源文件

/*************************************************************************************/

汇编代码: start.S文件

 1 #define WTCON        0xE2700000

 2 #define SVC_STACK    0xd0037d80

 3 #define IRQ_STACK    0xd0037f80

 4 #define SOFT_KEY    0xE010E81C

 5 

 6 .global _start

 7 .global IRQ_handle

 8 .extern main

 9 .extern irq_handler

10 

11 _start:

12     /*0 : 软开关设置*/

13     ldr r0, =SOFT_KEY

14     ldr r1, [r0]

15     ldr r2, =0x301

16     orr r1, r1, r2

17     str r1, [r0]

18 

19     /*1 : 关看门狗*/

20     ldr r0, =WTCON

21     ldr r1, [r0]

22     bic r1, r1, #0x20

23     str r1, [r0]    

24 

25     /*2 : 设置栈指针*/   

26     ldr sp, =SVC_STACK

27 

28     /*3 : 开启icache*/

29     mrc p15,0,r0,c1,c0,0

30     orr r0, r0, #0x1000

31     mcr p15,0,r0,c1,c0,0 

32 

33     /*4 : 调用C语言中main函数*/

34     bl main

35 

36 main_loop:

37     b main_loop

38 

39 IRQ_handle:

40     ldr sp, =IRQ_STACK     //设置中断模式下的栈地址

41     sub lr, lr, #4         //因为ARM的流水线机制的原因:中断返回来之后应该是要执行当前指令的下一条指令

42                            //而此时的PC值等于当前正在执行的指令在内存中地址 + 8

43                            //所以此时的PC-4就是我们当前正在执行的指令的下一条执行的内存地址

44                          

45     stmfd sp!, {r0-r12, lr}  //将寄存器中的数据写入栈中

46     bl irq_handler            //调用处理函数

47     ldmfd sp!, {r0-r12, pc}^ //恢复现场

48     

49     

50 #endif 

 

interrupt.c文件

 1 #define  INTERRUPT   1

 2 #if  INTERRUPT

 3 

 4 #include "interrupt.h"

 5 #include "include.h"

 6 

 7 void interrupt_init(void)

 8 {

 9     //将中断函数与异常向量表绑定 

10     r_EXCEPTION_IRQ = (unsigned int)IRQ_handle;   //注意这里的类型转换

11     

12     //首先禁止所有的中断

13     VIC0INTENCLEAR = 0xffffffff;     //向相应位写入1

14     VIC1INTENCLEAR = 0xffffffff;

15     VIC2INTENCLEAR = 0xffffffff;

16     VIC3INTENCLEAR = 0xffffffff;

17 

18     //选择中断类型

19     VIC0INTSELECT  = 0x00;           //写入0表示 IRQ中断类型

20     VIC1INTSELECT  = 0x00;

21     VIC2INTSELECT  = 0x00;

22     VIC3INTSELECT  = 0x00;

23 

24     //清除VICxADDR  保险的做法 不一定非要这么做

25     VIC0ADDR = 0x0;

26     VIC1ADDR = 0x0;

27     VIC2ADDR = 0x0;

28     VIC3ADDR = 0x0;

29 

30     //将GPIO设为外部中断模式

31     GPH0CON |= (0xff << 8);       //EXIT[2] EXIT[3]

32     GPH2CON |= (0xffff << 0);     //EXIT[16] - EXIT[19]

33 

34     //选择中断触发模式  本实验采用下降沿触发 010

35     EXT_INT_0_CON |= ((1 << 9)|(1 << 13));

36     EXT_INT_0_CON &= ~((1 << 8)|(1 << 10)|(1 << 12)|(1 << 14));

37     EXT_INT_2_CON |= ((1 << 1)|(1 << 5)|(1 << 9)|(1 << 13));

38     EXT_INT_2_CON &= ~((1 << 0)|(1 << 2)|(1 << 4)|(1 << 6)|(1 << 8)|(1 << 10)|(1 << 12)|(1 << 14));

39      

40     //绑定中断处理函数到VIC2VECTADDR0寄存器

41     VIC0VECTADDR2  = (unsigned int)exit_2;

42     VIC0VECTADDR3  = (unsigned int)exit_3;

43     VIC0VECTADDR16 = (unsigned int)exit_16_19;

44 

45     //清除中断挂起  PEND寄存器  读这个寄存器0表示没有发生  1 表示发生中断

46     //需要我们 写如 1 清除中断挂起

47     EXT_INT_0_PEND |= ((1 << 2)|(1 << 3));

48     EXT_INT_2_PEND |= ((1 << 0)|(1 << 1)|(1 << 2)|(1 << 3));

49     

50     //开启相应中断使能

51     VIC0INTENABLE |= ((1 << 2)|(1 << 3)|(1 << 16)|(1 << 17)|(1 << 18)|(1 << 19)); //中断控制器中的中断使能控制开关

52     EXT_INT_0_MASK &= ~((1 << 2)|(1 << 3));     //GPIO相关模块的中断使能控制的开关  写0开启

53     EXT_INT_2_MASK &= ~((1 << 0)|(1 << 1)|(1 << 2)|(1 << 3));

54 }

55 

56 void irq_handler(void)

57 {

58     //VICxADDR寄存器虽然是一个函数地址  但是在寄存器中是以整形数据存放

59     unsigned int vicaddr[4] = {VIC0ADDR, VIC1ADDR, VIC2ADDR, VIC3ADDR};

60     unsigned int vicstat[4] = {VIC0IRQSTATUS, VIC1IRQSTATUS, VIC2IRQSTATUS, VIC3IRQSTATUS};

61     int i = 0;

62     void (*isr)(void) = NULL;   //定义一个函数指针

63 

64     for(i = 0;i < 4;i++)

推荐阅读

史海拾趣

HEIMANN公司的发展小趣事

在电子行业中,HEC Inc(以下简称HEC)作为一家知名的科技公司,其发展历程充满了挑战与机遇。以下是五个关于HEC发展起来的相关故事,每个故事均基于事实描述:

1. 技术创新引领市场突破

HEC自成立之初便致力于技术创新,在通信设备领域取得了显著成就。公司研发的高效路由器和交换机产品,凭借其卓越的性能和稳定性,迅速在市场中占据一席之地。特别是在5G技术兴起的背景下,HEC提前布局,成功推出了多款支持5G网络的通信设备,满足了市场对高速、低延迟网络连接的迫切需求。这些技术创新不仅巩固了HEC在通信行业的领先地位,也为其后续的市场拓展奠定了坚实基础。

2. 环保理念推动可持续发展

随着全球对环保问题的日益重视,HEC积极响应号召,将绿色技术融入产品研发和生产过程中。公司推出的多款电子产品,如智能手机和平板电脑,均采用了环保材料和节能设计,有效降低了产品生命周期中的碳排放。此外,HEC还建立了完善的电子废弃物回收体系,实现了资源的循环利用。这些环保举措不仅提升了公司的品牌形象,也为其赢得了更多消费者的青睐和市场的认可。

3. 跨界合作拓展业务领域

为了进一步扩大市场份额,HEC积极寻求跨界合作机会。公司与多家知名汽车制造商合作,将先进的通信技术应用于车载智能系统中,提升了驾驶体验和行车安全。同时,HEC还与智能家居厂商合作,推出了多款智能家电产品,实现了家居设备的互联互通和远程控制。这些跨界合作不仅丰富了HEC的产品线,也为其带来了新的增长点。

4. 全球化战略布局

为了应对日益激烈的国际竞争,HEC制定了全球化发展战略。公司在全球范围内设立了多个研发中心和销售网络,以更好地了解当地市场需求并快速响应。通过整合全球资源,HEC成功推出了多款符合不同国家和地区消费者需求的产品。此外,公司还积极参与国际展会和交流活动,提升了品牌知名度和国际影响力。

5. 应对挑战实现转型升级

面对行业内的激烈竞争和技术变革,HEC始终保持着敏锐的洞察力和强大的适应能力。公司不断调整产品结构,加大研发投入,推动产品向高端化、智能化方向发展。同时,HEC还积极拥抱数字化转型,通过大数据、云计算等先进技术优化生产流程和管理模式,提高了生产效率和产品质量。这些努力使HEC在挑战中实现了转型升级,保持了持续稳健的发展态势。

Cermetek Microelectronics公司的发展小趣事

在追求经济效益的同时,Cermetek Microelectronics公司也积极履行社会责任。公司注重环保和可持续发展,采用环保材料和生产工艺,减少对环境的影响。此外,公司还积极参与社会公益事业,为社会做出贡献。这种负责任的态度不仅赢得了社会各界的认可,也为公司的长远发展注入了正能量。

这五个故事展示了Cermetek Microelectronics公司在电子行业中的发展历程和取得的成就。通过技术积累、品质管理、持续创新、国际化战略和社会责任等方面的努力,公司逐渐在微电子领域树立起了自己的品牌形象和市场地位。

GTE Microcircuits公司的发展小趣事
选择合适的复合放大器需要根据具体应用需求来考虑,包括所需的增益、带宽、噪声系数、电源电压等参数。同时,还需要考虑放大器的封装形式、功耗、以及成本等因素。建议在选择时参考数据手册和应用笔记等资料,并结合实际测试来确定最合适的型号。
Britool Expert公司的发展小趣事
学习高性能复合放大器电路的设计需要掌握模拟电路的基础知识,包括放大器的工作原理、电路分析方法、以及元器件的选择和使用等。此外,还需要通过阅读专业书籍、参加培训课程、以及实践项目等方式来不断积累经验和提高技能。
ASM公司的发展小趣事

进入21世纪,ASM公司开始关注中国市场的潜力。随着中国经济的快速增长和半导体产业的蓬勃发展,ASM公司看到了巨大的商机。公司加大了对中国市场的投入,与中国半导体代工厂建立了紧密的合作关系,为中国市场提供了高质量的产品和服务。这一举措不仅促进了ASM公司在中国市场的快速发展,也为中国半导体产业的进步做出了贡献。

Banner Engineering公司的发展小趣事

Banner Engineering公司成立于XXXX年,起初主要致力于传感器技术的研发和生产。在公司初创时期,面临着激烈的市场竞争和技术挑战。然而,公司凭借其创新的思维和技术实力,成功开发出一系列具有高精度、高可靠性的传感器产品,迅速在市场中获得了认可。这些传感器产品在工业自动化、机器人技术等领域得到了广泛应用,为Banner Engineering公司的初步发展奠定了坚实基础。

问答坊 | AI 解惑

ADSL线路测试技术

作为一种基于普通电话双绞线的传输技术,ADSL对物理传输线路有很大的依赖性。环路的特征将对ADSL服务的质量和性能级别产生决定性影响。首先在业务开通时会遇到如何选择ADSL线路,某条线路能否开通ADSL业务,可以开通的速率是多少,影响传输质量的原 ...…

查看全部问答>

玩网页游戏会关机

电脑进入正常,玩中游也正常,但只要是一玩网页游戏就会自动关机,检测电源显卡正常…

查看全部问答>

请问rtl8309如何控制其PHY寄存器

RTL8309的资料好少,我在网络上有找到通过SMI接口协议来操作寄存器的,能通过主芯片和8309之间的I2C来进行通信,然后控制寄存器吗?…

查看全部问答>

我两台机器的网卡都是百兆网卡,测速软件报告网速最高只有 26 Mbps,为什么呢?

我两台机器的网卡都是百兆网卡,我用测试软件测试了一下网速,能达到 26 Mbps,离 100 Mbps 还有很远呢!这是为什么呢? 我用的是直连网线。 我很关心 怎样能让测试结果非常接近 100 Mbps ? …

查看全部问答>

如何防止WINCE 5.0 多镜像地址空间重叠?

在config.bib中把CE镜像划分为了4个部分,例如: KERNEL.BIN,DRIVER.BIN,APP.BIN,NK.BIN 这样做以便后期对单个镜像文件升级,现在问题来了,每个BIN文件中的DLL在SLOT0,SLOT1中所占用的地址空间都是在编译器时计算好的。如果后面我的APP.BIN变化 ...…

查看全部问答>

无铅制造时代,恒温烙铁焊台大可借鉴蓄水池效应

    很多价格昂贵的无铅焊台都喜欢强调和炫耀瞬间强大的温度恢复能力,其实这个有一些钻牛角尖的做法,虽然性能是上去了,但焊台本身的总体制造成本以及使用成本也跟着抬高,势必转嫁到最终用户身上。       &nb ...…

查看全部问答>

被MSP430F2013的SPI搞死了

本来打算用2013做16位AD,然后将数据用SPI传送给149的,做的时候才发现,2013的资料实在是太少了,特别是中文资料,反复看了例程,网上的,TI的,到现在还没有能通讯上,哎,2013这个东东怎么看都和先前的片子不一样,149,133资料多,好用,看来2xxx的麻烦死了. ...…

查看全部问答>

请问arm寄存器的C#与R#表示

刚刚开始学arm,手册上写寄存器都是R15,R**的,但是看到代码里用的就是C0,C几的,请问这是为什么,有对应关系么? 谢谢。…

查看全部问答>