【3-2-1/2】ARM架构简明教程
前言
本节简单讲解一下ARM架构
一、ARM架构
1.1 RISC
ARM芯片属于精简指令集计算机(RISC:Reduced Instruction Set Computing),它所用的指令比较简单,有如下特点:
1、对内存只有读写指令
2、对数据的运算是在CPU内部实现
3、使用RISC指令的CPU复杂度小一点,易于设计
首先,我们看一下上一节我们是怎么编写的程序,我们去创建一个任务的时候,为什么要指定栈?
在这里的128会去指定栈的大小,这里的xTaskCreate函数会去分配栈,理解栈之后,才能深入理解RTOS的本质,要想去理解栈,又得对处理器的架构有所了解。
如果你组装过电脑的话,会组装一个主板,然后去买CPU,把CPU插到主板上去,然后还会去买内存条,把内存条也插到主板上去。然后还会去买硬盘,通过各种接线接上去。对于我们的一台电脑,这些主板,CPU,内存条,硬盘等,它们是离散的,他们通过主板来组装到一起,
那么对于我们的单片机来说,它被称为SOC,System On Chip,在一个芯片上具有一个比较完整的或者称为相对完整的系统。
就比如说这是我们的一款ARM芯片,里面就已经集成了CPU,内存,类比于电脑上的硬盘,在单片机中这是Flash,Flash上面用来保存我们的程序,CPU用来运行程序,程序运行的过程中会用到内存,这个内存有什么功能呢?
注意了,内存没有计算功能。我们访问内存的时候,要么把数据写进去,要么把数据读出来,所有的计算都是在CPU内部执行的。就比如说
上图所示,CPU对内存只有读和写两条指令,对于数据的运算是在CPU内部执行的,使用精简指令集,这个CPU的复杂度小一点,易于设计。上图所示为a = a*b 在内存和CPU之间的操作步骤,共有4步
1.2 提出问题
那么你要把a的值从内存中读入CPU,那CPU里面就有保存这个值的位置呀,CPU里面用什么来保存变量a的值呢?另外CPU里面用什么来保存b的值?CPU里面用什么来保存a*b这个计算之后的新值呢?咱们又得深入看看CPU的内部结构
1.3 CPU内部寄存器
无论是cortex-M3/M4,还是M7
CPU内部都有R0,R1,......,R15寄存器;它们可以用来“暂存”数据
对于R13、R14、R15,还另有用途
R13:别名SP(Stack Pointer),栈指针
R14:别名LR(Link Register),用来保存返回地址
R15:别名PC(Program Counter),程序计数器,表示当前指令地址,写入新值即可跳转
当我们要计算a = a +1 b 时,会涉及到4条汇编指令,汇编指令就是我们所谓的程序嘛,这些程序存在Flash上(上图右下角的代码) a 和 b 的具体数值保存在内存里(上图右上角的数据)。CPU(上图左边)从Flash得到指令然后执行。
就比如说CPU得到了第一条汇编指令 LDR R0,[a] 这条指令要求CPU去读取变量a ,把内存上变量a的值读入CPU 保存在哪里?这条指令是将变量a的值保存到R0里面,在下一条指令里,把变量b的值保存进R1 ,然后计算的时候把新值继续保存进R0 ,最后一条指令,把R0的值写入内存中去
我们现在知道了CPU内部有计算单元ALU,这个计算呢需要用到寄存器,这些寄存器的值哪来的?你可以去执行读内存的指令,把内存里面的值读进寄存器里面来。咱们现在重点说的是,在CPU内部有寄存器,寄存器可以起一些保存的作用。
这些寄存器除了起到保存的作用之外,有一些寄存器它还有特殊的功能,
R13一般来说用来保存栈的地址,R14一般来说用来保存返回地址(就比如说函数A()里面有函数B(),调