S3c2440ARM异常与中断体系详解2---CPU模式(Mode)状态(State)

发布者:安静宁静最新更新时间:2021-10-20 来源: eefocus关键字:S3c2440  ARM异常  寄存器 手机看文章 扫描二维码
随时随地手机看文章

这节课我们来讲CPU的工作模式(Mode) 状态(State)寄存器

7种Mode:


 usr(用户模式)

 sys(系统模式)

 undefined(und)(未定义模式)

 Supervisor(svc)(管理者模式)

 Abort(abt)(中止模式)

 IRQ(irq)(中断模式)

 FIQ(fiq)(快速中断模式)


2种State:


 ARM state

 Thumb state


寄存器:

通用寄存器

备份寄存器(banked register)

当前程序状态寄存器(Current Program Status Register);CPSR

CPSR的备份寄存器:SPSR(Save Program Status Register)


我们仍然以这个母亲为例讲解这个CPU模式

这个母亲无压力看书 –>(正常模式)

要考试,看书—>(兴奋模式)

生病—->(异常模式)


可以参考书籍 《ARM体系结构与编程》作者:杜春雷


对于ARM CPU有7种模式:


1 、usr :类比 正常模式


2 、sys :类比的话兴奋模式


3 、5种异常模式:(2440用户手册72页)


3.1 und :未定义模式

3.2 svc :管理模式

3.3 abt :中止模式: a 指令预取中止(读写某条错误的指令导致终止运行) b 数据访问终止 (读写某个地址, 这个过程出错) ,例如:都会进入终止模式

3.4 IRQ: 中断模式

3.5 FIQ: 快中断模式

我们可以称以下6种为特权模式

und :未定义模式

svc :管理模式

abt :终止模式

IRQ :中断模式

FIQ :快中断模式

sys :系统模式


usr用户模式(不可直接进入其他模式) ,特权模式可以编程操作CPSR直接进入其他模式

在这里插入图片描述

这个图是有关各个模式下能访问寄存器的,再讲这个图之前我们先引入 2种state


CPU有两种state:


1 ARM state:使用ARM指令集,每个指令4byte

2 Thumb state:使用的是Thumb指令集,每个指令2byte

比如同样是:


mov R0, R1 编译后


对于ARM指令集要占据4个字节:机器码


对于Thumb指令集占据2个字节:机器码


引入Thumb减少存储空间


ARM指令集与Thumb指令集的区别:


Thumb 指令可以看作是 ARM 指令压缩形式的子集,是针对代码密度的问题而提出的,它具有 16 位的代码密度但是它不如ARM指令的效率高 .


Thumb 不是一个完整的体系结构,不能指望处理只执行Thumb 指令而不支持 ARM 指令集.


因此,Thumb 指令只需要支持通用功能,必要时可以借助于完善的 ARM 指令集,比如,所有异常自动进入 ARM 状态.在编写 Thumb 指令时,先要使用伪指令 CODE16 声明,而且在 ARM 指令中要使用 BX指令跳转到 Thumb 指令,以切换处理器状态.编写 ARM 指令时,则可使用伪指令 CODE32声明.


下节课会演示使用Thumb指令集编译,看是否生成的bin文件会变小很多


在每种模式下都有R0 ~ R15


在这张图注意到有些寄存器画有灰色的三角形,表示访问该模式下访问的专属寄存器

比如

mov R0, R8

mov R0, R8

在System 模式下访问的是R0 ~ R8,在所有模式下访问R0都是同一个寄存器

mov R0,R8_fiq

但是在FIQ模式下,访问R8是访问的FIQ模式专属的R8寄存器,不是同一个物理上的寄存器


在这五种异常模式中每个模式都有自己专属的R13 R14寄存器,R13用作SP(栈) R14用作LR(返回地址)

LR是用来保存发生异常时的指令地址


为什么快中断(FIQ)有那么多专属寄存器,这些寄存器称为备份寄存器


回顾一下中断的处理过程

1 保存现场(保存被中断模式的寄存器)


就比如说我们的程序正在系统模式/用户模式下运行,当你发生中断时,需要把R0 ~ R14这些寄存器全部保存下来,让后处理异常,最后恢复这些寄存器


