下面的图是2440的中断向量表
我们可以看到这个中断向量表是4字节对齐
其中 supervisor 的模式表示的是管理模式 此模式相当于管理员模式 可以访问硬件,如果死机则需要重启
undefined 模式 当命令或者地址不是2440所定义的命令 则触发其中断
FIQ 快速中断模式
IRQ 普通中断模式
其中可以看到未定义指令异常是在04这个地方
1. 首先看手册
这里是异常中断之后的寄存器,其中加灰色三角的表示此寄存器是唯一的 不与其他的寄存器共用,只是当进入此模式的时候才使用其寄存器。比如undefined mode 自己的寄存器是R13 和 R14里面分别存的是R13 是这个模式下的栈 需要存入栈的地址。R14是存入发生异常之后那条命令的地址 用来返回原先程序 R15是PC指针。
当发生异常的时候 CPU会做如下事情(ARM 模式下):
1. ARM会自动的把这个异常的下一句话保存到R14
2. 把之前的CPSR的状态拷贝到SPSR
3. 根据发生不同的异常 CPSR会发生了变化 (如下图)
4. PC会指向中断的片段。。
程序要做的事情是:
1. 我们需要保存R1-R12 和 R14的数据 包括一般数据和返回主程序的地址 保存在栈里面
2. 在中断中处理信息 (注意 R0 和 R1存可存入C语言的函数入口变量)
3. 把所有的寄存器的数据弹出栈,把R14返回的地址给PC
ldr sp ,= 0x34000000 //先建立栈
stmdb sp!, {r0, r12, lr} //把数据存入栈
msr r0, cpsr /*把CPSR 的值读入r0*/
ldr r1, = und_string
bl print_und
/**恢复现场**/
ldmia sp, {r1, r12, pc}^ //恢复现场
关键字:中断 异常
引用地址:
中断和异常(1) 未定义异常
推荐阅读最新更新时间:2024-11-10 07:54
(三)s3c2440——中断实验
一、进入中断前的准备: 1、保存进入中断前的环境 2、进入中断模式,设置中断模式下的栈 二、中断处理框图详解: 第一路: 当内部触发中断后,SUBSRCPND相应的位置1,代表某个中断发生。并且SRCPND的相应位也置1。 对于普通中断IRQ,当同时发生几个中断的时候,我们要通过优先级来决定哪个先执行,哪个后执行。 这时候,优先级高的先执行,此时INTPND相应位置1。中断服务函数中判断中断源时,可以通过 INTPND或者INTOFFSET来判断。 第二路: 外部中断发生的时候,直接在SRCPND处相应位置1,然后往后执行和
[单片机]
ARM平台上Linux异常处理代码简要分析
Linux version 3.10.40 ARM处理器支持多种异常模式,如reset,irq,fiq等,发生异常后处理器根据配置跳到指定的地址运行,可以配置成从0地址开始,也可以配置成从0xFFFF0000地址开始。我们从两个角度分析Linux上的实现,第一是负责异常处理的代码是如何安装到该地址的,第二是这些代码的处理流程是什么样的。 一 放置异常处理代码流程 依次涉及: init/main.c中的start_kernel函数 arch/arm/kernel/setup.c中的setup_arch函数 arch/arm/mm/mmu.c中的paging_init和devicemaps_init函数 a
[单片机]
基于设备树的TQ2440的中断(2)
下面以按键中断为例看看基于设备数的中断的用法: 设备树: tq2440_key { compatible = tq2440,key ; interrupt-parent = interrupts = key_3 = key_4 = key_8 = }; 驱动: View Code 启动后,加载驱动,可以看看/proc/interrupts: # cat /proc/interrupts CPU0 7: 252 s3c-eint 7 Edge eth0 8: 0 s3c 8 Edge s3c2410-r
[单片机]
51单片机(十四)—— 中断功能介绍
中断是单片机的一个重要功能,本文我们就对51单片机的中断进行介绍。 所谓“中断”,通俗一点讲,就是单片机停止正在执行的任务,转去执行其它的急需解决的任务,当这个任务完成之后,在回到原来的任务继续执行。中断就是为了使单片机能够对外部或内部随机发生的事件进行实时处理而设计的。中断功能的存在,很多程度上提高了单片机处理外部或内部事件的能力。中断功能是我们在学习单片机过程中必须掌握的。 STC89C516单片机内部有6个中断源,也就是说,有6种情况发生时,会使单片机去处理中断程序。 为了能让大家更容易理解中断的概念,我们举一个通俗的例子:你打开火,烧一壶水,然后去扫地。在扫地过程中,突然听到水壶发出
[单片机]
STM32F429-DISCO上手,stm32cubeMX与IAR学习,中断及Printf
stm32f429及stm32f439已经带有LTDC控制器,意味着可以输出RGB888及RGB565的图像信号,这与以往的单片机CPU8080接口LCD有很大不同,也是入手STM32F429-DISCO的原因,价格不贵,mouser上不含税150,淘宝180,非常适合学习。 STM推出了一个叫STM32CUBEMX的软件,可以用来配置将要用到的模块,配置时钟树,输出源文件,相当给力。(不过貌似也有童鞋说坑,个人觉得挺好用的) 芯片选型后 配置JTAG(SWD),一个HSE(8MHz),两个GPIO_OUT,一个GPIO_IRQ(都是板子上有的东西) 配置时钟树,有问题的会自动标成红色,特别要记下的就是SYSCL
[单片机]
ARM异常和中断
异常和中断 异常就是在程序运行过程中(USER mode),出现了一些异常情况,而中断是异常的一种情况. 模式和异常的对应关系 需要特别注意的就是,如果在程序执行过程中需要进行系统调用(程序正常运行在USER模式,而内核运行在SVC模式,user模式无法直接运行SVC模式的指令,因此需要通过异常的方式进入到特权模式. 故这里就通过SWI实现.),即 SWI软中断– SVC. 异常处理 异常向量表 存储在内存固定区域,表中每一个表项都对应一个异常类型,存了一个跳转指令:LDR PC, handle(将需要调用的函数地址放到PC中,即可跳转到指定的地址执行) 异常优先级 RESET Data Abort(数据异常) F
[单片机]
MSP430F5438A中断问题
MSP430F5438A中断问题 写一个简单程序进入中断,首先进入中断的条件: 1.时钟源配置好 2.中断的寄存器配置好 3.中断向量表配置好 以上三点都配置好是不是就应该进入中断了?帮忙看看下面的程序进不去中断,我用的是捕获模式,捕获引脚1.4有捕获信号。 #include “msp430.h” void Init_MCLK(void); int main( void ) { // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; P5DIR |= BIT4; P5OUT |= BIT4; Init_MCLK()
[单片机]