第9章 中断

来源:互联网 发布:长三角师资招聘会 网络 编辑:程序博客网 时间:2024/05/01 09:25

第9章中断

cpsr
第9章 <wbr>中断

第9章 <wbr>中断
9.1.1 s3c2440中断控制器
中断方式:当某件事情发生时,硬件会设置某个寄存器;cpu在每执行完一个指令时,通过硬件查看这个寄存器,如果发生所关注的事件发生了,则中断当前程序流程,跳转到一个固定的地址处理这件事情。
第9章 <wbr>中断
ISR中断服务程序
Request sources(withsub-register)表示INT_RXD0/INT_TXD0等中断源(s3c2440共15个),他们不同于requestsources(with-out sub-register)
中断控制器的寄存器
SUBSRCPND和SRCPND寄存器表明有哪些中断被触发,正在等待处理;SUBMASK(intsubmsk)和mask(intmsk)用于屏蔽某些中断
中断示意图
第9章 <wbr>中断
1.request sources(withoutsub-registered)中的中断源被触发之后,srcpnd寄存器相应位置1,if INTMSK==0(没有屏蔽)and FIQ(1),将进一步处理
2.request source(with sub-register)中的中断源被触发后,SUBSRCPND寄存器相应位被置1,if INTSUBMSK ==0没有屏蔽,then srcpnd相应位也被置1,接着同上(1)处处理.
(1)如果是,;FIQ——mode(intmod寄存器)中为1的为对应中断是FIQ,则cpu进入快速中断模式。
    (2)对于irq,可能同时有几个中断被触发。未被INTMSK寄存器屏蔽的中断经过比较后选出优先级最高的中断(通过仲裁器和priority),此中断在INTPND寄存器中的相应位被置1,然后cpu进入中断模式处理。中断服务程序可以通过读取INTPND寄存器或者intoffset寄存器来确定中断源
上图中priority表示中断的优先级判断,通过ptiotity寄存器进行设置
由此可知中断流程如下:
1.设置好中断模式和快速中断模式下的栈,when  FIQ,cpu进入中断模式,使用快速中断模式下的栈。
2.准备好中断处理函数
(1.)在异常中断向量表中设置好当进入中断模式或快速中断模式时的跳转函数,异常向量分别为0x00000018(中断模式的中断向量)、0x0000001c(FIQ的中断向量)。
(2)终端服务程序ISR
IRQ/FIQ的跳转函数,最终将调用具体中断的服务函数
对于IRQ,读取INTPND寄存器或INTOFFSET寄存器的值来确定中断源,然后分别处理
对于FIQ,因为只有一个中断可以设为FIQ,无须判断中断源
 (3)清除中断:如果不清除中断,则cpu会误以为这个中断又发生一次。
        若ISR执行过程中,这个中断可能发生并不能丢弃、则在调用isr之前清除中断、这样在ISR执行过程中发生的中断能够被个寄存器再次记录并终止cpu;如果在ISR执行过程中,这个中断不会发生或者丢弃则在调用ISR之后清除中断。
    清除中断过程:首先,操作具体外设中断信号:其次,清除SUBSRPND,srcpnd寄存器中的相应位(写1);最后,清除INTPND寄存器相应位(写1),
3.进入、退出中断模式或快速中断模式时,需要保存、恢复被中断程序的运行环境。
对于IRQ,进入退出的代码如下:
sub lr,lr,#4    @计算返回地址
stmdb sp!,{r0-r12,lr}  @保存使用到的寄存器
.....
ldmia sp!,{r0-r12,pc}^ @中断返回 ;^表示将spsr的值赋给cpsr

对于FIQ,进入退出的代码如下:
sub lr,lr,#4   @计算返回地址
stmdb sp!,{r0-r7,lr}  @保存使用到的寄存器
......
ldmia sp!,{r0-r7,pc}^ @快速中断返回^表示将spsr的值赋给cpsr
4.根据具体中断,设置相关外设,如gpio中断,需要将相应引脚的功能设为“外部中断”设置中断触发条件(高、低电平触发,上、下降沿触发)
5.对于request sources(withoutsub-registered)的中断,将INTSUBMSK寄存器设为0.
6.确定此中断的方式:IF FIQ THEN INTMOD=1;IF IRQ THEN RIORITY中设置优先级
7.if IRQ THEN INTMSK=0(FIQ 不受intmsk寄存器影响)
8.设置cpsr寄存器中的i-bit位(irq)或f-bit(fiq)使能irq或fiq