但如果是快中断,那么我就不需要保存 系统/用户模式下的R8 ~ R12这几个寄存器,在FIQ模式下有自己专属的R8 ~ R12寄存器,省略保存寄存器的时间,加快处理速度


但是在Linux中并不会使用FIQ模式


2 处理


3 恢复现场


CRSR当前程序状态寄存器,这是一个特别重要的寄存器


SPSR保存的程序状态寄存器,他们格式如下:

在这里插入图片描述

首先 M4 ~ M0 表示当前CPU处于哪一种模式(Mode);


我们可以读取这5位来判断CPU处于哪一种模式,也可以修改这一种模式位,让其修改这种模式;


假如你当前处于用户模式下,是没有权限修改这些位的;


M4 ~ M0对应什么值,会有说明

在这里插入图片描述

查看其他位

Bit5 State bits表示CPU工作与Thumb State还是ARM State用的指令集是什么

Bit6 FIQ disable当bit6等于1时,FIQ是不工作的

Bit7 IRQ disable当bit5等于1时,禁止所有的IRQ中断,这个位是IRQ的总开关

Bit8 ~ Bit27是保留位

Bite28 ~ Bit31是状态位,


什么是状态位,比如说执行一条指令

cmp R0, R1

如果R0 等于 R1 那么zero位等于1,这条指令影响 Z 位,如果R0 == R1,则Z = 1


beq跳转到xxx这条指令会判断Bit30是否为1,是1的话则跳转,不是1的话则不会跳转

使用 Z 位,如果 Z 位等于1 则跳转,这些指令是借助状态位实现的


SPSR保存的程序状态寄存器:

表示发生异常时这个寄存器会用来保存被中断的模式下他的CPSR


就比如我我的程序在系统模式下运行 CPSR是某个值,当发生中断时会进入irq模式,这个CPSR_irq就保存系统模式下的CPSR


我们来看看发生异常时CPU是如何协同工作的:


进入异常的处理流程(硬件)

在这里插入图片描述

我们来翻译一下:


发生异常时,我们的CPU会做什么事情


1把下一条指令的地址保存在LR寄存器里(某种异常模式的LR等于被中断的下一条指令的地址)

它有可能是PC + 4有可能是PC + 8,到底是那种取决于不同的情况


2 把CPSR保存在SPSR里面(某一种异常模式下SPSR里面的值等于CPSR)


3 修改CPSR的模式为进入异常模式(修改CPSR的M4 ~ M0进入异常模式)


4 跳到向量表


退出异常怎么做?


1、让LR减去某个值,让后赋值给PC(PC = 某个异常LR寄存器减去 offset)

减去什么值呢?

也就是我们怎么返回去继续执行原来的程序,根据下面这个表来取值

在这里插入图片描述

如果发生的是SWI可以把 R14_svc复制给PC


如果发生的是IRQ可以把R14_irq的值减去4赋值给PC


2、把CPSR的值恢复(CPSR 值等于 某一个一场模式下的SPSR)


3、清中断(如果是中断的话,对于其他异常不用设置)


关键字:S3c2440  ARM异常  寄存器 引用地址:S3c2440ARM异常与中断体系详解2---CPU模式(Mode)状态(State)

上一篇:S3c2440ARM异常与中断体系详解1---概念引入与处理流程
下一篇:S3c2440ARM异常与中断体系详解8---定时器中断程序示例

推荐阅读最新更新时间:2024-11-20 11:11

