历史上的今天
返回首页

历史上的今天

今天是:2024年11月05日(星期二)

正在发生

2021年11月05日 | 一起学mini2440裸机开发(九)--ARM中断控制系统

2021-11-05 来源:eefocus

ARM处理器程序的执行流程种类


●正常执行:每执行一条ARM指令,程序计数器PC的值自动加4。这一过程描述了应用程序顺序执行的状态。


●跳转执行:通过B、BL跳转执行,实现程序在一定范围内的跳转执行。这一过程描述了ARM处理器程序执行过程中的过程调用。


●中断处理:在应用程序执行过程中,发生中断后,ARM处理器在执行完当前指令后,跳转到上述中断对应的中断处理程序处去执行,执行完中断处理程序后,再返回到发生中断的指令的下一条执行处接着执行。这一过程描述了ARM处理器对异常中断的响应情况。


S3C2440中断系统概述


在ARM处理器运行过程中,需要与系统的各类外部设备进行通信,包括发出控制信息、读取外部设备的状态信息以及采集数据等。完成上述功能有以下两种实现方法。


●查询方式:处理器不断地查询外部设备的状态,一般是每隔一段时间查询一次或者是始终在查询,这样做的缺点是实时性差、浪费处理器时间。


●中断方式:当外设状态发生变化时发送一个信号给处理器,处理器通过内部的控制逻辑找到具体的外部设备,然后对请求信息进行响应。在这种情况下,处理器的利用率大大提高,同时也提高了系统的实时性。


ARM处理器对中断第 处理流程基本符合下面的流程。


①中断发生后,中断控制器将中断请求发送给CPU


②CPU将当前程序的运行环境(程序的运行环境包括程序执行过程中使用的寄存器以及程序的返回地址等信息)保存,调用相应的中断处理程序。


③在中断处理程序中,识别具体是哪个中断发生,并进行相应的处理


④从中断处理程序返回,恢复被中断程序的运行环境,接着执行。


ARM处理器有7种工作模式,如下表所示


表1 ARM处理器工作模式

image.png?imageView2/2/w/550

ARM处理器的工作模式分为用户模式和特权模式,除用户模式外的其他6种工作模式为特权模式。此外,除用户模式和系统模式外的其他5种工作模式又称为异常模式。

ARM处理器的工作模式可以通过软件改变,也可以通过外部中断或异常处理来改变处理器的工作模式。大多数的应用程序运行在用户模式下,当处理器运行在用户模式下时,某些被保护的系统资源是不能被访问的。


除了软件切换工作模式外,还有没有其他方法呢?答案当然是 有!通过异常中断的方式也可以进入相应的工作模式。例如,当IRQ中断发生时,处理器就进入外部中断模式(IRQ模式)。


深入理解CPU的工作模式


ARM处理器共有37个寄存器(曾经面试官就问我这个了),其中包括31个通用寄存器和6个状态寄存器,这些寄存器都是32位的。AMR处理器的寄存器如下图:

ARM处理器共有7种工作模式,每种工作模式都有对应的寄存器,在程序执行过程中,ARM处理器肯定处于上述7种工作模式的中的一种,在该工作模式下可见的寄存器(即在该模式下可以访问的寄存器)主要有:15个通用寄存器(R0-R14)、程序状态寄存器(CPSR或者SPSR)、程序计数器R15(PC)。由上图可以看出,有些寄存器是各个模式公用的(也就是说,它们是同一个物理寄存器,因此当切换工作模式的时候,要保存这些寄存器的值),如R0-R7,有些寄存器是各个模式独自拥有的物理寄存器(如上图标黑色三角号的寄存器)。


当进行工作模式切换时,哪些寄存器的值需要保护呢?为什么快速中断模式比外部中断模式中断响应的速度要快?


