特此声明
各位有缘的好朋友们,因为我没有S3C2410这款板子,所以我只是在这里和大家分享我的读书笔记,希望博客中有出现不对的地方,欢迎大家指正!非常感谢
前言
- 了解ARM体系CPU的7种工作模式
- 了解S3C2410中断体系结构
- 掌握S3C2410的中断服务程序的编写方式
一 中断体系结构
ARM体系CPU的7种工作模式
- 用户模式:ARM处理器正常的程序执行状态
- 快速中断模式:用于高速数据传输或通道处理(USART串口等)
- 中断模式:用于通用的中断处理。(按键等)
- 管理模式:操作系统使用的保护模式
- 数据访问终止模式:当数据或指令预取终止时进入该模式,可用于虚拟存储及存储保护
- 系统模式:运行具有特权的操作系统任务
- 未定义指令中止模式:当未定义的指令执行时进入该模式,可用于支持硬件协处理器的软件仿真。
除用户模式外,其他6种工作模式都属于特权模式。大多数程序运行在用户模式,进入特权模式是为了处理中断,异常,或访问被保护的系统资源
ARM体系的CPU工作状态
- ARM状态:此时处理器执行32位的字对齐的ARM指令。
- Thumb状态:此时处理器执行16位的,半字对齐的Thumb指令。
其实还有Thumb2状态,就是既可以执行16位的指令,还可以执行32位的ARM指令。
ARM状态下寄存器结构
ARM920T有31个通用的32位寄存器和6个程序状态寄存器。这37个寄存器分为7组,进入某个工作模式时就是使用它那组的寄存器。有些寄存器,不同的工作模式下有自己的副本,当切换到另一个工作模式时,那个工作模式的寄存器副本将会被使用:这些寄存器称为副本寄存器 有兴趣的朋友可以数一下,确实是37个。 其中R0~R15都是可以直接访问的,除R15外都是通用寄存器。他们既可以保存数据也可以用于保存地址。但是R13 ~R15比较特殊 R13:栈指针寄存器(SP),保存栈指针 R14:程序连接寄存器(LR),用来保存返回地址 R15:程序计数器(PC),用来存储CPU下一条执行指令的地址 快速中断模式有7个备份寄存器R8~R14,这使得进入快速中断模式执行很大一部分程序时(只要R0 ~ R7不改变),甚至不需要保存任何寄存器。其他模式都含有两个独占的寄存器副本R13,R14,这样可以令每一个模式拥有自己的栈指针寄存器和连接寄存器。
每种工作模式除了R0~R15外,还有第十七个寄存器 CPSR(当前程序状态寄存器),CPSR中一些位被用于标识各种状态,一些位被用于标识当前处于什么工作模式。 有兴趣的同学可以看下面的资料
中断控制器
CPU运行过程中,如何知道各类外设发生了某些不可预期事件,比如串口接收到了新数据,USB接口中插入了新设备,按下了某个按键等,主要是一下两种方法
中断检测方式
- 查询方式:程序循环的检查各设备的状态并作出相应反应。(优点:实现简单,缺点:占CPU)
- 中断方式:当事件发生时,硬件会设置某个寄存器;CPU在每执行完一个指令时,通过硬件查看这个寄存器,如果发现了所关注的事件发生,则中止当前程序的运行,跳转到另一个固定地址来处理事件,最后返回继续执行被中断程序。(实现复杂,效率很高)
中断处理流程
- 中断控制器汇集各类外设发出的中断信号,然后告诉CPU
- CPU保存当前程序运行环境(保护现场),调用中断服务程序来处理这个中断
- 在中断服务程序中通过读取中断控制器(优先级等),外设的相关寄存器来判断是哪一种中断,并调用相应的中断函数进行处理
- 清楚中断:通过读写中断控制器和外设相关寄存器来实现。
- 最后恢复现场。
中断流程图
中断控制寄存器
- SUBSPCPND寄存器:用来标识中断,每一位对应一个中断
- INTSUBMSK寄存器:用来屏蔽SUBSRCPND寄存器所标识的中断
- SRCPND寄存器:用来表示中断是否已经发生
- INTMSK寄存器:用来屏蔽SRCPND寄存器所标识的中断,INTMSK只能屏蔽被设为IRQ的中断。
- INTMOD寄存器:对应的中断设置为FIQ(1为快中断,0为普通中断)
- PRIOTY寄存器:优先级寄存器
- INTPND寄存器:经过中断优先级仲裁器选出优先级最高的中断后,这个中断在INTPND寄存器中的相应为被置为1,随后,CPU进入中断模式进行处理。
- INTOFFSET寄存器:被用来表示上面寄存器中哪一个被置1了
中断控制器操作实例:外部中断
按键中断的思路
K1~K4四个按键所接的CPU引脚可以外设成外部中断功能。按下某个按键时,CPU调用其中的中断服务程序来点亮对应的LED
实验代码
同学们可以上www.100ask.com进行下载对应的源码。 其实很简单就是寄存器的移位操作,和中断服务的配置就好了
总结
希望对大家有用吧,至少清楚ARM的工作模式,寄存器的分布规则,中断处理流程,中断处理体系,中断寄存器的配置。
加油!这本书已经看完三分之二了!
|