S3C2440中断体系结构

发布者:HeavenlyWhisper最新更新时间:2016-08-25 来源: eefocus关键字:S3C2440  中断体系结构 手机看文章 扫描二维码
随时随地手机看文章
一、S3C2440中断体系结构

1)ARM体系CPU的7种工作模式

用户模式(usr):ARM处理器正常的程序执行状态

快速中断模式(fiq):用于高速数据传输或通道处理

中断模式(irq):用于通用的中断处理

管理模式(svc):操作系统使用的保护模式

数据访问终止模式(abt):当数据或指令预取终止时进入该模式,可用于虚拟存储及存储保护

系统模式(sys):运行具有特权的操作系统任务

未定义指令中止模式(und):当未定义的指令执行时进入该模式,可用于支持硬件协处理器的软件仿真

除用户模式外,其他6种工作模式都属于特权模式,大多数程序运行于用户模式,进入特权模式是为了处理中断、异常,或者访问被保护的系统资源。

 

ARM体系的CPU有以下两个工作状态

ARM状态:此时处理器执行32位的字对齐的ARM指令

Thumb状态:此时处理器执行16位的、半字对齐的Thumb指令

 

ARM920T有31个通用的32位寄存器和6个程序状态寄存器。这37个寄存器分为7组,如下图所示:

S3C2440中断体系结构 - fly-top - fly-top的博客

图中R0-R15可以直接访问,这些寄存器除了R15外都是通用寄存器,既可以保存地址也可以保存数据。

R13称为栈指针寄存器,通常用于保存栈指针

R14称为程序连接寄存器(LR),当执行BL子程序调用指令时,R14得到R15(程序计数器PC)的备份。

而当发生中断或异常时,对应的R14_svc,R14_irq,R14_abt或R14_und中保存R15的返回值

R15是程序计数器

        快 速中断模式有7个备份寄存器R8_fiq-R14_fiq,这使得进入快速中断模式执行很大部分程序时(不改变R0-R7),不需要保存任何寄存器。用户 模式、管理模式、数据访问终止模式和未定义指令中止模式都含有两个独占的寄存器副本R13、R14,这样令每个模式拥有自己的栈指针寄存器和连接寄存器。

        每种工作模式还有寄存器CPSR(当前程序状态寄存器),它被用于标识各种状态和当前处于哪种工作模式,如下图所示:

S3C2440中断体系结构 - fly-top - fly-top的博客
S3C2440中断体系结构 - fly-top - fly-top的博客

 当一个异常发生时,将切换进入相应的工作模式,这是ARM920T CPU将自动完成如下工作:

①在异常工作模式的连接寄存器R14中保存前一个工作模式的下一条即将执行的指令地址。对于ARM状态,这个值是当前PC值加4或加8

②将CPSR的值复制到异常模式的SPSR

③将CPSR的工作模式位设为这个异常对应的工作模式

④令PC值等于这个异常模式在异常向量表中的地址,即跳转去执行异常向量表中的相应指令

 

从异常工作模式回到之前的工作模式时,需要通过软件完成如下事情:

①前面进入异常工作模式时,连接寄存器中保存了前一工作模式的一个指令地址,将它减去适当的值后赋值给PC寄存器

②将SPSR的复制回CPSR

异常模式 退出异常模式时PC的计算方法 进入异常模式时R14中保存的值
管理模式(SWI指令进入) MOVS PC, R14 PC+4(1)
未定义指令终止模式 MOVS PC, R14 PC+4(1)
快速中断模式 SUBS PC, R14, #4 PC+4(2)
中断模式 SUBS PC, R14, #4 PC+4(2)
数据访问终止模式

异常原因:指令预取终止

SUBS PC, R14, #4

PC+4(1)

异常原因:数据访问终止

SUBS PC, R14, #8

PC+8(3)

 注:

(1)PC为这些指令的地址:SWI、未定义的指令、在预取指时就失败的指令

