一、 MPU、MCU、SoC、Application Processors的概念
- CPU:中央处理单元(处理器);
- MCU:微小控制单元;
- MPU:微小处理单元(处理器);
- SOC:片上系统;
- AP:应用处理器(Application Processors);
简言之:电脑级别(CPU、Window)、单片机系列(MCU、RTOS)、手机与Cortex-A 系列(Application Processors、Linux)。
二、 哈弗架构与冯诺伊曼架构
- 哈佛架构:可同时读取指令和数据;
- 冯诺依曼架构:不可同时读取;
ARM公司的芯片,ARM7及之前的芯片是冯诺伊曼架构,ARM7之后使用“改进的哈弗架构”。
- 在“改进的哈弗架构”里,指令和数据在外部存储器中混合存放;CPU运行时,从指令cache中获得指令,从数据cache中读写数据。
- cache:高速缓冲存储器
三、 指令集:CISC和RISC
- CISC:Complex Instruction Set Computers,复杂指令集计算集(Inter、AMD)
- RISC:Reduced Instruction Set Computers,精减指令集计算集(ARM、IBM Power)
简言之:RISC是流水线操作(读、处理、写)、CISC是微程序(多条微指令、)
参考:
- 术语:
- Execute state: 执行状态
- (1)、
- ARMv8 架构与指令集.学习笔记 - 沉思 - CSDN博客.html
- ARMv8 架构与指令集.学习笔记_sbfiz指令_你必须十分努力,才能看起来毫不费力的博客-CSDN博客
- AArch32和AArch64之间的切换只能通过发生异常或者系统Reset来实现.(A32 -> T32之间是通过BX指令切换的)
- (2)、
- 一篇文章读懂Armv8 AArch64 - 简书.html
- 一篇文章读懂Armv8 AArch64 - 简书
- (3)、
- CISC和RISC的区别
- CISC和RISC的区别_risc和cisc的区别_gongxsh00的博客-CSDN博客
-
四、嵌入式系统硬件组成
- 嵌入式系统:支持多种设备启动
- XIP:eXecute In Place,本地执行。可以不用将代码拷贝到内存里,而直接在代码的存储空间运行;
- XIP devices: Devices which are directly addressable by CPU;
-
ARM板子支持多种启动方式:XIP设备启动、非XIP设备启动等等。比如:Nor Flash、SD卡、SPI Flash, 甚至支持UART、USB、网卡启动。这些设备中,很多都不是XIP设备;
-
CPU可以从非XIP设备启动:上电后,CPU运行的第一条指令、第一个程序,位于片内ROM中,它是XIP设备。SO,处理流程是:执行必要的初始化(设置时钟、设置内存)、再从“非XIP设备”中把程序读到内存、最后启动上程序(读到哪里由你决定:片内RAM或是片外的DDR);
-
ROM程序要做的事情:(这里其实很多疑问,01、不急着初始化;02、存在的 bin 文件(读、写、转换);03、这些问题的解决会在以后的篇章有所解决)
- 初始化硬件
- 初始化时钟,提高CPU、外设速度
- 初始化内存:DDR需要初始化才能使用
- 初始化其他硬件:看门狗、SD卡
- 从外设吧程复制到内存
- 选择某个设备
- 源、目的、长度(头部信息:指定了内存地址和长度)
- 程序在SD卡存储:原始二进制文件(raw bin)或者作为一个文件保存在分区里
五、理解升华
- 要调用C函数必须先设置栈,一切的一切都设置到读写内存,栈的存在为了记录数据、地址
- Program counter,程序计数器,表示程序执行到了哪里(记录下一条程序的地址)
- Flash:存储代码,保存的是机器码
- 在M3的异常向量表,也就是Flash的起点,也就是0x08000000地址处,存放异常向量表
- Reset Handle:第一条指令的位置(地址),设置SP指针,向下增长的!!!
- 我们编好的程序烧写在flash上
- 上电后CPU从Flash上读取指令、运行指令
- 从flash哪里读,由异常向量表决定,异常向量表保存在Flash的起始位置
- 异常向量表的第2个数据,就是程序启动后执行的第一条指令的位置
-
从PC指示的位置读,PC的初始值是什么?这由芯片决定
-
异常向量的位置,在芯片设计时,就定死了,Flash的开头数据是:0x00000000 0x080000A5 所以,CPU从0地址得到异常向量表后,从向量表的第2个数据得到0x080000A5,就从0x080000A4开始运行(意思是说PC = 0x080000A4),看不到内部的实现(以后再研究!!!(这由架构决定的,应该看不到!!!))
-
M3物理上有两个SP寄存器:MSP, PSP。不同CPU模式下使用SP这个名字可以访问到MSP或PSP
-
CPU一上电,从地址0处读到异常向量表,F103的0地址和0x08000000都指向Flash
-
1.CPU从0地址读到数据:
0x00000000
0x080000A5
2.CPU使用第1个数据0x0000000赋给SP
3.CPU使用第2个数据0x080000A4赋给PC
4.CPU从0x080000A4执行机器码 0xF8DFD004, 是的SP等于0x20010000
5.PC寄存器执行下一个位置0x080000A8(后加1,这跟LDR那些特殊指令有联系吧)
6.CPU从0x080000A8执行机器码,调转执行main函数
-
在arm9、cortex A7架构里:
1.如果直接给PC赋值addr,程序就跳转到addr去取指令、运行
2.如果程序顺序执行,PC就是下下一条执行的指令的地址,注意:是下下条指令,不是下条指令
-
ARM指令效率高,但是占据空间大,Thumb指令占据空间小,效率稍低,在单片机领域,都是thumb指令,也就是thumb2指令;
-
引出地址总线、数据总线:一系列信号线,nWE(写使能),nOE(读使能,很奇怪(Output)),读、写多少字节,由多少条信号线决定的;
-
系统总线 = 地址总线、数据总线、读信号、写信号、字节使能信号、片选信号
-
CPU不知道要读写哪一个设备(内存控制器)
-
1.CPU发出的地址进入内存控制器
2.内存控制器根据地址的范围来驱动某一个片选引脚
3.这个片选引脚连接到某一个模块去
-
奇不奇怪?MCU与8080LCD连接竟然只接了一条地址总线,也就是说这个LCD,它里面只有两个地址,LCD跟内存不一样:我们发出不同的地址,用来访问内存里不同的空间,我们去操作这个LCD的时候:地址线等于0的时候从数据总线上表示传输的命令,比如用来控制LCD的开关,地址线等于一的时候,表示数据总线上传输的是“数据”,所以他用一条地址线就足够了
-
对于内存:写入什么数据再读出来仍然是什么数据
对与GPIO:写有某些数据,可能是用来
再去读同一个地址,得到了数据可能就不一样了:得到的数据反映的是引脚的当前电平
对于RAM: CPU发出地址和数据,导致内存的某个空间被直接写入数据
对于Flash:能够这样简单的写数据吗?
如果flash也可以这样简单的写数据的话,你的程序很容易就把你的flash全都给破坏了
所以:Flash能够像内存一样读出数据,要写数据到flash的话不能够直接
-
1.CPU是个大爷
2.CPU要执行指令,是发出addr,得到数据,这个数据就是指令
3.CPU发出的地址addr,可以从flash上读到数据,这个数据就是指令,然后执行
4.CPU发出的地址addr,到达I2C控制器时,只能够用来读写里面的寄存器
他无法直接从I2C控制器的寄存器里返回存储芯片的数据
所以: CPU可以直接执行图中flash的程序
-
但是不可以直接执行I2C存储芯片里面的程序
怎样才可以运行I2C存储芯片里面的程序?注意,我没有说“直接”
-
Flash是有很多种接口
有些flash的接口就是内存接口:不需要flash控制器
-
Flash有很多种类型,内存类接口的flash可以像内存一样读任意地址
Flash型号:nor flash内存接口、nand flash、I2C flash、SPI flash、EMMC flash等等
-
对于我只会记住核心: CPU能否直接访问到。(直接与间接,接口类型)
-
器件地址总线和CPU地址总线宽度不一致的时候应该怎么连接呢?由FSMC来解决:CPU想读32位数据,FSMC内部读2次,把2个16的数据组合位32位
-
硬件决定的,向量表的第1个4字,就是赋给SP;第2个4字赋给PC