假设ARM处理器处于用户模式(User模式)执行程序,在程序执行过程中,发生了外部中断,则处理器进入外部中断模式(IRQ模式),从上图可以看出,用户模式和IRQ模式的寄存器R0-R12是公用的,也就是说,在进入IRQ模式之前,在用户模式下可能使用到了寄存器R0-R12。如果在IRQ模式中也需要使用,那么寄存器R0~R12中的值将被更改,在IRQ模式执行完中断处理程序,返回到用户模式后,寄存器R0-R12中的值被破坏了。因此,在IRQ模式中,使用寄存器R0-R12之前需要将其中的值保存,当从IRQ模式返回到用户模式时将原来的值恢复就可以避免上述问题。


从上图还可以看出,用户模式下的寄存器R13-R14和IRQ模式的寄存器R13_irq、R14_irq不是同一个寄存器(R13_irq、R14_irq有个黑色小三角说明这两个寄存器是独立的寄存器),也就是说在每种工作模式中,这两个寄存器是独立的。因此,当从用户模式切换到IRQ模式时,不需要保存这两个寄存器的值。


此外,从上图还可以看到,用户模式和快速中断模式(FIQ模式)公用的寄存器是R0-R7,在FIQ模式中,R8_fiq~R14_fiq是独立的。因此,当从用户模式切换到快速中断模式(FIQ)时不需要保存这几个寄存器的值,只需要保存R0-R7的值即可。因此发生快速中断只需要保存R0-R7,共8个寄存器。但是,当发生外部中断时需要保存R0~R12共13个寄存器,这里讲的保存寄存器的值是通过将其值入栈实现的,入栈是需要时间的,因此快速中断的响应时间要快一些。


中断控制器


S3C2440中断控制器可以接受来自60个中断源的中断请求。对于ARM处理器而言,中断源很多,为了更好的处理各种中断,当中断发生时,中断请求并不是直接发送给CPU,而是发送给中断控制器(中断控制器需要用户进行初始化),中断控制器进行裁决后,选择出当前最需要处理的中断请求发送给CPU,这样可以降低CPU的负担。


S3C2440处理器的中断控制器结构如下图1所示:

有那么多的中断,咱们怎么入手呢?咱就从其中一个中断学习,学会之后举一反三吧!


1、中断从哪里来


学习中断只需要弄清楚这样的问题:从哪里来,到哪里去。即中断源是从哪里来的,中断发生后程序是如何执行的?


图1可以看出,中断的来源是Request sources(with sub-register)和Request sources(without sub-register)。


● Request sources(whith sub-register)主要处理以下类型的中断。例如,串口UART,UART中断包括发送中断、接收中断和因错误而产生的中断,但是这三个中断都属于一个大类,即都属于UART中断。如下图2所示展示了这类子中断的处理流程。当UART发送中断产生时,SUBSCPND寄存器中响应的位会置1,如果INTSUBMSK中不对其进行屏蔽,则SRCPND中的UART中断会置1。

同种设备可能会对应几种中断,S3C2440处理器采取的措施是:SRCPND存储的是大类的中断,具体这一大类中断中哪种类型的子中断发生了,需要再查询SUBSRCPND寄存器才能得到。


例如,SRCPND中的UART中断位置1了,说明发生了UART中断,但是具体是UART接收中断,还是UART发送中断或者是出错,在该寄存器中无法确定具体哪种类型的中断发生,因此还需要查询SUBSRCPND寄存器才能确定具体哪种类型的中断发生了。


● Request sources(without sub-register)主要处理以下类型的中断。例如,外部中断1,这种类型的中断只有一种情况,当外部中断的触发条件满足时就产生中断,这一类中断没有子类。


2、如何屏蔽中断请求信号


上面咱们说了中断“从哪里来”的问题。但是,并不是只要产生中断CPU就要对其进行响应,那么,如何使CPU不对某些中断进行响应呢?


最简单的情况是将该中断屏蔽掉。因此,这里就设计到中断屏蔽寄存器,只要向该中断屏蔽寄存器中的某一位写1,就可以将该位对应的中断屏蔽掉。


