历史上的今天
今天是:2024年09月08日(星期日)
2021年09月08日 | s3c2440学习之路-012-0 异常中断基础知识
2021-09-08 来源:eefocus
1. 异常/中断的基本知识介绍
异常/中断是ARM经常用到的处理机制,因此需要好好学习。这里总是写中断/异常是因为中断属于异常的一种,而我们经常听到中断这个词语而少听到异常这个词,所以这些特意写成中断/异常。如果CPU发生中断时,我说CPU发生了异常,你可不能说我讲错了,因此异常包含了中断。
1.1 ARM的7种工作模式
从2440的数据手册中可以看到,ARM920T(2440使用的ARM920T的核) 总共有7种工作模式


其中的中断模式就是我们常用的中断 ,当ARM处理中断操作时,就进入此模式。
1.2 ARM的异常向量表
当ARM发生异常时,就会把PC的值设置成一个固定的值,让程序跳转到固定的地址执行程序,并进入相应的工作模式。
如:
当发生复位时,PC=0x0, 程序跳转到0地址去执行程序,并进入管理模式。
当发生中断时,PC=0x18, 程序跳转到0x18地址去执行程序,并进入中断模式。
上面的例子中,PC的值由硬件自动帮忙赋值,不需要软件来操作。
从这里可以看出来,想要进入不同的工作模式,就需要发生不同的异常。这里就找到了异常与工作模式的关系。

1.3 重要的寄存器CPSR
如何知道ARM当前处于什么模式呢? 可以通过查看CPSR(Current Program States Register )寄存器来知道。
CPSR寄存器的bit[0] ~ bit[4] 可以查出ARM当前工作模式。
不过CPSR这种特殊的寄存器不是一般的mov指令可以操作的, 要通过msr,和 mrs来完成对CPSR寄存器的读写。
如
//读取cpsr 到r0
mrs r0, cpsr
//清空r0的低4位
bic r0, r0, #0xf
//把r0赋值给cpsr
msr cpsr, r0
1.4 异常/中断的处理过程
在处理异常/中断时,即有硬件的处理也有软件的处理,主要的流程如下:
某种条件发引起异常
发生异常时硬件的处理,即进入异常
2.1将返回地址保存在LR(R14)寄存器
2.2将CPSR复制到SPSR(SPSR 就是专门弄来备份CPSR的)
2.3设置CPSR的模式位(设置CPSR的bit0~bit4)
2.4设置PC值为对应的中断/异常向量表(跳到固定地址)
发生异常时软件的处理,即处理异常然后回到异常发生时的位置继续处理
3.1 设置SP(因为需要通过压栈来保存寄存器和代码跳转)
3.2 保存现场(将通用的寄存器保存起来)
3.3 将SPSR赋值给CPSR
3.4 清除中断标志位(针对中断)
3.5 恢复现场(将通用的寄存器恢复回去)
3.6 将LR减去对应的值,再赋值给PC
3.6 将LR减去对应的值,在赋值给PC, 在2440手册中有表格说明LR的值,不过每种模式下LR的值是如何计算的并没有找到说明。

1.5 不同工作模式下的私有寄存器
ARM 通用的寄存器有R0-R15,不过在不同的工作模式下会有一些自己的私有寄存器。
如:
在FIQ模式下,会用到R0-R15,但是R8_fiq-R14_fiq虽然也是叫R8-R14,不过这是FIQ模式下的私有寄存器,不会影响到通用的R8-R14
在Supervisor模式下,会用到R0-R15,但是R13_svc-r14_srv虽然也叫R13-R14, 不过这是Supervisor模式下的私有寄存器,不会影响到通用的R13-R14
综上,用2句话来总结一下
他们是在不同模式下才有的私有寄存器
因为他们的功能时相同的,所以取名也相同,实际上是不同的物理寄存器

1.6 总结
看完后需要对以下的几个问题有些基本的了解才行。
ARM总共有几种工作模式
ARM有多少种异常
异常与工作模式之间有什么关系
在执行完异常后,如何计算LR的返回地址
史海拾趣
|
手机FM天线,到底是内置的好还是拉杆好? 其实各有他的有点,内置的体积小,拉杆的信号好。 就是不完美啊了。为了这个完美的,本公司花了数年研究这个问题,终于解决了,一种新的材料制作的内置FM天线,效果好且体积小,真是神一般的,呵呵 ,有 ...… 查看全部问答> |
|
9650输出640*480,在横屏下可以不失真显示。可是我在竖屏下如果想要全屏显示图像会失真(就是图像变长了),因为竖屏分辨率为240*320。不知有没有高手知道怎么样才能不失真显示图像。… 查看全部问答> |
|
我想实现,Wince设备通过蓝牙模块连接蓝牙手机拨号上网,目前一个同事已经实现设备与蓝牙手机连接,获取电话本,接拨电话的功能,我想在其基础上实现拨号上网的功能,现在还没有什么头绪,请有经验的大虾讲讲思路。… 查看全部问答> |
|
手机键盘中,挂机键和电源键是同一个键,有一个问题就是:GPIO设为高电平时候可以作为挂机键不能作为电源键,GPIO设为低电平时候可以作为电源键却不能作为挂机键,现在需要解决这个问题。 想到可以做个后台程序检测手机的状态,当处于通话状态时候 ...… 查看全部问答> |
|
MeeGo移植到SEED-DIM3517请注意,尚未测试通过0. 开发平台操 作 系 统:Ubuntu10.10交叉编译工具:arm-2009q1(光盘里带的)MeeGo 版本:1.1.90.1.20110201.11. 开发环境搭建1.1 安装MeeGo开发工具MeeGo开发工具的安装步骤还是很多,这里就不写了。 ...… 查看全部问答> |
|
各位大侠,我现在用28335的I2C模块与EEPROM AT24C08进行通信,程序没有错误,但是用示波器不能测出SDA和SCL信号。例程里的从机地址是0x50,因为我这里用的是AT24C08,所以从机地址应该是0xA9,是不是只需要修改这个地址就可以了?希望各 ...… 查看全部问答> |
|
最近刚开始32位单片机的学习,呵呵,有点小不适应,固件库的确不错,但是需要适应时间,一个本来很简单的usart,却让我debug了两天。问题很简单,X-CUT接受不到USART发送的字符,我用的是神州IV,F107。目前我怀疑是时钟频率的问题,USART2 设置好后 ...… 查看全部问答> |
|
中国,北京 (2013年10月29日) - Analog Devices, Inc.(ADI: NASDAQ)今天宣布,公司入选汤森路透2013全球最具创新力企业100强SM项目全球百家创新企业。该汤森路透奖项基于专有数据和分析工具,选出那些在创新方面居于全球领先地位的企业和组织。这是 ...… 查看全部问答> |
|
lm5022升压模块out引脚不能输出pwm波形....... 本帖最后由 paulhyde 于 2014-9-15 03:17 编辑 电路如图,Rsns用一段0.1欧的导线代替,M1用的是IFRF024N。 … 查看全部问答> |