9.1.3 中断寄存器
第9章 <wbr>中断
1.SUBSRCPND寄存器
SUBSRCPND寄存器用来标识INT_RXD0、INT_TXD0等中断(共15个每bit对应一个),
while(int) if INTSUBMSK没有被屏蔽 srcpnd对应位=1(subsrcpnd若干位汇集 )
if    SUBSRCPND对应位==1,clear int;
2.INTSUBMSK 
IF INTSUBMSK对应位==1  屏蔽对应中断;
3.SRCPND
SRCPND 中每一位被用来表示一个或一类中断是否发生  IF SRCPND相应位==1 clear 中断;
4.INTMSK 
INTMSK 被用来屏蔽SRCPND寄存器所表示的中断,if intmsk相应位==1 对应屏蔽被中断(仅能屏蔽irq 不能屏蔽fiq)
5.INTMOD
if intmod相应位==1  对应的中断设为FIQ
6.PRIORITY寄存器
用于选出最优先级中断,中断优先级的判选通过7个仲裁器来完成:6个一个仲裁器,1个二级仲裁器,结构如下图
第9章 <wbr>中断
第9章 <wbr>中断
第9章 <wbr>中断
即PRIORITY每3位控制一个仲裁器。00xxxxxxxx00000000000
7.INTPND
经过中断优先级仲裁器选出有限级最高的中断后,这个中断在INTPND寄存器的相应位被置1随后cpu将进入中断模式处理它,同一时间只有一个bit被置1:在ISR中根据这个位确定哪个是中断,往该位写1清除中断。
8.INTOFFSET寄存器
用来确定INTPND中哪一位被置1,即INTPND寄存器中位【x】为1时,intoffset寄存器的值为x,在清除SRCPND、INTPND寄存器时,INTOFFSET寄存器被自动清除。
EINTPND、SUBSRCPND、SRCPND、INTPND需要写1清除!!!

head.S
@**************
@head.s
@set inital interrupt
@***************


.extern main
.text
.global _start
_start:
@******************************************************************************      
@ 异常向量,本程序中,除Reset和HandleIRQ外,其它异常都没有使用
@******************************************************************************      
     Reset

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

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

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

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

@ 0x14: 保留
HandleNotUsed:
     HandleNotUsed

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

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

reset:
    ldrsp,=4096    @when reset ,the cpu is on cpu mode
    bl disable_watchdog @close watchdog
    
    msrcpsr_c,#0xd2    @11010010  irq mode
    ldrsp,=3072         @set stack point sp_und

    msrcpsr_c,#0xd3      @11010011   superivor mode
    ldrsp,=4096    @set stack point sp_svc

    blinit_led    @init led gpio
    blinit_irq    @init intterupt in the init.c
    msrcpsr_c,#0x53    @open irq

    ldrlr,=halt_loop    @set return addr
    ldrpc,=main         @go to main

halt_loop:
       halt_loop

HandleIRQ:
    sublr,lr,#4    @return addr
    stmdbsp!,{r0-r12,lr}    @save reg

    ldrlr,=int_return    @set return addr after isr
    ldrpc,=EINT_Handle    @go to isr in the initerrupt.c

int_return:
    ldmiasp!,{r0-r12,pc}^    @now pc=lr that means ,return to main means cpsr=spsr;return



init.c:



#include "s3c24xx.h"



#defineGPF_EINT1   (0x2<<(2*1))    //K1 10=EINT1
#defineGPF_EINT2   (0x2<<(2*4))  //K2 10=EINT4
#defineGPF_EINT3   (0x2<<(2*2))    //K3 10=EINT2
#defineGPF_EINT4   (0x2<<(2*0))    //K4 10=EINT0


#define GPB_OUT5      (1<<(2*5))  //led1
#defineGPB_OUT6       (1<<(2*6))    //led2 01=out
#defineGPB_OUT7       (1<<(2*7))
#defineGPB_OUT8       (1<<(2*8))    //led4 01=out




void disable_watchdog(void)
   
    WTCON=0;
}



void init_led(void)
{
    GPBCON|=GPB_OUT5|GPB_OUT6|GPB_OUT7|GPB_OUT8; //5,6,7,8SET ASOUT
}



void init_irq()
{
    GPFCON|=GPF_EINT1|GPF_EINT2|GPF_EINT3|GPF_EINT4 ;//SET ASEINT
    EINTMASK =0x000ffffd;//EINT4 MUST ==0 TO ENABLE
    
    
    PRIORITY =0x07f83c;
    
    INTMSK&=(~(1<<0))&(~(1<<1))&(~(1<<2))&(~(1<<4)); 
}