中断屏蔽寄存器有两个(其实还有一个专门用于处理外部中断屏蔽的寄存器,关于它将在咱们说外部中断实验部分讲解):寄存器INTSUBMSK和寄存器INTMSK。屏蔽中断请求信号,需要屏蔽某一大类的中断时,就需要用到寄存器INTMSK,屏蔽某一个子类的中断时就需要用到寄存器INTSUBMSK。

  

   

例1:屏蔽UART0中断


寄存器INTMSK共32位,每一位对应一种类型的中断,当向该位写1时,就可以将中断屏蔽,如图3所示。因此,要屏蔽UART0中断,只需要向寄存器INTMSK的第28位写1即可。


实现上述功能的代码如下:


   #define   INTMSK   (*(volatile unsigned int *)0x4A000008)


   INTMSK|=1<<28;



例2:只屏蔽UART0发送中断,但不屏蔽UART0接收中断


由前面的分析可以知道,要实现本例的功能,需要打开UART0总中断,然后只屏蔽掉UART0发送中断即可。这时,需要用到子中断屏蔽寄存器INTSUBMSK,该寄存器是32位的,但是高17位保留未用,只用到了第15位,每一位对应一种类型的子中断,如图4所示。


实现上述功能的代码如下:


   #define  INTMSK    (*(volatile unsigned int *)0x4A000008)


   #define  INTSUBMSK   (*(volatile unsigned int *)0x4A00001C)


   INTMSK&=~(1<<28);        //不需要屏蔽UART0总中断


   INTSUBMSK|=1<<0;        //只需要屏蔽UART0发送子中断


3、中断模式

寄存器INTMOD是中断模式寄存器,S3C2440处理器的中断分为一般的中断IRQ和快速中断FIQ,INTMOD寄存器的各位含义如图5所示。当INTMODE中某一位置1时,该位对应的中断被配置为快速中断模式。INTMOD如果不进行初始化,那么所有的中断默认的都是IRQ模式。

4、中断优先级

为了更好地响应各种类型的中断,S3C2440处理器内部还有中断优先级寄存器,用于配置不同中断的优先级,可以采用默认值即可。


下一节结合具体实验讲中断怎么执行,怎么利用中断。

推荐阅读

史海拾趣

动运科技(DONGWOON)公司的发展小趣事

经过多年的发展,动运科技已经成长为一家在电子行业中具有重要影响力的企业。面对未来,公司将继续坚持技术创新和市场拓展的战略方针,不断推出更加优质的产品和服务。同时,动运科技也将积极应对行业变革和市场挑战,加强与全球合作伙伴的沟通和合作,共同推动电子行业的持续发展和进步。展望未来,动运科技将继续以开放的心态和创新的精神,迎接更加美好的未来。

请注意,以上故事是基于现有信息进行的概括性描述,并非具体的历史事件或详细数据。如需更详细的信息,建议查阅相关新闻报道或公司官方资料。

Cygnal Integrated Products Inc公司的发展小趣事

为了进一步扩大市场份额,Cygnal决定进入国际市场。公司通过参加国际电子展、与海外代理商合作等方式,积极推广其产品和服务。同时,Cygnal还针对不同地区的市场需求进行了产品定制和优化,使其产品更加符合当地消费者的需求。这些努力使Cygnal在国际市场上取得了显著的成功。

Auris公司的发展小趣事

2019年,强生公司以34亿美元的价格收购了Auris Health。这次收购对于双方来说都具有重要意义。对于Auris而言,它获得了强大的资金支持和市场资源,有助于加速其产品的市场推广和技术研发。对于强生来说,它借此机会获得了Auris在呼吸道手术和肺癌检测方面的先进技术,进一步巩固了其在医疗领域的领先地位。

GCi Technologies公司的发展小趣事
3.5V至12V(具体范围可能因型号而异)。
优先(苏州)半导体公司的发展小趣事

