ARM—异常与中断

一、异常与中断产生的过程

  1. 中断时异常的一种,异常可以直接通知CPU,中断通过中断控制器通知CPU;在这里插入图片描述
  2. 异常或中断产生与处理过程:

1、初始化中断:设置时序、按键等中断源,中断使能中断源、中断控制器、CPU总开关;
2、正常执行程序,产生中断;
3、硬件保存当前模式的cpsr的值到相关异常模式的spsr寄存器中,保存lr寄存器,pc跳转到异常向量表;
4、设置异常向量表,跳转执行相关异常(中断)处理函数;
5、异常(中断)处理函数:保存现场:设置栈(用于调用处理函数),保存通用寄存器(用于恢复现场)、lr寄存器(调用处理函数时,会用到lr寄存器,因此需要将硬件自动保存的寄存器再保存一次,以便恢复现场);
6、异常(中断)处理函数:跳转执行处理函数;
7:处理函数:若是中断:分辨中断源,处理中断;
7、清理中断(若是异常则不需要),恢复现场:恢复保存的各种寄存器;

  1. CPU的模式:用户模式usr,管理员模式svc,未定义指令模式und、中断模式irq,快中断模式frq、中止模式abt,不同的模式可以访问的寄存器不一样在这里插入图片描述
  2. 保存现场时,只要保存非阴影部分的寄存器,因为其为不同模式通用的寄存器,阴影部分不需保存,因为是特殊寄存器,即不同模式有各自的特殊寄存器,相互之间不影响,同时不同模式下的栈也要单独设置,不通用,保存现场的方法就是将寄存器压入栈中。
  3. 恢复现场时,就是将寄存器弹出栈,将lr寄存器恢复到pc寄存器中,具体lr与pc寄存器之间的偏移取决于下图在这里插入图片描述
  4. cpsr:程序状态寄存器,保存当前模式下的程序的状态在这里插入图片描述

二、程序实例

  1. 以und异常为例
程序的步骤:
1、复位后正常执行程序
2、设置一个未定义中断指令
3、硬件自动跳转异常向量表的0x4地址处
4、程序根据向量表跳转到und异常处理函数
5、und异常处理函数要做:
	1)保存现场:设置栈、保存r0-r12、lr寄存器
	2)跳转到处理und异常的C函数
		1>打印cpsr的值
		2>打印一串字符串
	3)恢复现场:恢复r0-r12寄存器,lr寄存器的值恢复到pc寄存器中

注意事项:
		字符串后要字节对齐
		lr恢复到pc注意偏移;
		选择长跳转指令到SDRAM中运行程序
  1. 以swi软中断异常为例
程序的步骤:
1、复位后正常执行程序
2、设置一个未定义中断指令
3、硬件自动跳转异常向量表的0x8地址处
4、程序根据向量表跳转到swi异常处理函数
5、und异常处理函数要做:
	1)保存现场:设置栈、保存r0-r12、lr寄存器
	2)跳转到处理und异常的C函数
		1>打印cpsr的值
		2>打印一串字符串
		3>打印软中断的值
			将保存的lr保存的地址-4,即可得到swi指令的地址,通过间接访问得到swi指令,
			根据swi指令特点,忽略低8位,剩下的就是swei指令的具体值。
	3)恢复现场:恢复r0-r12寄存器,lr寄存器的值恢复到pc寄存器中

  1. 以按键中断为例
程序的步骤:以按键中断为例
1、初始化按键中断
	1)设置按键为中断源:GPIO
	2)使能按键中断的中断控制器:MASK寄存器
	3)打开CPU中断总开关:cpsr寄存器
2、正常运行程序,执行main函数
3、按下按键,产生按键中断
4、硬件自动跳转异常向量表的0x18地址处
4、程序根据向量表跳转到irq异常处理函数
5、irq异常处理函数要做:
	1)保存现场:设置栈、保存r0-r12、lr寄存器;
	2)跳转到处理irq异常的C函数:
		1>分辨中断源:通过INTOFFSET寄存器,再通过EINT寄存器;
		2>处理中断:不同的按键点亮不同的灯;
		3>清中断:  SRCPND和INTPND寄存器
	3)恢复现场:恢复r0-r12寄存器,lr寄存器的值恢复到pc寄存器中。

注意:
	中断异常无须特意设置,按键发生是由人为控制,可以通过C语言实现
  1. 以定时器中断为例
程序的步骤:以定时器中断为例
1、初始化定时器中断
	1)设置定时器时钟:TCFG0寄存器;
	2)设置初始值:TCNTB0寄存器;
	3)加载初始值,使能定时器:TCON寄存器;
	3)设置自动加载初始值:TCON寄存器;
2、正常运行程序,执行main函数;
3、定时器初始值倒计时到0;
4、硬件自动跳转异常向量表的0x18地址处
4、程序根据向量表跳转到irq异常处理函数
5、irq异常处理函数要做:
	1)保存现场:设置栈、保存r0-r12、lr寄存器;
	2)跳转到处理irq异常的C函数:
		1>分辨中断源:通过INTOFFSET寄存器
		2>处理中断:点亮流水灯;
		3>清中断:  SRCPND和INTPND寄存器
	3)恢复现场:恢复r0-r12寄存器,lr寄存器的值恢复到pc寄存器中。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值