赞
踩
这一段时间是真滴忙。
通过这一节,把整个CPU的主要资源给罗列一下,然后描述一下它们的用途,希望可以通过这些理解ARM是怎么跑的。
先上图,希望接下来几节学习完成能把这张图搞懂一些(注:这张图不是目的,只是用来参考,因为讲的内容并不是围绕这张图来的)。
处理器状态
ARM7TDMI(-S)处理器内核使用ARM v4T结构实现,该结构包含32位ARM指令集和16位Thumb指令集。因此,ARM7TDMI(-S)处理器有两种操作状态:
ARM状态 执行的是32位的ARM指令;
Thumb状态 执行的是16位的Thumb指令。
为什么要分为这两种状态呢?简单来说就是16位的节省空间啊,但是16位的又不够用啊。
程序执行时,两种状态之间是可以切换的,状态之间的切换不会影响处理器的模式和寄存器内容等。但是,所有的异常(比如中断)处理都是在ARM状态中执行的,在异常处理完成时,又会回到之前的状态。这里不说Thumb状态,精力有限,我目前理解的是Thumb只是比ARM状态下少了很多资源。
处理器模式
上面说处理器状态时有说道处理器模式和异常,这一段看完就知道什么意思了。
ARM体系结构分为7中处理器模式,ARM7TDMI(-S)可以完全支持,如下表:
除了用户模式外,其它均为特权模式,除了用户模式不能直接切换到其它模式外,其它模式可以自由切换。
那什么是异常模式呢?除了用户和系统模式之外的其它5中模式全部都位异常模式。当发生相应的异常时,可以进入到相应的模式。
系统模式也不能由异常模式进入,并且使用与用户模式完全相同的寄存器,但是它是特权模式,有用户模式没有的权限。它有什么用呢?推荐一个别人的解释:https://blog.csdn.net/zzsfqiuyigui/article/details/23346289。
寄存器
这里说的寄存器是CPU内部的寄存器,不要搞混了。
ARM7TDMI(-S)处理器中对用户可见的寄存器有37个,其中32个通用寄存器,6个状态寄存器。
通用寄存器:R0-R12、R8_fiq-R12_fiq、R13、R13_svc、R13_abt、R13_und、R13_irq、R13_fiq、R14、R14_svc、R14_abt、R14_und、R14_irq、R14_fiq、R15。可以看到,我把R13、14、15都单独列出来了,因为他们一般在习惯上都被用作特殊的用途,什么用途呢?后面会有解释。
状态寄存器:CSPR、SPSR_svc、SPSR_abt、SPSR_und、SPSR_irq、SPSR_fiq。
从上表可以更清晰的看到,R0-R7为未分组的寄存器,在任何模式下,使用R0-R7都是同一个寄存器。R8-R14为分组的寄存器,在不同的模式下,访问的可能是不同的物理寄存器,比如,我在中断模式下和快中断模式下访问R13访问到的寄存器分别为R13_irq和R13_fiq。
好,R13、14、15有什么特殊的用途呢?
R13:通常会被用作堆栈指针,在用户应用程序的初始化部分,一般都要初始化每种模式下的R13,使其指向该运行模式的栈空间。这样,当程序的运行进入异常模式时,可以将需要保护的寄存器放入R13所指向的堆栈,而当程序从异常模式返回时,则从对应的堆栈中恢复,采用这种方式可以保证异常发生后程序的正常执行。
R14:就是保存程序返回地址用的。什么时候回用到返回地址呢?有两种情况,第一种是程序跳转指令跳转时,第二种是发生异常进行模式切换时。
R15:PC,什么是PC,就是你的程序计数器啊,就是指令地址啊(注意偏移);
CSPR:程序状态寄存器,注意是程序状态。
SPSR:程序状态保存寄存器,在进入异常时,对应的程序状态保存寄存器回保存当前程序状态寄存器的值,当异常处理完,退出时,又会将SPSR中的值再次写入到CSPR,以达到恢复现场的作用。
紧接着就说说程序状态寄存器都包含哪些状态,希望这一节读完你会有一种豁然开朗的感觉
CSPR是一个32位的寄存器,它包含:
4个条件代码标志位
一个中断标志位和一个快中断标志位
一个位用来指示当前指令是ARM状态还是Thumb状态
5个位用来控制处理器的模式
唉,,,烦,想画个图工具没有激活,穷病。接着说。
条件代码标志:指令是可以选择是否影响条件代码标志的,如果影响标志,则会根据计算结果来选择各个标志位的状态,然后指令可以根据条件标志位的结果来选择怎么执行程序,所以啊,C里面的if,在这里离不开条件标志位。
中断标志位是用来选择开启或者关闭中断的。
指令状态标志位是用来指示程序是在ARM状态还是Thumb状态,是只读的。
处理器模式控制位,通过写这五个标志位可以来选择进入哪个处理器模式,前面讲过,一共7中处理器模式。
剩下的都是保留位。
对了,Thumb状态中可以用的资源是要比ARM状态少很多的,具体少了哪些东西,如果感兴趣再去细究一下。前面只针对ARM状态。
其实说到这里,对ARM是怎么跑起来的应该有个大概的理解了,如果还没有理解,没有关系,后面再说说各个异常模式,对ARM指令集做一些介绍,然后举几个例子,就全都明白了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。