(2)PC为这些指令的地址:进入快速中断模式、中断模式前,被打断而未执行的指令

(3)PC为这些指令的地址:导致数据访问终止的加载/存储指令(LDR、STR、LDM和STM)

 

二、S3C2440中断控制器

        当某事件发生时,硬件会设置某个寄存器,CPU在执行完一个指令时,通过硬件查看这个寄存器,如果发现所关注的事件发生了,则中断当前程序流程,跳转到一个固定的地址处理这个事件,最后返回继续执行被中断的程序。

中断处理的过程:

        ①中断控制器汇集各类外设发出的中断信号,告诉CPU      

        ②CPU保存当前程序的运行环境,调用中断服务程序(ISR)来处理这些中断

        ③在ISR中通过读取中断控制器、外设的相关寄存器来识别时哪个中断,并进行相应处理

        ④清除中断:通过读写中断控制器和外设的相关寄存器来实现

        ⑤最后恢复被中断程序的运行环境(恢复寄存器),继续执行

S3C2440中断体系结构 - fly-top - fly-top的博客

s3c2440的中断控制器结构如上图所示:

①request sources(without sub-register)中的中断源被触发后,SRCPND寄存器中相应位被置1,如果此中断没有被INTMSK寄存器屏蔽或者快速中断的话,它将被进一步处理。

② 对于request sources(with sub-register)中的中断源被触发后,SUBSRCPEND寄存器中的相应位被置1,如果此中断没有被INTSUBMSK寄存器屏蔽的话,它在 SRCPND寄存器中的相应位也被置1,以后的处理过程就和①步骤类似。

③如果被触发的中断中有快速中断,INTMOD寄存器中为1的位对应的中断是FIQ,则CPU进入快速中断模式进行处理

④ 对于一般的中断IRQ,可能同时有几个中断被触发,未被INTMSK寄存器屏蔽的中断经过比较后,选出优先级最高的中断,此中断在INTPND寄存器中的 相应位被置1,然后CPU进入中断模式进行处理。中断服务程序通过读取INTPND或者INTOFFSET来确定中断源

 

三、中断控制寄存器

1)SUBSRCPND寄存器

        它用来表示INT_RXD0、INT_TXD0等中断是否发生,每位对应一个中断,当这些中断发生并且没有被INTSUBMSK寄存器屏蔽,则它们中的若干位将汇集出现在SRCPND寄存器的某一位上。要清除中断,往此寄存器中某位写1

2)INTSUBMSK寄存器

        它用来屏蔽SUBSRCPND寄存器所标识的中断,INTSUBMSK寄存器中某位设置1时,对应的中断被屏蔽

3)SRCPND寄存器

        它每一位被用来表示一个或一类中断是否发生,要清除某一位,往此位写1,具体参考数据手册

4)INTMSK寄存器

        用来屏蔽SRCPND寄存器所标识的中断。INTMSK寄存器中某位被设为1时,对应的中断被屏蔽,它只能屏蔽IRQ中断,不能屏蔽FIQ

5)INTMOD寄存器

        它某位被设为1时,对应的中断被设为FIQ,同一时间,INTMOD只能有一位被设为1

6)PRIORITY寄存器

        当有多个IRQ同时发生时,中断控制器选出最高优先级的中断,首先处理它。中断优先级通过7个仲裁器来完成,结构图如下所示:

S3C2440中断体系结构 - fly-top - fly-top的博客

每个仲裁器基于一个位仲裁器模式控制(ARB_MODE)和选择控制信号(ARB_SEL)的两位来处理 6个中断请求。

 

如果ARB_SEL位是 00b,优先级是REQ0,REQ1,REQ2,REQ3,REQ4,和REQ5.

如果ARB_SEL位是 01b,优先级是REQ0,REQ2,REQ3,REQ4,REQ1,和REQ5.

如果ARB_SEL位是 10b,优先级是REQ0,REQ3,REQ4,REQ1,REQ2,和REQ5.

