目录
1.CPU的基本结构和运行机制
1.1 ALU
1.2 Register Files
1.3 Control Unit
2.堆栈的概念
3.ARM体系结构
3.1 ARM的发展过程
3.2 ARM Cortex M Register Files(Programmer's Model)
4.中断
4.1 中断的概念和机制
4.2 中断的允许和禁止、现场保护
4.3 中断子程序和函数调用的区别
4.4 中断向量表
4.5 中断优先级和中断嵌套
5.复位、时钟、存储器、总线
5.1 复位
5.2 时钟
5.3 存储器
5.4 总线、外设
6.小结
一个基本的MCU的结构图如下所示。主要由处理器CPU,存储器Memory,总线Bus和外设Peripheral组成。
CPU主要包含逻辑运算单元ALU,寄存器组register files,控制单元control unit;有些CPU还有浮点运算单元,MMU,Cache Management。一个典型的CPU如下图所示。
ALU由四个要素组成:操作数、运算、运算结果和标志位。运算结果和标志位往哪里存呢?寄存器。存放标志位的寄存器有个特殊的名字叫程序状态寄存器(Program Status Register,PSR;有的叫条件码寄存器Condition Code Register,CCR)。PSR的每一位称为状态位,且代表的含义不同,比如溢出标志位等。每执行一条指令,相应的状态位都会进行更新。每条指令影响的状态位都是不一样的,需要查芯片手册。
寄存器用于临时保存和获取操作数;任何CPU都包含若干个通用/专用寄存器;寄存器的数目和宽度是衡量CPU的重要指标。ALU的操作数和运算结果可以来自寄存器或者数据存储器(对个人PC而言是内存或者硬盘,对MCU而言,是CPU以外的存储部分)
那是什么让上面的一切自动的运行呢?-Control Unit。控制单元的主要作用:1、指令解析:分析该指令需要执行何种操作;2、数据流向:确定该指令用到的操作数来源和产生结果的去向。简言之就是,控制单元将一条指令解析为对ALU,Register,Memory的控制,来明确做什么运算,数据从哪来,到哪去。
那又一个问题来了,控制单元上的指令是从哪里来的?程序是指令的有序集合,指令和数据一样,也是保存在存储器当中,这些指令序列“依次”进入CPU执行。下一条待执行的指令地址保存在PC寄存器(Program Counter,程序计数器)中。如果发生函数调用或者中断,返回的地址从何而来呢?这就要引出另一个概念:堆栈。
如何保存返回地址呢?一开始想到的办法就是设计返回地址寄存器,但是如果发生嵌套调用的话,会出现寄存器不够用。于是设计了一种机制:栈(能够保持数据的顺序,后入先出,覆盖并不是销毁)。那栈都有哪些用途呢?
堆栈指针寄存器(Stack Point,SP)
堆栈溢出。有时候,电脑出现的蓝屏可能是堆栈溢出或者是越界访问,PC指向了存储器一段莫名其妙的空间,并试图取出值来运行,程序跑飞了。对操作系统而言,可能认为是越界访问,嵌入式系统可能认为是非法指令,无法解释,程序就复位了。
学习C语言感觉不到堆栈,因为C语言的函数调用,参数传递等都是编译器帮你隐性地使用了堆栈。用会骗语言做中断编程时会接触到这个概念。
写道这里,再回头看看CPU的结构,自己在脑子里过一遍,基本上就能知道一段程序是怎么被CPU执行的了!
CPU一直在发展,从8位到16位、32位(ARM Cortex M,PowerPC,ColdFire)、64位;时钟的频率也越来越高,从Hz到MHz、GHz,频率越高,执行每条指令的时间就越短。学习CPU重点关注两点:1、CPU由哪些寄存器是编程的对象;2、ALU对应的指令集,即有哪些指令,代表的含义是什么
ARM公司只做CPU设计,采用出售IP的方式运营,半导体制造商无需自己设计CPU。
1、主程序中设置号中断发生的条件(Gobal IE,IF)
2、按下键,电路以信号的形式通知CPU,中断发生了
3、CPU自动调用该中断服务子程序。
需要说明的是,中断总开关打开后,它可能在任意一个时间点上调用。
现场保护:考虑到效率,压有限个寄存器入栈,如果编程人员用到更多,可以自己手动压栈。
函数调用:返回地址
中断子程序:返回地址和之前压入栈的寄存器的值。
当一个中断发生时,CPU如何找到中断服务子程序并执行呢?--中断向量表。
1G(B) = 1024M(B);1M = 1024KB;1KB=1024B;1Byte = 8bit;
MCU上电过程:给SP指针赋值,将开发工具生成的入口函数代码第一条指令的地址给PC,最后一条指令Jump to main函数。