实验五--中断系统

一。平台

  系统:ubuntu12.04

  开发板:jz2440

  编译器:gcc

二。中断简略

  大概除了FPGA这种并行的cpu才不需要中断,像51,AVR,arm这类串行的芯片中断是他们不被淘汰的利器。没有中断,他们不可能得到这么广泛的应用。

  arm中断和51的类似,无非就是设置相关寄存器、中断开关,中断源,中断分辨之类的东西;但是注意,arm的中断只是7个模式下的一个,此外,中断还有普通中断和快速中断之分。

  而快速中断不需要进行中断的分辨,因为每次最多只有一个被设置为快速中断。

  

这里看中断源分为两部分。一个是with sub-register,另一个是without,有何区别?试想下,串口会有几个中断?发送中断,接受中断,至少两个吧,那么中断源是怎么做的呢,是当做两个来,那么就得给分配很多中断向量吧。实际上,with sub-register就是把中断源进行归类。看:

比如uart0  有3个子源,

在60个中断源里面只当做一个;

当然后面会进行分别中断,像

若OFFSET=12,说明中断是串口0.

然后就是中断屏蔽 和优先级的问题。

这个寄存器设置快速中断的,每次只能有一位设置成快速中断。

三。看代码先

Makefile

 1 objs := head.o init.o interrupt.o main.o
 2
 3 int.bin: $(objs)
 4     arm-linux-ld -Ttext 0x00000000 -o int_elf $^
 5     arm-linux-objcopy -O binary -S int_elf [email protected]
 6     arm-linux-objdump -D -m arm int_elf > int.dis
 7
 8 %.o:%.c
 9     arm-linux-gcc -Wall -O2 -c -o [email protected] $<
10
11 %.o:%.S
12     arm-linux-gcc -Wall -O2 -c -o [email protected] $<
13
14 clean:
15     rm -f int.bin int_elf int.dis *.o
16     

head.S

 1 @******************************************************************************
 2 @ File:head.S
 3 @ 功能:初始化,设置中断模式、管理模式的栈,设置好中断处理函数
 4 @******************************************************************************
 5
 6 .extern     main
 7 .text
 8 .global _start
 9 _start:
10 @******************************************************************************
11 @ 中断向量,本程序中,除Reset和HandleIRQ外,其它异常都没有使用
12 @******************************************************************************
13     b   Reset
14
15 @ 0x04: 未定义指令中止模式的向量地址
16 HandleUndef:
17     b   HandleUndef
18
19 @ 0x08: 管理模式的向量地址,通过SWI指令进入此模式
20 HandleSWI:
21     b   HandleSWI
22
23 @ 0x0c: 指令预取终止导致的异常的向量地址
24 HandlePrefetchAbort:
25     b   HandlePrefetchAbort
26
27 @ 0x10: 数据访问终止导致的异常的向量地址
28 HandleDataAbort:
29     b   HandleDataAbort
30
31 @ 0x14: 保留
32 HandleNotUsed:
33     b   HandleNotUsed
34
35 @ 0x18: 中断模式的向量地址
36     b   HandleIRQ
37
38 @ 0x1c: 快中断模式的向量地址
39 HandleFIQ:
40     b   HandleFIQ
41
42 Reset:
43     ldr sp, =4096           @ 设置栈指针,以下都是C函数,调用前需要设好栈
44     bl  disable_watch_dog   @ 关闭WATCHDOG,否则CPU会不断重启
45
46     msr cpsr_c, #0xd2       @ 进入中断模式
47     ldr sp, =3072           @ 设置中断模式栈指针    因为下面代码都是管理模式下,所以先设置中断模式的栈
48
49     msr cpsr_c, #0xd3       @ 进入管理模式
50     ldr sp, =4096           @ 设置管理模式栈指针,
51                             @ 其实复位之后,CPU就处于管理模式,
52                             @ 前面的“ldr sp, =4096”完成同样的功能,此句可省略
53
54     bl  init_led            @ 初始化LED的GPIO管脚
55     bl  init_irq            @ 调用中断初始化函数,在init.c中
56     msr cpsr_c, #0x5f       @ 设置I-bit=0,开IRQ中断
57
58     ldr lr, =halt_loop      @ 设置返回地址
59     ldr pc, =main           @ 调用main函数
60 halt_loop:
61     b   halt_loop
62
63 HandleIRQ:
64     sub lr, lr, #4                  @ 计算返回地址
65     stmdb   sp!,    { r0-r12,lr }   @ 保存使用到的寄存器
66                                     @ 注意,此时的sp是中断模式的sp
67                                     @ 初始值是上面设置的3072
68
69     ldr lr, =int_return             @ 设置调用ISR即EINT_Handle函数后的返回地址
70     ldr pc, =EINT_Handle            @ 调用中断服务函数,在interrupt.c中
71 int_return:
72     ldmia   sp!,    { r0-r12,pc }^  @ 中断返回, ^表示将spsr的值复制到cpsr
73     

