基于mini2440 的 bootloader 设计 ---- 9、中断初始化
2015-11-17 17:05
239 查看
开发环境:
电脑系统:RedHat Enterprise Linux6 kernel version : linux-2.6.32
交叉工具链:arm-linux-xxx4.3.2
开发板版本:mini2440 S3C2440处理器 64M SDRAM 256M nand flash
本文将介绍S3c2440芯片的中断系统。为了测试中断功能,笔者使用了一个外部中断----按键。
一、背景知识
中断的概念这里就不再赘述了。2440 CPU 共支持60个中断源,分为IRQ和FIQ,或者分为外部中断和内部中断,还可以分为有子中断的中断和没有子中断的中断。所谓的子中断,就如一个串口中断,它又分为读中断和写中断。当一个中断源来临的时候,需要经过一个筛选器,通过筛选器的中断源才能中断CPU核,让CPU处理它的请求。这么一个筛选器如下图所示:
其中中断源有两条路径,这其实就是由有子中断和没子中断引起的。当中断源来临时,会在SRCPND寄存器将相应的位置1(SRCPN寄存器的每一位都代表着一个或者一类中断,当该位被置1时说明该中断来临),这时如果该中断被打开了,就可以到达中断优先级判断,经过优先级判断以后就可以将INTPND寄存器的相应位置1。当CPU发现INTPND的某一位被置1时,CPU就会查找中断号,然后响应该中断,转去处理相应的中断子程序。因此要初始化中断,其实就是将相应的中断打开,然后在适当的时候读取中断号判断中断类型,并提供中断子程序。
中断的处理还涉及到一个很重要的话题:环境保护和回恢复。事实上,在中断源通过了筛选器,并成功中断CPU以后,CPU的PC指针就指向一个固定的地址---异常向量表的一项,并且CPU 的工作模式就进入irq 或者fiq模式。为了让CPU处理完中断子程序后能够成功返回,需要将刚进入中断模式下时的寄存器保存起来。当完成中断处理后将这些寄存器恢复,就能够继续中断前的工作。因此在异常向量表里,该地址完成的事就三件:保护环境、跳转到中断处理程序、恢复环境。恢复环境时将CPU也一并恢复,这样就能直接回到中断前的地方继续执行。
二、代码实现
从代码的角度来看,要完成中断的初始化可以按照如下步骤:
开启中断-->保护环境-->跳转到中断总入口-->恢复环境。
其中在中断总入口中完成:判断中断源-->调用相应的中断处理函数
按照这一流程,笔者实现了相应的外部中断,并通过按键测试到中断成功。
实现代码位于:点击打开链接
相关文章推荐
- #新闻拍一拍# IBM 招聘广告要求应聘者具备至少 12 年 K8S 使用经验
- vivi下重新调整分区
- ARM Linux系统启动
- Linux及ARM Linux程序开发笔记(零基础入门篇)
- ARMBoot-1.1.0 在 mini2440 开发板上的移植
- 零基础入门篇之Linux及Arm-Linux程序开发笔记
- 我的 ARM+Linux 学习路线
- 关于ARM启动的一篇文章
- ARM 的堆栈初始化详解
- ARM条件码与CPSR标志位的关系
- 加载/存储指令
- 关于ARM 汇编的一些疑问
- ARM汇编伪指令介绍
- linux的防火墙及arm与虚拟机共享
- 编译单个驱动的Makefile文件。
- ARM Linux系统调用的原理
- Android LKM Rootkit,查找sys_call_table
- LKM Tricks to Android Devices,查找sys_call_table
- Arm Linux系统调用流程详细解析
- ARM下的injectso