如果ARB_SEL位是 11b,优先级是REQ0,REQ4,REQ1,REQ2,REQ3,和REQ5.

        注 意仲裁器的 REQ0 总是有最高优先级,REQ5 总是有最低优先级。此外通过改变ARB_SEL 位,我们可以翻转 REQ1 到 REQ4 的优先级。如果ARB_MODE位置0,ARB_SEL位不会自动改变,使得仲裁器在一个固定优先级的模式下操作(注意在此模式下,我们通过手工改变 ARB_SEL 位来配置优先级)。另外,如果 ARB_MODE 位是 1,ARB_SEL 位以翻转的方式改变。例如如果 REQ1 被服务,则ARB_SEL位自动的变为01b,把REQ1放到最低的优先级。ARB_SEL变化的详细规则如下:

如果REQ0 或REQ5 被服务,ARB_SEL位完全不会变化。

如果REQ1 被服务,ARB_SEL位变为 01b。

如果REQ2 被服务,ARB_SEL位变为 10b。

如果REQ3 被服务,ARB_SEL位变为 11b。

如果REQ4 被服务,ARB_SEL位变为 00b。

7)INTPND寄存器

        经过中断优先级选出优先级最高的中断后,这个中断在INTPND寄存器中的相应位被置1,随后CPU进入中断模式处理它

        同一时间,此寄存器只有一位被置1,在ISR中,可以根据这个位确定是哪个中断,清除中断时,往此位写入1

8)INTOFFSET寄存器

        用来表示INTPND寄存器中哪位被置1了,即INTPND寄存器中位[x]为1时,INTOFFSET寄存器的值为x(x为0-31)

        清除SRCPND、INTPND寄存器时,INTOFFSET寄存器被自动清除

 

四、中断控制器操作实例:外部中断

开发板上,K1-K4四个按键所接的CPU引脚可以设为外部中断,本程序的功能是,当按下某个按键时,CPU调用中断服务程序点亮对应的LED

S3C2440中断体系结构 - fly-top - fly-top的博客

@******************************************************************************

@ File:head.S

@ 功能:初始化,设置中断模式、系统模式的栈,设置好中断处理函数

@******************************************************************************       

   

.extern     main

.text 

.global _start 

_start:

@******************************************************************************       

@ 中断向量,本程序中,除Reset和HandleIRQ外,其它异常都没有使用

@******************************************************************************       

    b   Reset

 

@ 0x04: 未定义指令中止模式的向量地址

HandleUndef:

    b   HandleUndef 

 

@ 0x08: 管理模式的向量地址,通过SWI指令进入此模式

HandleSWI:

    b   HandleSWI

 

@ 0x0c: 指令预取终止导致的异常的向量地址

HandlePrefetchAbort:

    b   HandlePrefetchAbort

 

@ 0x10: 数据访问终止导致的异常的向量地址

HandleDataAbort:

    b   HandleDataAbort

 

@ 0x14: 保留

HandleNotUsed:

    b   HandleNotUsed

 

@ 0x18: 中断模式的向量地址

    b   HandleIRQ

 

@ 0x1c: 快中断模式的向量地址

HandleFIQ:

    b   HandleFIQ

 

Reset:                  

    ldr sp, =4096           @ 设置栈指针,以下都是C函数,调用前需要设好栈

    bl  disable_watch_dog   @ 关闭WATCHDOG,否则CPU会不断重启

    

    msr cpsr_c, #0xd2       @ 进入中断模式,cpsr_c表示cpsr[7:0],0xd2=0b1101 0010

    ldr sp, =3072           @ 设置中断模式栈指针

 

    msr cpsr_c, #0xdf       @ 进入系统模式

    ldr sp, =4096           @ 设置系统模式栈指针,

                            @ 其实复位之后,CPU就处于系统模式,

                            @ 前面的“ldr sp, =4096”完成同样的功能,此句可省略

 

    bl  init_led            @ 初始化LED的GPIO管脚

    bl  init_irq            @ 调用中断初始化函数,在init.c中

    msr cpsr_c, #0x5f       @ 设置I-bit=0,开IRQ中断

    

    ldr lr, =halt_loop      @ 设置返回地址

    ldr pc, =main           @ 调用main函数