S3C2440开发板学习——如何使用dnw进行数据的USB传输
首先,将开发板的serial和usb接口与PC相连,启动开发板; 其次,通过SecureCRT观察开发板的启动过程,并且按空格键进入开发板的menu菜单,设备管理中出现“SEC S3C2440 Test B/D”设备; 然后,启动禁用驱动程序强制签名的操作,再安装“SEC S3C2440X Test B/D”的驱动程序; 最后,可以发现设备管理中100ASK eBlocks SEC SOC Test Board设备顺利安装,之后就可以正常使用Dnw。 注意问题: 1、在开发板的menu中,可以通过不同选项,进行下载的参数选择,包括:Downloadu-boot to Nand Flash,Download u
[单片机]
S3C2440裸机------触摸屏_使用定时器支持长按
我们前面写的代码中,长按或者滑动时不能读取坐标,接下来我们使用定时器对代码进行改进,可以在长按或者滑动时把坐标值读出来。 #include ../s3c2440_soc.h #define ADC_INT_BIT (10) #define TC_INT_BIT (9) #define INT_ADC_TC (31) /* ADCTSC's bits */ #define WAIT_PEN_DOWN (0 8) #define WAIT_PEN_UP (1 8) #define YM_ENABLE (1 7) #define YM_DISABLE (0 7) #define YP
[单片机]
S3C2440中断代码的深层次分析
在前一段时间分析了ARM异常处理机制的处理方式,分析了在异常产生以后CPU自动完成的相关处理以及程序员应该完成的基本操作。着重分析了异常代码的返回地址分析已经采用通用代码处理各种异常的可能性。 异常处理的基本过程如下:异常产生(在指令的临界中检测CPU的状态,一般实质在这条指令被执行完成,但是还没有执行下一条指令之前检测) 保存状态寄存器,切换状态寄存器,保存LR=PC-4,强制PC跳转到对应异常向量(以上的过程都是CPU自动完成) 》调整返回地址,在栈中保存寄存器,便于恢复寄存器的值 》异常处理函数 》退出异常。 中断处理机制的两种形式: 1、 采用在中断向量中存储简单的跳转指令,跳转到异常处理函数中,但是这种方式存在的缺点
[单片机]
ARM历程四-LCD
离上次真正写历程已经有10天的时间了。国庆嘛,自己给自己放了几天假——耍耍游戏下下棋什么的。 其实这次写触屏的驱动和对ARM中中断的过程的了解也花了不少时间和脑力。 我就简单分享一下CPU执行某个中断的条件吧,也是我自己的理解,如果有错还请大家指正(以IRQ中断为例吧):   在程序状态寄存器中(CPSR寄存器)i 位为IRQ中断禁止位,若这一位置1那么所有的IRQ中断都不会被CPU响应,如果这一位被清0,CPU也不一定会响应某一个或某些中断(就像是一个总开关)。所以,要想让CPU执行IRQ中断,CPRS中的i位必须要清0!   在2440的CPU中还有两个中断屏蔽寄存器:INTMSK(中断屏蔽寄存器)和IN
[单片机]
STM32 AWU RTC闹钟从停机模式唤醒CPU
网上找不到范例 自已对着PDF整了半天!! void RTC_EXTI_INITIAL(FunctionalState interrupt_en_or_dis) { NVIC_InitTypeDef NVIC_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; //------------EXTI 配置 ------------------- EXTI_InitStructure.EXTI_Line = EXTI_Line17; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EX
[单片机]
ARM寄存器的操作方法
#define GPIOCOUT *((volatile unsigned int *)0xc001c000) #define GPIOCOUTENB *((volatile unsigned int *)0xc001c004) #define GPIOCALTFN0 *((volatile unsigned int *)0xc001c020) void delay(unsigned int); void led_test(void) { /*配置选择GPIOC12管脚的功能1*/ GPIOCALTFN0 &= ~(3 24);//清0 bit24 25 GPIOCALTFN0 |= (1 24);//置1
[单片机]
基于S3C2440的DM9000网卡驱动的移植
0 引言   以太网(Ethernet)是一种计算机局域网组网技术。在局域网中,多个节点是共享传输介质的,这就必须由某种机制来决定某个时刻哪个设备占用传输介质来传输数据,因此,局域网的链路层要有介质访问控制的功能,即数据链路层分为逻辑链路控制LLC子层和介质访问控制MAC子层 。   本文主要研究基于S3C2440的DM9000网卡驱动的移植。网络对于嵌入式系统来说是必不可少的,但是S3C2440没有集成以太网接口,所以要想使S3C2440具备以太网的功能,就必须扩展网卡接口。本文选择外接DM9000,使其可以与以太网相连接,并完成DM9000网卡驱动的移植。 1 Linux网络驱动层次   Linux网络驱动可以划分为4层,
[单片机]
ARM9(S3C2440)的LCD显示——理论知识
今天和大家一起讨论一下S3C2440的LCD显示的问题,希望大家能够多多指教,我说的不对的地方希望大家及时帮我改正,以使我可以增长知识,才能不至于给别人的学习带来不便,呵呵 下面先看一下我从别人那转过来的一篇文章,我觉得很有用,看完之后我再说一下自己对这一块的了解,也可以先看看我的理解(下面红字标出)再看开始的这篇文章,因为我说的更通俗,O( _ )O哈哈~。 1. LCD工作的硬件需求: 要使一块LCD正常的显示文字或图像,不仅需要LCD驱动器,而且还需要相应的LCD控制器。在通常情况下,生产厂商把LCD驱动器会以COF/COG的形式与LCD玻璃基板制作在一起,而LCD控制器则是由外部的电路来实现,现在很多
[单片机]
<font color='red'>ARM</font>9(<font color='red'>S3C2440</font>)的LCD显示——理论知识

推荐帖子

有做过DVD产品的吗?
有做过DVD产品的吗?有做过DVD产品的吗?
9043075 嵌入式系统
你点过这样的电源输出纹波吗?象有调制信号一样,如何处理啊?
第一个波形,有一个低频干扰。没有干扰,电源的纹波会更小的。这个就更差了,已不止一个干扰低频信号,好几个了。你点过这样的电源输出纹波吗?象有调制信号一样,如何处理啊?粉色显示,这个颜色很少见26mV的VP-P你还有什么不满意的。。。。这种情况,只有想办法减小纹波谐波比较多,可以增加滤波电路。纹波只能说尽量减小,不可能完全消除,如果楼主的测量方法没问题的话,个人感觉电源能做到这个纹波已经相当不错了,你还有什么不满意的?如果你感觉还是不满意的话,可以考虑用增加
jadystone 模拟与混合信号
请教有没有“STM32”入门更通俗更基础的介绍?
看到《带你零起点入门STM32》,开班就唱弄得一头雾水,看来我的起点是负的了!有没有学习STM32所需的知识,工具软件等等的常识性梗概介绍?请教有没有“STM32”入门更通俗更基础的介绍?这个选其中可以接受的看看:https://bbs.eeworld.com.cn/thread-75235-1-1.html有问题可以随时交流回复楼主liweiliang的帖子第一感觉:浩如烟海啊!先硬着头皮看一看!多谢soso!第一感觉:浩如烟海啊!
liweiliang stm32/stm8
角度传感器
本帖最后由paulhyde于2014-9-1509:08编辑角度传感器n1000060谁有程序或者资料?角度传感器本帖最后由paulhyde于2014-9-1509:08编辑上网买模块。。叫卖家给程序吧~~本帖最后由paulhyde于2014-9-1509:08编辑我也想要哦啊!!!!!!!!!!!!!本帖最后由paulhyde于2014-9-1509:08编辑有程序的童鞋贡献下吧···本帖
sonic1007 电子竞赛
请高手指点,如何写单430片机的收发程序
我用的是TI公司的MSP430G2553,用两个相同的单片机通过串口通信,分别连接在两台电脑上,一个写发送的程序,一个写接收的程序,接收的是一个字符串,最好在接收数据时能让LED灯闪烁,哪位高手能把以前调试成功的程序传给我啊,谢谢啦请高手指点,如何写单430片机的收发程序
happyfu87 微控制器 MCU
开发wince应用程序大家用什么工具???
开发wince应用程序大家用什么工具???EVC还是VC2005或者C#开发wince应用程序大家用什么工具???VS2005下的C#。我还在用EVC不过VS2005也不错``EVC跟VS2005VS2005,EVC我想请教一下,VS2005下的VC和EVC哪个更适合开发wince,C#开发启动速度和对硬件要求有点高我个人认为不适合开发WinceVS2005开发Wince下的运行程序,当然比较好,它支持跨平台使用。为X86开发的应用程序同样可以在ARM上运行,EV
xiangshui WindowsCE
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved