1.1S3C2440体系中止
CPU和外设构成了计算机体系,CPU和外设之间经过总线进行衔接,用于数据通信和操控,CPU办理监督计算机体系中一切硬件,一般以两种方法来对硬件进行办理监督:
l查询方法:CPU不断的去查询每一个硬件的当时状况,依据硬件的状况决议处理与否。好比是工厂里的检查员,不断的检查各个岗位作业状况,发现状况及时处理。这种方法完结起来简略,一般用在只需少数外设硬件的体系中,假如一个计算机体系中有许多硬件,这种方法无疑是耗时,低效的,一起还很多占用CPU资源,而且对多任务体系反应迟钝。
l中止方法:当某个硬件发生需求CPU处理的事情时,主动经过一根信号线“奉告”CPU,一起设置某个寄存器里对应的位,CPU一旦发现这根信号线上的电平有改动,就会中止当时程序,然后去向理宣布该中止请求。这就像是医院重危病房,病房每张病床床头有一个应急按钮,该按钮衔接到病房监控室里操控台一盏指示灯,只需该张病床呈现紧急状况患者按下按钮,病房监控室里电铃会响起,告诉医护人员有紧急状况,医护人员这时检查操控台上的指示灯,找出具体病房,病床号,直接曩昔向理紧急状况。中止处理方法相对查询方法要杂乱的多,而且需求硬件的支撑,可是它处理的实时性更高,嵌入式体系里根本上都运用这种方法来处理。
体系中止是嵌入式硬件实时地处理内部或外部事情的一种机制。关于不同CPU而言,中止的处理仅仅细节不同,大体处理流程都相同,S3C2440A的中止操控器结构如下图所示:
图3-3S3C2440中止操控器
中止请求由硬件发生,依据中止源类型别离将中止信号送到SUBSRCPND(SubSourcePending)和SRCPND(SourcePending)寄存器,SUBSRCPND是子中止源暂存寄存器,用来保存子中止源信号,SRCPND是中止源暂存寄存器,用来保存中止源信号。中止信号可经过编程方法屏蔽掉,SUBMASK是子中止源屏蔽寄存器,能够屏蔽指定的子中止信号,MASK功用同SUBMASK用来屏蔽中止源信号。中止分为两种形式:一般中止的和快速中止,MODE是中止形式判别寄存器,用来判别当时中止是否为快速中止,假如为快速中止直接将快速中止信号送给ARM内核,假如不是快速中止,还要将中止信号进行裁定挑选。S3C2440A支撑多达60种中止,很有或许多个硬件一起发生中止请求,这时要求中止操控器做出判决,Priority是中止源优先级裁定挑选器,当多个中止发生时,挑选出优先级最高的中止源进行处理,INTPND是中止源成果寄存器,晒干寄存优先级裁定出的仅有中止源。
1中止的发生-中止源
S3C2440A支撑60种中止源,根本上分量了开发板内部,外部设备等对中止的需求。其间每一个中止源对应寄存器中的一位,明显要支撑60种中止至少需求二个32位寄存器,SUBSRCPND和SRCPND别离保存中止源信号。S3C2440A对60种中止源的办理是按层级分的。如图3-4所示:
图3-4中止源信号复合示意图
S3C2440A将中止源分为两级:中止源和子中止源,中止源里包括单一中止源和复合中止源,复合中止源是子中止源的复合信号。照实时时钟中止,该硬件只会发生一种中止,它是单一中止源,直接将其间止信号线衔接到中止源寄存器上。关于复合中止源,以UART串口为例进行阐明,S3C2440A能够支撑3个UART串口,每个串口对应一个复合中止源信号INT_UARTn,每个串口能够发生三种中止,也便是三个子中止:接纳数据中止INT_RXDn,发送数据中止INT_TXDn,数据过错中止INT_ERRn,这三个子中止信号在中止源寄存器复合为一个中止信号,三种中止任何一个发生都会将中止信号传递给对应的中止源INT_UARTn,然后经过中止信号线传递给ARM内核。
图3-5UART串口中止源信号复合示意图
总中止源详下面表中列出了S3C2440A部分中止源,它别离对应中止源寄存器里某个位:具体中止源请检查S3C2440A硬件手册。
表3-5部分中止源信号
中止源 | 描绘 | 优先级裁定分组 |
INT_ADC | 数模转化和触摸屏中止 | ARB5 |
INT_RTC | 实时时钟中止 | ARB5 |
INT_UART0 | UART0中止(包括子中止) | ARB5 |
INT_NFCON | NandFlash操控中止 | ARB4 |
INT_WDT_AC97 | 看门狗中止 | ARB1 |
EINT8-23 | 外部中止8~23(包括外部子中止) | ARB1 |
EINT4-7 | 外部中止4~7(包括外部子中止) | ARB1 |
EINT3 | 外部中止3 | ARB0 |
EINT2 | 外部中止2 | ARB0 |
EINT1 | 外部中止1 | ARB0 |
EINT 0 | 外部中止0 | ARB0 |
中止信号除上述分法之外,还能够依照硬件方位分为:外部中止源和内部中止源。
l内部中止源:它是嵌入式体系中常见硬件发生的中止信号,比方:UART串口中止源,时钟Timer中止源,看门狗中止源等
l外部中止源:有时嵌入式体系里要在外部接口上挂载一些外部设备,这些设备并不是一个通用嵌入式体系里必备硬件,比方:蓝牙模块,各种传感器,WIFI无线通信模块,这些硬件也要发生中止让CPU来处理数据,因而这些外设硬件经过中止信号线衔接到中止操控器上,它们发生的中止叫做外部中止信号。它们有着和内部中止相同的处理机制,只不过,它没有一个固定的中止号与之对应,硬件与嵌入式体系的衔接方法与中止处理完全由体系硬件与软件设计者完结。
外设硬件经过输入输出接口I/O Ports挂接到嵌入式体系上,I/O Ports向外设供给外部中止信号线,输出电源,频率时钟和输入输出信号线,外部硬件依据自己需求衔接到I/O Ports上,发生中止时向外部中止信号线上送出中止信号,经过外部中止信号线传递到中止操控器。
按键Key能够以为最为简略的一种硬件设备了,如下图所示:
图3-6按键硬件接线原理图
它功用很简略,能够将电路接通,按键K1~K6一端接地为低电平,别的一端接电源正极为高电平,EINT8,EINT11,EINT13,EINT14,EINT15,EINT19六根中止信号线别离和高电平端按键相连,当按键按下时电路接通,整个电路变成低电平,中止信号线上电压发生改动,经过设置中止触发方法,发生外部中止请求,输入到CPU内部,然后完结按键中止操控。
S3C2440A能够支撑EINT0~EINT23共24种外部中止,完全能够分量小型嵌入式设备外设硬件的需求。
外部中止源也分为外部中止源和外部子中止源,其处理方法和内部中止源根本相同。
1.1.1中止优先级
S3C2440A支撑60种中止,多个硬件或许一起发生中止请求,我们CPU只能处理一个中止,中止操控器怎样挑选出一个最佳的中止,交给ARM内核进行处理呢?中止操控器选用优先级裁定比较的方法进行挑选,找出优先级最高的中止源。中止操控器将60种中止源分红7组,如下图所示,它相似体育赛事里的竞赛方法,一切参赛选手在小组赛PK,挑选出小组赛最优异选手,然后进入决赛阶段和其它小组最优先挑选再PK,最终优胜者便是总冠军。其间ARBITER0~ARBITER5为“小组赛”阶段,中止源信号在各自小组里进行优先级裁定,挑选出最高优先级中止信号,每小组选出的中止信号送到ARBITER6,也便是决赛阶段,挑选出最高优先级中止信号,交给ARM内核。
图3-7S3C2440优先级裁定示意图
中止信号在7个分组里PK时的优先级是可编程的,经过PRIORITY寄存器进行优先级设置。如下表(只列出PRIORITY寄存器部分位):
表3-6中止优先级操控寄存器(PRIORITY)
寄存器名 | 地址 | 是否读写 | 描绘 | 复位默认值 |
PRIORITY | 0x4A00000C | R/W | 中止优先级操控寄存器 | 0x7F |
PRIORITY | 位 | 描绘 | 初始值 |
ARB_SEL6 | [20:19] | 裁定组6优先级排序方法 00 = REQ 0-1-2-3-4-5 01 = REQ 0-2-3-4-1-5 10 = REQ 0-3-4-1-2-5 11 = REQ 0-4-1-2-3-5 |
0x00 |
ARB_SEL5 | [18:17] | 裁定组5优先级排序 00 = REQ 1-2-3-4 01 = REQ 2-3-4-1 10 = REQ 3-4-1-2 11 = REQ 4-1-2-3 |
00 |
… | … | … | … |
ARB_MODE6 | [6] | 裁定组6优先级是否轮转: 0 =不轮转,1 =轮转 |
1 |
ARB_MODE5 | [5] | 裁定组5优先级是否轮转: 0 =不轮转,1 =轮转 |
1 |
… | … | … | … |
经过设置裁定组n优先级排序方法位,设置每个裁定组内中止信号的优先级次序,比方:ARB_SEL5分组时包括四个中止信号:REQ1 INT_UART0, REQ2 INT_SPI1, REQ3 INT_RTC, REQ4 INT_ADC,ARB_SEL5位选用默认值:00,当INT_UART0和INT_RTC中止信号一起发生时,INT_UART0会被选出,经过可编程方法改动优先级排序方法来改动中止信号优先级。
ARB_MODE0~ ARB_MODE6为每个裁定分组的优先级轮转设置位,选用默认值时,当时中止信号被挑选处理之后,再次发生中止请求时,它的优先级主动轮转到该组最低,这样能够确保优先级低的中止信号能够被及时处理,不至于呈现优先级高且中止请求频频的中止每次都被优先处理,而优先级低的被“饿死”的状况。明显,这种方法更民主,实时性更佳。
2中止操控器相关寄存器
(1)SUBSRCPND子中止源暂存寄存器
表3-7子中止源暂存寄存器(SUBSRCPND)
寄存器名 | 地址 | 是否读写 | 描绘 | 复位默认值 |
SUBSRCPND | 0x4A000018 | R/W | 子中止源暂存寄存器,保存中止请求状况: 0:没有中止请求信号 1:中止请求信号发生 |
0x00000000 |
SUBSRCPND | 对应SRCPND | 位 | 描绘 | 初始值 |
Reserved | 无 | [31:15] | 未运用 | 0 |
INT_AC97 | INT_WDT_AC97 | [14] | 0 =未发生中止1 =发生中止 | 0 |
… | … | … | … | … |
INT_RXD0 | INT_UART0 | [0] | 0 =未发生中止1 =发生中止 | 0 |
该寄存器用来标识保存子中止源信号,当某个子中止信号发生之后,SUBSRCPND对应位被主动置1,该位会一向坚持被置位,只到中止处理程序将其铲除学校,需求留意一下,铲除中止是经过向对应位写入1来铲除,而不是写入0,写入0无效。
(2)INTSUBMSK子中止源屏蔽寄存器
表3-8子中止源屏蔽寄存器(INTSUBMSK)
寄存器名 | 地址 | 是否读写 | 描绘 | 复位默认值 |
INTSUBMSK | 0x4A00001C | R/W | 子中止源信号屏蔽存寄存器,设置相应位来屏蔽中止信号: 0:未屏蔽,中止可用 1:屏蔽中止信号 |
0xFFFF |
INTSUBMSK | 位 | 描绘 | 初始值 |
Reserved | [31:15] | 未运用 | 0 |
INT_AC97 | [14] | 0 =未屏蔽1 =屏蔽中止 | 1 |
… | … | … | … |
INT_RXD0 | [0] | 0 =未屏蔽1 =屏蔽中止 | 1 |
该寄存器用来屏蔽子中止源信号,默认值为悉数子中止都被屏蔽掉,因而要想处理某个硬件中止,必需求翻开中止屏蔽位,经过写入0来撤销屏蔽中止。
(3)SRCPND中止源暂存寄存器
表3-9中止源暂存寄存器(SRCPND)
寄存器名 | 地址 | 是否读写 | 描绘 | 复位默认值 |
SRCPND | 0x4A000000 | R/W | 中止源暂存寄存器,保存中止请求状况: 0:没有中止请求信号 1:中止请求信号发生 |
0x00000000 |
SRCPND | 位 | 描绘 | 初始值 |
INT_ADC | [31] | 0 =未发生中止1 =发生中止 | 0 |
… | … | … | … |
EINT0 | [0] | 0 =未发生中止1 =发生中止 | 0 |
该寄存器用来保存中止源信号,当某个中止信号发生之后,SRCPND对应位被主动置1,该位会一向坚持被置位,只到中止处理程序将其铲除学校,需求留意一下,铲除中止是经过向对应位写入1来铲除,而不是写入0,写入0无效。
(4)INTMSK中止源屏蔽寄存器
表3-10中止源屏蔽寄存器(INTMSK)
寄存器名 | 地址 | 是否读写 | 描绘 | 复位默认值 |
INTMSK | 0x4A000008 | R/W | 中止源信号屏蔽存寄存器,设置相应位来屏蔽中止信号: 0:未屏蔽,中止可用 1:屏蔽中止信号 |
0xFFFFFFFF |
INTMSK | 位 | 描绘 | 初始值 |
INT_ADC | [31] | 0 =未屏蔽1 =屏蔽中止 | 1 |
… | … | … | … |
EINT0 | [0] | 0 =未屏蔽1 =屏蔽中止 | 1 |
该寄存器用来屏蔽中止源信号,默认值为悉数中止都被屏蔽掉,因而要想处理某个硬件中止,必需求翻开中止屏蔽位,经过写入0来撤销屏蔽中止。
(5)INTPND最高优先级中止暂存寄存器
表3-11最高优先级中止暂存寄存器(INTPND)
寄存器名 | 地址 | 是否读写 | 描绘 | 复位默认值 |
INTPND | 0x4A000010 | R/W | 最高优先级中止暂存寄存器晒干保存有经过优先级裁定的成果: 0:没有中止请求信号 1:中止请求信号发生 |
0x00000000 |
INTPND | 位 | 描绘 | 初始值 |
INT_ADC | [31] | 0 =未发生中止1 =发生中止 | 0 |
… | … | … | … |
EINT0 | [0] | 0 =未发生中止1 =发生中止 | 0 |
该寄存器保存了经过优先级裁定出的中止信号位,它是一切当时中止请求里优先等级最高的中止,因而该寄存器里的值最多有一位被置1,一般中止处理程序中会经过读取该寄存器的值来获得当时正在处理的中止请求。中止处理完结之后,经过写入1来铲除中止。
(6)INTOFFSET中止号偏移量寄存器
表3-12中止号偏移量寄存器(INTOFFSET)
寄存器名 | 地址 | 是否读写 | 描绘 | 复位默认值 |
INTOFFSET | 0x4A000014 | R | 中止号偏移量寄存器,用来保存当时处理的中止号 | 0x0000000 |
该寄存器里寄存的是经过优先级裁定出的中止信号对应的中止号,是一个0~31之间的整数,其实它便是INTPND里对应的位号,比方:INT_UART0发生了中止,INTPND里第28方位1,INTOFFSET里保存的整数便是28,多出来这个寄存器的意图主要是便利中止处理程序查询中止源,铲除中止源:
#define TIMER0_IRQ_OFT10//时钟0守时中止
#define EINT0_IRQ_OFT0//开发板K1按键1对应外部中止EINT0
voidhandle_irq()
{
unsigned long irqOffSet = INTOFFSET;//获得中止号
switch(irqOffSet)
{
case TIMER0_IRQ_OFT://当时中止为守时器0中止
do_timer();//跳入守时器0处理程序
break;
case EINT0_IRQ_OFT://当时中止为K1按键触发
do_key1_pressed();//处理K1按下事情
break;
}
SRCPND &= (1<
}
(7)INTMOD中止形式寄存器
表3-13中止形式寄存器(INTMOD)
寄存器名 | 地址 | 是否读写 | 描绘 | 复位默认值 |
INTMOD | 0x4A000004 | R/W | 中止形式寄存器,指定对应中止形式: 0 = IRQ一般中止形式 1 = FIQ快速中止形式 |
0x0000000 |
INTMOD | 位 | 描绘 | 初始值 |
INT_ADC | [31] | 0 = IRQ 1 = FIQ | 0 |
… | … | … | … |
EINT0 | [0] | 0 = IRQ 1 = FIQ | 0 |
经过设置ARM内核发生中止。需求留意的是,快速中止不存在优先级裁定,只能有一位被设置为FIQ形式。