init.c

 1 /*
 2  * init.c: 进行一些初始化
 3  */
 4
 5 #include "s3c24xx.h"
 6
 7 /*
 8  * LED1,LED2,LED4对应GPF4、GPF5、GPF6
 9  */
10 #define    GPF4_out    (1<<(4*2))
11 #define    GPF5_out    (1<<(5*2))
12 #define    GPF6_out    (1<<(6*2))
13
14 #define    GPF4_msk    (3<<(4*2))
15 #define    GPF5_msk    (3<<(5*2))
16 #define    GPF6_msk    (3<<(6*2))
17
18 /*
19  * S2,S3,S4对应GPF0、GPF2、GPG3
20  */
21 #define GPF0_eint     (0x2<<(0*2))
22 #define GPF2_eint     (0x2<<(2*2))
23 #define GPG3_eint     (0x2<<(3*2))
24
25 #define GPF0_msk    (3<<(0*2))
26 #define GPF2_msk    (3<<(2*2))
27 #define GPG3_msk    (3<<(3*2))
28
29 /*
30  * 关闭WATCHDOG,否则CPU会不断重启
31  */
32 void disable_watch_dog(void)
33 {
34     WTCON = 0;  // 关闭WATCHDOG很简单,往这个寄存器写0即可
35 }
36
37 void init_led(void)
38 {
39     // LED1,LED2,LED4对应的3根引脚设为输出
40     GPFCON &= ~(GPF4_msk | GPF5_msk | GPF6_msk);
41     GPFCON |= GPF4_out | GPF5_out | GPF6_out;
42 }
43
44 /*
45  * 初始化GPIO引脚为外部中断
46  * GPIO引脚用作外部中断时,默认为低电平触发、IRQ方式(不用设置INTMOD)  设置第二功能
47  */
48 void init_irq( )
49 {
50     // S2,S3对应的2根引脚设为中断引脚 EINT0,ENT2
51     GPFCON &= ~(GPF0_msk | GPF2_msk);
52     GPFCON |= GPF0_eint | GPF2_eint;
53
54     // S4对应的引脚设为中断引脚EINT11
55     GPGCON &= ~GPG3_msk;
56     GPGCON |= GPG3_eint;
57
58     // 对于EINT11,需要在EINTMASK寄存器中使能它
59     EINTMASK &= ~(1<<11);
60
61     /*
62      * 设定优先级:
63      * ARB_SEL0 = 00b, ARB_MODE0 = 0: REQ1 > REQ3,即EINT0 > EINT2
64      * 仲裁器1、6无需设置
65      * 最终:
66      * EINT0 > EINT2 > EINT11即K2 > K3 > K4
67      */
68     PRIORITY = (PRIORITY & ((~0x01) | (0x3<<7))) | (0x0 << 7) ;
69
70     // EINT0、EINT2、EINT8_23使能
71     INTMSK   &= (~(1<<0)) & (~(1<<2)) & (~(1<<5));
72 }

interrupt.c   识别中断  OFFSET寄存器

 1 #include "s3c24xx.h"
 2
 3 void EINT_Handle()
 4 {
 5     unsigned long oft = INTOFFSET;
 6     unsigned long val;
 7
 8     switch( oft )
 9     {
10         // S2被按下
11         case 0:
12         {
13             GPFDAT |= (0x7<<4);   // 所有LED熄灭
14             GPFDAT &= ~(1<<4);      // LED1点亮
15             break;
16         }
17
18         // S3被按下
19         case 2:
20         {
21             GPFDAT |= (0x7<<4);   // 所有LED熄灭
22             GPFDAT &= ~(1<<5);      // LED2点亮
23             break;
24         }
25
26         // K4被按下
27         case 5:
28         {
29             GPFDAT |= (0x7<<4);   // 所有LED熄灭
30             GPFDAT &= ~(1<<6);      // LED4点亮
31             break;
32         }
33
34         default:
35             break;
36     }
37
38     //清中断
39     if( oft == 5 )
40         EINTPEND = (1<<11);   // EINT8_23合用IRQ5
41     SRCPND = 1<<oft;
42     INTPND = 1<<oft;
43 }

最后main里面就是空循环,等待中断。

时间: 2024-08-28 06:48:18

实验五--中断系统的相关文章

2017-2018-1 20162318 实验五

2017-2018-1 20162318 实验五 分析系统架构 主要类:Card类.GameView类 card类: public Card(Context context) { super(context); LayoutParams lp = null; background = new View(getContext()); //这个是Card的背景设计,是一个View lp = new LayoutParams(-1, -1); lp.setMargins(10, 10, 0, 0);

2017-2018-1 20162304 实验五

2017-2018-1 20162304 实验五 分析系统架构 我们就从图中提取出较为重要的游戏界面进行分析 主要类:AnimLayer类.Card类.GameView类.Config类 AnimLayer类是用于控制动画效果的类,以下为其中一段控制方块合并消失的动画 public void createMoveAnim(final Card from, final Card to, int fromX, int toX, int fromY, int toY) { final Card c =

5. 蛤蟆的计算机组成原理笔记五输入输出系统

5. 蛤蟆的计算机组成原理笔记五输入输出系统 本篇名言:"质朴却比巧妙的言辞更能打动我的心. --莎士比亚" 欢迎转载,转载请标明出:http://blog.csdn.net/notbaron/article/details/48037245 1.  输入输出系统 1.1             I/O 软件 (1) I/O 指令 CPU 指令的一部分 (2) 通道指令 通道自身的指令 1.2             I/O设备与主机信息传送的控制方式 1. 程序查询方式 2. 程序中

单片机的中断系统

中断概念 正常的工作过程被外部的事件打断了,EX 你正在家中看书,突然电话铃响了,你放下书本,去接电话,和来电话的人交谈,然后放下电话,回来继续看你的书. 中断源 引起中断的事件称之为中断源,51中一共有5五个:两个外部中断,两个计数/定时器中断,一个串行口中断. 中断优先级与嵌套 当两个中断同时产生时,就要考虑优先级. 当一个中断已发生,又一个中断产生了,又要考虑另一种嵌套优先级. 中断的响应过程 保护断点:保存下面将要执行的指令地址送人堆栈,以便中断处理完之后回到原来地方继续执行 寻找中断入

20145207《Java程序设计》实验五(Java开发环境的熟悉)实验报告

<Java 程序设计>实验五(网络编程与安全)实验报告 目录 改变 网络编程与安全实验要求 实验成果 课后思考 改变 修改了之前仅仅是贴了图片,连代码都没粘的状态.不过这篇博客我只能做到写好,毕竟里面的东西我说我做得出来我自己都不信.. 代码贴的·,这个真的不会做实话实说 网络编程与安全实验要求 任务一: 编写MyBC.java实现中缀表达式转后缀表达式的功能 编写MyDC.java实现从上面功能中获取的表达式中实现后缀表达式求值的功能 任务二: 结对编程:一人负责客户端,另一人负责服务器 注

51单片机中断系统

51中断系统 1.什么是中断 中断是CPU在执行程序是不需要管中断源的状态,当中断源满足中断触发条件时CPU再去进行终端处理 2.中断源 80C51共五个中断源分别是两个外部中断源:INT0.INT1,两个定时中断源T0.T1,一个串行口中断源 每个中断源对应着一个中断入口地址 中断源 入口地址 外部中断源INT0 0003H 定时器T0 000BH 外部中断源INT1 0013H 定时器T1 001BH 串行口中断 0023H 3.中断控制 3.1.     定时控制寄存器TCON 控制对象

【CC2530入门教程-03】CC2530的中断系统及外部中断应用

第3课  CC2530的中断系统及外部中断应用 广东职业技术学院  欧浩源 一.中断相关的基础概念  内核与外设之间的主要交互方式有两种:轮询和中断. 轮询的方式貌似公平,但实际工作效率很低,且不能及时响应紧急事件:中断系统使得内核具备了应对突发事件的能力. 在执行CPU当前程序时,由于系统中出现了某种急需处理的情况,CPU暂停正在执行的程序,转而去执行另外一段特殊程序来处理出现的紧急事务,处理结束后,CPU自动返回到原来暂停的程序中去继续执行. 这种程序在执行过程中由于外界的原因而被中间打断的

实验五:扒开系统调用的三层皮(下)

实验五:扒开系统调用的三层皮(下) 王朝宪20135114 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.给MenuOS增加time和time-asm命令 1. 通过内核的方式(跟踪调试系统调用)来理解并使用系统调用. rm menu -rf //强制删除当前menu git clone http://github.com/mengning/menu.git //重新克隆新版本的m

Java实验四和实验五

实验四 类的继承性和多态性 [开发语言及实现平台或实验环境] Windows2000 或XP,JDK1.6与Jcreator4.0 [实验目的] 1.  掌握OOP方式进行程序设计的方法, 2.  了解类的继承性和多态性的作用. [实验要求] 1.  编写体现类的继承性(成员变量,成员方法,成员变量隐藏)的程序. 2.  编写体现类多态性(成员方法重载,构造方法重载)的程序. [实验内容] 一 类的继承性练习 1. 进一步理解继承的含义 新类可从现有的类中产生,并保留现有类的成员变量和方法并可根