interrupt.c


#include "s3c24xx.h"

void EINT_Handle()
{
    unsigned long ofset=INTOFFSET ;
     

    switch(ofset)
    {
         case 0 :
              {
              GPBDAT|=(0xf<<5);//led OFF
              GPBDAT&=(~(1<<5));//ONLY GPBdat5=0;LED1 0N
              break;
              }
         case 1:
              {
              GPBDAT|=(0xf<<5);
              GPBDAT&=(~(1<<6));  //write gpbdat6=0.
              break;
              }
         case 2:{
              GPBDAT|=(0xf<<5);
              GPBDAT&=(~(1<<7));
              break;
              }
         case 4:{
              GPBDAT|=(0xf<<5);
              GPBDAT&=(~(1<<8));
              break;
              }
         default:break;
    }
    
    EINTPEND=1<<ofset;  //write 1 toclear
    SUBSRCPND=1<<ofset;
    SRCPND=1<<ofset;
    INTPND=1<<ofset;  //ofset=which bit 
}


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 $@ $<<br>
%.o:%.S
    arm-linux-gcc -Wall -o2 -c -o $@ $<<br>clean:
    rm -f int.bin int_elf int.dis *.o


int.dir:整个程序的汇编结果
int_elf:    file format elf32-littlearm

Disassembly of section .text:

00000000 <_start>:
  0:    ea000000       8
  4:    ea00000b       38

