【专题1:电子工程师 之 软件】 之 【6.寄存器】

希望本是无所谓有,无所谓无的,这正如脚下的路,其实地上本没有路,走的人多了,也便成了路
原创不易,文章会持续更新
文章会同步到作者个人公众号上,感谢扫码关注

【专题1:电子工程师 之 软件】 之 【6.寄存器】

所有文章总目录:【嵌入式 无人机 电机控制】
原创视频总目录:【嵌入式 无人机 电机控制】

1.什么是寄存器

寄存器就是CPU内部硬件对外的接口,编程控制硬件的实质就是往这个要被控制的外设的寄存器中写入相应的数据。而具体要往寄存器中写入什么,就得看cpu数据手册

寄存器分为两种,一种是在CPU内部的通用寄存器(在arm结构的cpu中,通用寄存器有37个),另一种是在外设中的特殊功能寄存器。要注意,因为arm是内存和IO统一编址的,操作内存和操作特殊功能寄存器的方式是一样的;一个地址到底是内存还是某个外设的特殊功能寄存器,这就得查看数据手册才能确定。

ARM共有37个通用寄存器,各种模式下,有些寄存器是共用的,但在一种确定的模式下只能看到18个(user模式下只有17个)。一定要搞清楚,是谁和谁共用:我们把user模式看成是正常模式或基准模式,模式的切换是指各个模式和user模式的切换,所以这里的共用指的就是和user模式共用。

除了FIQ模式,其他模式寄存器的特点:r13、r14、spsr这三个寄存器每种模式下都有,其他的寄存器都和用户模式共用。在当前模式下,只有当前模式下的寄存器可见,只能够操作当前模式下的寄存器,其他模式下的寄存器是不可见的,也就是不可操作的。

注意:
user和sys模式共用一套寄存器,只不过sys模式是特权模式,也就是在这种模式下你能操作的权限更多。而user位普通模式,user模式下没有spsr寄存器。

2.各个寄存器的含义(图解)

【专题1:电子工程师 之 软件】 之 【6.寄存器】
(1)cpsr:CPU状态寄存器,这个寄存器记录了当前模式下的CPU状态。条件位的值来自ALU的计算结果(有些指令的执行结果会改变这些条件位),而和具体的指令没有绝对关系。影响指令执行的代码是上一句代码执行的结果。若当前这句指令加了条件前缀时,这条指令是否要执行,就需要看上一句指令执行结果是否满足条件。

(2)r13/sp:堆栈指针寄存器,每个模式都有自己的堆栈,因为堆栈是C语言运行的环境,每种模式下都要使用C语言,所以必须要有自己模式的堆栈。当模式之间的切换时,r13会保存当前模式的堆栈指针。因为很多寄存器在各个模式下是共用,为了不冲掉这些寄存器,所以在切换模式时,需要将当前模式那些共用的寄存器保存到堆栈中,然后再进行切换。

(3)r14/lr:用来保存返回地址,当进入异常或是调用子函数时,都要先将下一条指令的地址保存到这里,等到返回时,直接再将该寄存器的值放到PC寄存器中,这样程序就能接着之前的位置执行后面的程序了。因为在每一种模式下的处理代码中都有可能调用函数,所以每一种模式一个单核的cpu只有一个pc寄存器,所有模式都是共用的。程序跑飞了,只的就是PC寄存器中的值不对了。

(4)spsr:用来保存cpsr的值,当切换模式时,cpu硬件会自动当前模式下cpsr的值放到要切换的模式的spsr中,当返回时,spsr的值又放回到cpsr中。

注意:
cpsr只有一个;要注意是将cpsr的值保存到哪里。例如,当前模式是user,当进入中断时,要先保存现场,也就是将user模式下的cpsr(这个寄存器只有一个)保存到中断模式下的spsr中,当中断返回时,会将中断模式下的spsr的值放回到user模式下的cpsr中。

3.CPSR(CPU状态寄存器)各位的含义

【专题1:电子工程师 之 软件】 之 【6.寄存器】