东微半导是一家在苏州扎根14余年的半导体公司,致力于自主研发和生产功率半导体核心器件。在充电桩产业快速发展的背景下,东微半导率先量产国内首款自主研发充电桩用功率半导体核心器件,打破了国外厂商的垄断地位。公司经过多年的自主研发,获得了创新结构的高压超级结技术的专利,使MOSFET场效晶体管的电能转换效率提升,具有动态损耗小、发热量低的优点。经客户端实测,整体性能达到了国际一流水平,现已出口至韩国、日本和德国等国际市场。

Advanced Technology Corp公司的发展小趣事

ATC公司的初创时期充满了挑战与艰辛。公司由几位电子工程领域的专家创立,他们凭借对技术的深刻理解和敏锐的市场洞察,决定投身于电子产品的研发与生产。在资金匮乏、市场竞争激烈的环境下,他们夜以继日地工作,不断试验、改进,最终成功研发出了一款具有竞争力的电子产品,为公司的发展奠定了坚实基础。

问答坊 | AI 解惑

903恒温电烙铁电路图

核心的IC就是运放,或者LM324,LM358,通过双向可控硅来控制加热芯通断! 温度控制采用热电偶,或者热敏电阻;电源采用220VAC直接RC降压。 成本比较低廉,损坏之后可以参考此电路进行维修!…

查看全部问答>

74HC595驱动两位数码管74HC595驱动两位数码管

本帖最后由 paulhyde 于 2014-9-15 03:05 编辑 74HC595驱动两位数码管74HC595驱动两位数码管    …

查看全部问答>

会汇编的请指点

我看书上的例子,不知为什么运行没有反应(没有出现对话框)这是一个对话框的例子 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ; Sample code for < Win32ASM Programming > ; by 罗云彬, http://asm.yeah.net ;>> ...…

查看全部问答>

WINCE5 永久添加注册表问题(HIVE)

我按照网上的方法加HIVE注册表,但加了之就进入不了WINCE系统,,一直停在开机画面中,请问大家有何良策呀…

查看全部问答>

一个有关cxa1238的图,高手请指点一下

本帖最后由 paulhyde 于 2014-9-15 09:39 编辑 各位高手帮忙指点一下,按照下图中的cxa1238芯片的22脚接的本振,可是怎么调频率总是680k左右,我的载频是35M,所以本振应该是在45M左右,可是怎么调可调电容,它频率总不变啊!!!!找也没找出原因 ...…

查看全部问答>

BGA焊接 , 你也是高手!

BGA焊接,你也是高手   BGA的焊接,对DIY爱好者始终是个难题,很多人对它望而却步。手工焊接时,如果第一次没有成功,很可能将它这个芯片丢弃,实在可惜。我们可以研究一下工厂里对它的焊接过程,找一找手工焊接的方法。 本帖的目的 ...…

查看全部问答>

【TIVA C Launchpad 学习笔记六】定时器四种模式:单次计时,周期计时,数捕获,计时捕获

模式一&模式二:单次计时&周期计时/******************************************* 开发坏境:CCSv5.4 开发板:TIVA C Launchpad(TM4C123GH6PM) 程序功能:16位定时器,单次定时模式和周期性定时模式 程序说明: 编程者:Linchpin *************** ...…

查看全部问答>

安防电子—综合布线

各位前辈们好,小弟刚刚出来做安防这一行,对产品了解不多,对综合布线更是一窍不通,希望各位前辈可以指点下,有哪些书籍或者网站可以帮助我更快的学好弱电的综合布线,小弟在此谢过哈!…

查看全部问答>

STM32F103 LWIP TCP客户端连接不上

请教各位兄弟姐妹,我用STM32F103ZET6+ENC28J60学习LWIP,当用TCP服务器模式时,通信正常,用TCP客户端模式时,能ping通,但是连接不上,请各位帮忙想想是什么问题,以下是主要代码。 int main(void) {          ...…

查看全部问答>