00000008 :
  8:    e3a0da01    mov    sp,#4096    ; 0x1000
  c:    eb000012    bl    5c
 10:    e321f0d2    msr    CPSR_c,#210    ; 0xd2
 14:    e3a0db03    mov    sp,#3072    ; 0xc00
 18:    e321f0d3    msr    CPSR_c,#211    ; 0xd3
 1c:    e3a0da01    mov    sp,#4096    ; 0x1000
 20:    eb000014    bl    78
 24:    eb00001d    bl    a0
 28:    e321f053    msr    CPSR_c,#83    ; 0x53
 2c:    e59fe018    ldr    lr, [pc,#24]    ; 4c <.text+0x4c>
 30:    e59ff018    ldr    pc, [pc,#24]    ; 50 <.text+0x50>

00000034 :
 34:    eafffffe       34

00000038 :
 38:    e24ee004    sub    lr, lr,#4    ; 0x4
 3c:    e92d5fff    stmdb    sp!, {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, ip, lr}
 40:    e59fe00c    ldr    lr, [pc,#12]    ; 54 <.text+0x54>
 44:    e59ff00c    ldr    pc, [pc,#12]    ; 58 <.text+0x58>

00000048 :
 48:    e8fd9fff    ldmia    sp!, {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, ip,pc}^
 4c:    00000034    andeq    r0, r0, r4, lsr r0
 50:    00000260    andeq    r0, r0, r0, ror #4
 54:    00000048    andeq    r0, r0, r8, asr #32
 58:    00000108    andeq    r0, r0, r8, lsl #2

0000005c :
 5c:    e1a0c00d    mov    ip, sp
 60:    e92dd800    stmdb    sp!, {fp, ip, lr, pc}
 64:    e24cb004    sub    fp, ip,#4    ; 0x4
 68:    e3a02453    mov    r2,#1392508928    ; 0x53000000
 6c:    e3a03000    mov    r3,#0    ; 0x0
 70:    e5823000    str    r3, [r2]
 74:    e89da800    ldmia    sp, {fp, sp, pc}

00000078 :
 78:    e1a0c00d    mov    ip, sp
 7c:    e92dd800    stmdb    sp!, {fp, ip, lr, pc}
 80:    e24cb004    sub    fp, ip,#4    ; 0x4
 84:    e59f2010    ldr    r2, [pc,#16]    ; 9c <.text+0x9c>
 88:    e59f300c    ldr    r3, [pc,#12]    ; 9c <.text+0x9c>
 8c:    e5933000    ldr    r3, [r3]
 90:    e3833b55    orr    r3, r3,#87040    ; 0x15400
 94:    e5823000    str    r3, [r2]
 98:    e89da800    ldmia    sp, {fp, sp, pc}
 9c:    56000010    undefined

000000a0 :
 a0:    e1a0c00d    mov    ip, sp
 a4:    e92dd800    stmdb    sp!, {fp, ip, lr, pc}
 a8:    e24cb004    sub    fp, ip,#4    ; 0x4
 ac:    e59f203c    ldr    r2, [pc,#60]    ; f0 <.text+0xf0>
 b0:    e59f3038    ldr    r3, [pc,#56]    ; f0 <.text+0xf0>
 b4:    e5933000    ldr    r3, [r3]
 b8:    e3833f8a    orr    r3, r3,#552    ; 0x228
 bc:    e3833002    orr    r3, r3,#2    ; 0x2
 c0:    e5823000    str    r3, [r2]
 c4:    e59f2028    ldr    r2, [pc,#40]    ; f4 <.text+0xf4>
 c8:    e59f3028    ldr    r3, [pc,#40]    ; f8 <.text+0xf8>
 cc:    e5823000    str    r3, [r2]
 d0:    e59f2024    ldr    r2, [pc,#36]    ; fc <.text+0xfc>
 d4:    e59f3024    ldr    r3, [pc,#36]    ; 100 <.text+0x100>
 d8:    e5823000    str    r3, [r2]
 dc:    e59f2020    ldr    r2, [pc,#32]    ; 104 <.text+0x104>
 e0:    e59f301c    ldr    r3, [pc,#28]    ; 104 <.text+0x104>
 e4:    e5933000    ldr    r3, [r3]
 e8:    e5823000    str    r3, [r2]
 ec:    e89da800    ldmia    sp, {fp, sp, pc}
 f0:    56000050    undefined
 f4:    560000a4    strpl    r0, [r0], -r4, lsr #1
 f8:    000ffffd    streqd    pc, [pc], -sp
 fc:    4a00000c    bmi    134 <.text+0x134>
100:    0007f83c    andeq    pc, r7, ip, lsr r8
104:    4a000008    bmi    12c

00000108 :
108:    e1a0c00d    mov    ip, sp
10c:    e92dd800    stmdb    sp!, {fp, ip, lr, pc}
110:    e24cb004    sub    fp, ip,#4    ; 0x4
114:    e24dd008    sub    sp, sp,#8    ; 0x8
118:    e59f312c    ldr    r3, [pc,#300]    ; 24c <.text+0x24c>
11c:    e5933000    ldr    r3, [r3]
120:    e50b3014    str    r3, [fp, #-20]
124:    e51b3014    ldr    r3, [fp, #-20]
128:    e3530004    cmp    r3,#4    ; 0x4
12c:    979ff103    ldrls    pc, [pc, r3, lsl #2]
130:    ea00002f       1f4 <.text+0x1f4>
134:    00000148    andeq    r0, r0, r8, asr #2
138:    00000174    andeq    r0, r0, r4, ror r1
13c:    000001a0    andeq    r0, r0, r0, lsr #3
140:    000001f4    streqd    r0, [r0], -r4
144:    000001cc    andeq    r0, r0, ip, asr #3
148:    e59f2100    ldr    r2, [pc,#256]    ; 250 <.text+0x250>
14c:    e59f30fc    ldr    r3, [pc,#252]    ; 250 <.text+0x250>
150:    e5933000    ldr    r3, [r3]
154:    e3833e1e    orr    r3, r3,#480    ; 0x1e0
158:    e5823000    str    r3, [r2]
15c:    e59f20ec    ldr    r2, [pc,#236]    ; 250 <.text+0x250>
160:    e59f30e8    ldr    r3, [pc,#232]    ; 250 <.text+0x250>
164:    e5933000    ldr    r3, [r3]
168:    e3c33020    bic    r3, r3,#32    ; 0x20
16c:    e5823000    str    r3, [r2]
170:    ea00001f       1f4 <.text+0x1f4>
174:    e59f20d4    ldr    r2, [pc,#212]    ; 250 <.text+0x250>
178:    e59f30d0    ldr    r3, [pc,#208]    ; 250 <.text+0x250>
17c:    e5933000    ldr    r3, [r3]
180:    e3833e1e    orr    r3, r3,#480    ; 0x1e0
184:    e5823000    str    r3, [r2]
188:    e59f20c0    ldr    r2, [pc,#192]    ; 250 <.text+0x250>
18c:    e59f30bc    ldr    r3, [pc,#188]    ; 250 <.text+0x250>
190:    e5933000    ldr    r3, [r3]
194:    e3c33040    bic    r3, r3,#64    ; 0x40
198:    e5823000    str    r3, [r2]
19c:    ea000014       1f4 <.text+0x1f4>
1a0:    e59f20a8    ldr    r2, [pc,#168]    ; 250 <.text+0x250>
1a4:    e59f30a4    ldr    r3, [pc,#164]    ; 250 <.text+0x250>
1a8:    e5933000    ldr    r3, [r3]
1ac:    e3833e1e    orr    r3, r3,#480    ; 0x1e0
1b0:    e5823000    str    r3, [r2]
1b4:    e59f2094    ldr    r2, [pc,#148]    ; 250 <.text+0x250>
1b8:    e59f3090    ldr    r3, [pc,#144]    ; 250 <.text+0x250>
1bc:    e5933000    ldr    r3, [r3]
1c0:    e3c33080    bic    r3, r3,#128    ; 0x80
1c4:    e5823000    str    r3, [r2]
1c8:    ea000009       1f4 <.text+0x1f4>
1cc:    e59f207c    ldr    r2, [pc,#124]    ; 250 <.text+0x250>
1d0:    e59f3078    ldr    r3, [pc,#120]    ; 250 <.text+0x250>
1d4:    e5933000    ldr    r3, [r3]
1d8:    e3833e1e    orr    r3, r3,#480    ; 0x1e0
1dc:    e5823000    str    r3, [r2]
1e0:    e59f2068    ldr    r2, [pc,#104]    ; 250 <.text+0x250>
1e4:    e59f3064    ldr    r3, [pc,#100]    ; 250 <.text+0x250>
1e8:    e5933000    ldr    r3, [r3]
1ec:    e3c33c01    bic    r3, r3,#256    ; 0x100
1f0:    e5823000    str    r3, [r2]
1f4:    e59f1058    ldr    r1, [pc,#88]    ; 254 <.text+0x254>
1f8:    e51b2014    ldr    r2, [fp, #-20]
1fc:    e3a03001    mov    r3,#1    ; 0x1
200:    e1a03213    mov    r3, r3, lsl r2
204:    e5813000    str    r3, [r1]
208:    e59f1048    ldr    r1, [pc,#72]    ; 258 <.text+0x258>
20c:    e51b2014    ldr    r2, [fp, #-20]
210:    e3a03001    mov    r3,#1    ; 0x1
214:    e1a03213    mov    r3, r3, lsl r2
218:    e5813000    str    r3, [r1]
21c:    e3a0144a    mov    r1,#1241513984    ; 0x4a000000
220:    e51b2014    ldr    r2, [fp, #-20]
224:    e3a03001    mov    r3,#1    ; 0x1
228:    e1a03213    mov    r3, r3, lsl r2
22c:    e5813000    str    r3, [r1]
230:    e59f1024    ldr    r1, [pc,#36]    ; 25c <.text+0x25c>
234:    e51b2014    ldr    r2, [fp, #-20]
238:    e3a03001    mov    r3,#1    ; 0x1
23c:    e1a03213    mov    r3, r3, lsl r2
240:    e5813000    str    r3, [r1]
244:    e24bd00c    sub    sp, fp,#12    ; 0xc
248:    e89da800    ldmia    sp, {fp, sp, pc}
24c:    4a000014    bmi    2a4
250:    56000014    undefined
254:    560000a8    strpl    r0, [r0], -r8, lsr #1
258:    4a000018    bmi    2c0
25c:    4a000010    bmi    2a4

00000260 :
260:    e1a0c00d    mov    ip, sp
264:    e92dd800    stmdb    sp!, {fp, ip, lr, pc}
268:    e24cb004    sub    fp, ip,#4    ; 0x4
26c:    eafffffe       26c
Disassembly of section .comment:

00000000 <.comment>:
  0:    43434700    cmpmi    r3,#0    ; 0x0
  4:    4728203a    undefined
  8:    2029554e    eorcs    r5, r9, lr, asr #10
  c:    2e312e34    mrccs    14, 1, r2, cr1, cr4, {1}
 10:    47000030    smladxmi    r0, r0, r0, r0
 14:    203a4343    eorcss    r4, sl, r3, asr #6
 18:    554e4728    strplb    r4, [lr, #-1832]
 1c:    2e342029    cdpcs    0, 3, cr2, cr4, cr9, {1}
 20:    00302e31    eoreqs    r2, r0, r1, lsr lr
 24:    43434700    cmpmi    r3,#0    ; 0x0
 28:    4728203a    undefined
 2c:    2029554e    eorcs    r5, r9, lr, asr #10
 30:    2e312e34    mrccs    14, 1, r2, cr1, cr4, {1}
 34:    Address 0x00000034 is out of bounds.

中断程序运行过程:

第9章 <wbr>中断
第9章 <wbr>中断