halt_loop:

    b   halt_loop

 

HandleIRQ:

    sub lr, lr, #4                  @ 计算返回地址

    stmdb   sp!,    { r0-r12,lr }   @ 保存使用到的寄存器

                                    @ 注意,此时的sp是中断模式的sp

                                    @ 初始值是上面设置的3072

    

    ldr lr, =int_return             @ 设置调用ISR即EINT_Handle函数后的返回地址  

    ldr pc, =EINT_Handle            @ 调用中断服务函数,在interrupt.c中

int_return:

    ldmia   sp!,    { r0-r12,pc }^  @ 中断返回, ^表示将spsr的值复制到cpsr

 

/*

 * init.c: 进行一些初始化

 */ 

 

#include "s3c24xx.h"

 

/*

 * LED1-4对应GPB5、GPB6、GPB7、GPB8

 */

#define GPB5_out        (1<<(5*2))      // LED1

#define GPB6_out        (1<<(6*2))      // LED2

#define GPB7_out        (1<<(7*2))      // LED3

#define GPB8_out        (1<<(8*2))      // LED4

 

/*

 * K1-K4对应GPG0,GPG3,GPG5,GPG6

 */

#define GPG0_eint      (2<<(0*2))     // K1,EINT8

#define GPG3_eint       (2<<(3*2))      // K2,EINT11

#define GPF5_eint       (2<<(5*2))      // K3,EINT13

#define GPF6_eint       (2<<(6*2))      // K4,EINT14

 

 

/*

 * 关闭WATCHDOG,否则CPU会不断重启

 */

void disable_watch_dog(void)

{

    WTCON = 0;  // 关闭WATCHDOG很简单,往这个寄存器写0即可

}

 

void init_led(void)

{

    GPBCON = GPB5_out | GPB6_out | GPB7_out | GPB8_out ;

}

 

/*

 * 初始化GPIO引脚为外部中断

 * GPIO引脚用作外部中断时,默认为低电平触发、IRQ方式(不用设置INTMOD)

 */ 

void init_irq( )

{

    GPGCON  = GPG0_eint | GPG3_eint | GPG5_eint | GPG6_eint;

    

    // 对于EINT8、11、13、14,需要在EINTMASK寄存器中使能它们

    EINTMASK &= (~(1<<8)) & (~(1<<11)) & (~(1<<13)) & (~(1<<14));

        

    /*

     * 设定优先级:

     * ARB_SEL0 = 00b, ARB_MODE0 = 0: REQ1 > REQ3,即EINT0 > EINT2

     * 仲裁器1、6无需设置

     * 最终:

     * EINT0 > EINT2 > EINT11,EINT19,即K4 > K3 > K1,K2

     * EINT11和EINT19的优先级相同

     */

    PRIORITY = (PRIORITY & ((~0x01) | (0x3<<7))) | (0x0 << 7) ;

 

 

    //开启EINT8_23

    INTMSK   &= ~(1<<5);

 

}

 

interrupt.c

 

 

#include "s3c24xx.h"

 

void EINT_Handle()

{

    unsigned long oft = INTOFFSET;

    

    switch( oft )

    {

//INTOFFSET为5时,代表INTPND的位[5]为1,则EINT8-23中断发生

        case 5:

        {   

GPBDAT |= (0x0f<<5); //LED全灭

            if (EINTPEND & (1<<8)) //EINT8发生(EINT8对应K1)

                GPBDAT &= ~(1<<5);      

            if (EINTPEND & (1<<11)) //EINT11发生(EINT8对应K2)

                GPBDAT &= ~(1<<6);      

            if (EINTPEND & (1<<13)) //EINT13发生(EINT8对应K3)

                GPBDAT &= ~(1<<7);      

            if (EINTPEND & (1<<14)) //EINT14发生(EINT8对应K4)

                GPBDAT &= ~(1<<8);      

            break;

        }

 

        default:

            break;

    }

 

//清除中断

    if(oft == 5)

EINTPEND = (1<<8) | (1<<11) | (1<<13) | (1<<14);

    SRCPND = 1<

    INTPND = 1<

}

 

 

main.c

int main()

{

    while(1);

    return 0;

}

 
Makefile
 
objs := head.o init.o interrupt.o main.o
 
int.bin: $(objs)
arm-linux-ld -Ttext 0x00000000 -o int_elf $^
arm-linux-objcopy -O binary -S int_elf $@
arm-linux-objdump -D -m arm int_elf > int.dis
 
%.o:%.c
arm-linux-gcc -Wall -O2 -c -o $@ $<
 
%.o:%.S
arm-linux-gcc -Wall -O2 -c -o $@ $<
 
clean:
rm -f int.bin int_elf int.dis *.o

关键字:S3C2440  中断体系结构 引用地址:S3C2440中断体系结构

上一篇:S3C内部中断和外部中断
下一篇:STM32 FSMC 配置说明

推荐阅读最新更新时间:2024-03-16 15:07

08-S3C2440驱动学习(二)嵌入式linux-input子系统分析与应用
零、几个问题 (1)为什么有输入子系统: 针对输入设备的多样性和输入事件的多样性,内核通过输入子系统来实现输入设备的驱动、输入事件的提交及对输入事件的读取,并有统一的命名规则。 (2)分层分离结构 input子系统是对不同类型的输入设备进行统一处理的驱动程序。一个输入事件,如按键,按照: 驱动层-- 系统核心层-- 事件处理层-- 用户空间层 的顺序达到用户空间并传递给应用程序的。 input子系统组成 驱动层 核心层 事件处理层 (3)几个重要结构体 input_dev:物理输入设备结构体,包含设备信息。存在input_dev_list链表中 input_handler:事件处理结构体,实现事
[单片机]
08-S3C2440驱动学习(二)嵌入式linux-input子系统分析与应用
基于S3C2440的车载GPS/GPRS跟踪监控系统研究与实现
0 引言 随着交通系统的不断发展和完善,定位导航系统的应用范围和领域也越来越广泛,基于GPS,GPRS/GSM,GIS等的车辆跟踪与监控系统正在受到人们越来越多的青睐,显示出强大的发展潜力。GPS(Global Position System,全球定位系统)是美国从20世纪70年代开始的研制。19 93年正式投入运行,它能够全球、全天候、连续实时地为用户提供高精度的三维坐标、三维速度和时间信息。GPS的出现从根本上改变了人们获取空间信息的方式,特别是在交通工具导航、监控、跟踪等领域具有很大的应用价值和发展潜力。 本文在ARM9的硬件平台基础上,利用嵌入式Linux操作系统强大的管理平台的内核与外设的功能,开发了具有导航跟踪与
[单片机]
基于<font color='red'>S3C2440</font>的车载GPS/GPRS跟踪监控系统研究与实现
ARM9(S3C2440) LCD
LCD是liquid crystal display 的简称,液晶显示器按驱动方式分为静态驱动,简单矩阵驱动以及主动矩阵驱动。 简单矩阵驱动分为扭转向列型(TN)和超扭转向列型(STN)两种。 主动矩阵驱动则以TFT为主。 (1)、 TN型驱动液晶,是LCD中最基本的,其他LCD都以TN型改进。他只能将入射光旋转90度,视角只有30度,色彩单一,对比度低,用于电子表和电子计算机。 (2)、 STN型驱动液晶。可将入射光旋转180度至270度,也改善了视角,通过塔配色滤光片,将单色矩阵的任意像素分成3个子像素,红绿蓝。 (3)、1,2都采用场电压驱动方式,如果现实尺寸加大,中心部分对电极变化的反应时间就会变长,显
[单片机]
ARM9(<font color='red'>S3C2440</font>) LCD
s3c2440之cache
cache高速缓冲存储器注意与块设备页高速缓存进行区别,一个是硬件的实现一个是软件的实现,块设备页高速缓存。 s3c2440/s3c2410里面主要有一个arm920t的核,但同时包含几个协处理器,协处理器相当于一个处理器,帮助主CPU完成如浮点数运算,这儿讨论的cache及MMU、TLB就会用到协处理器CP15。CPU与协处理器之间传递数据通过两个指令MCR、MRC。
[单片机]
<font color='red'>s3c2440</font>之cache
基于S3C2440和USB摄像头的网络视频采集系统
  本文根据网络视频采集的需要,将网络传输与视频采集相结合,设计了以S3C2440为核心的USB摄像头视频采集和嵌入式Linux系统下的视频服务器,从而实现了远程网络视频信息采集。   1 系统总体设计   该系统是以ARM9处理器S3C2440为核心,在嵌入式Linux系统平台下,通过USB摄像头采集视频信息,然后对所得到的视频数据通过内部总线送到视频服务器MJPG-streamer上,视频服务器经过对图像压缩处理,经过以太网传输出去,远端客户机通过浏览器或者专用软件访问视频服务器,即可浏览现场信息,从而实现网络视频采集。系统总体如图1所示。      2 系统硬件设计   系统的硬件框图如图2所示。      系统处理
[单片机]
基于<font color='red'>S3C2440</font>和USB摄像头的网络视频采集系统
LCD实验学习笔记(八):中断
s3c2440有60个中断源(其中15个为子中断源)。 31个32位的通用寄存器,6个程序状态寄存器。有6种工作模式(系统/用户模式,快中断模式,管理模式,数据访问中止模式,中断模式,未定指令中止模式)。每种模式都有16个通用寄存器和1(或2)个程序状态寄存器。 R15(pc)是程序计数器,R14(lr)是连接寄存器,在异常时自动保存pc备份,r13(sp)是栈指针寄存器。 CPSR是当状程序状态寄存器。其 为控制位, 为中断禁止位, 为快中断禁止位, 为CPU状态位, 为工作模式位。, 程序状态寄存器(PSR)的F位 设为1,禁用快速中断(FRQ)。 程序状态寄存器(PSR)的I位 设为1,禁用普通中断(IRQ)。 SPSR程序
[单片机]
S3C2440】第14课、异常与中断之学习笔记
1、异常向量表 /******下面这些就是异常向量表*****/ .globl _start _start: b reset ldr pc, _undefined_instruction ldr pc, _software_interrupt ldr pc, _prefetch_abort ldr pc, _data_abort ldr pc, _not_used ldr pc, _irq ldr pc, _fiq _undefined_instruction: .word undefined_instruction _software_inte
[单片机]
【<font color='red'>S3C2440</font>】第14课、异常与<font color='red'>中断</font>之学习笔记
S3C2440 中断程序
CPU 运行过程中,如何知道各类外设发生了某些不预期的事件,比如串口接收到了新数据、USB 接口中插入了设备、按下某个按键等。主要有以下两个方法: 查询方式:程序循环地查询各设备的状态并作出相应反应。它实现简单,常用在功能相对单一的系统中,比如在一个温控系统中可以使用查询方式不断检测温度的变化。确定是占用 CPU 资源过高,不适用于多任务系统。 中断方式:当某事件发生时,硬件会设置某个寄存器; CPU 在每执行完一个指令时,通过硬件查看这个寄存器,如果发现所关注的事件发生了,则中断当前程序流程,跳转到一个固定的地址处理这事件,最后返回执行被中断的程序。它的实现相对复杂,但是效率很高,是常用的办法。 CPU 中断处理的过
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
更多每日新闻
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved