1 PC和MCU场景程序执行时的区别
- PC场景时CPU只能访问ram,映射的整个地址空间都是ram和其他设备的IO接口,程序执行的时候需要从存储器拷贝到ram里,然后CPU再从ram进行取指令执行指令等操作;
- MCU场景CPU可以同时访问ram和flash,映射的地址空间一部分是ram一部分是flash一部分是其余外设,程序执行的时候不需要从存储器拷贝到ram里,CPU直接从flash进行取指令执行指令等操作,但是flash的写操作需要先擦后写,寿命有限而且速度缓慢,所以对于数据的操作需要在ram中进行(有初值的全局变量初值存在flash中,芯片上电启动时由启动代码把初值从 Flash 拷到 RAM,就是 .data 段的初始化,只读数据const常量,字符串的字面量这种依然存放在flash中),CPU执行的时候对数据的操作访问ram的地址,对代码的读取访问flash的地址。
2 程序执行局部性原理
程序执行局部性原理(Principle of Locality)是计算机体系结构中的经验规律之一,它表明程序在某个时间段内,只会反复访问一小部分地址,而不是均匀地访问整个地址空间。一是时间局部性,刚访问过的地址,很快还会再被访问。比如一个循环体里的指令,会被一遍遍反复取指执行;循环变量 i 这种常用变量会被反复读写。二是空间局部性,访问过某个地址后,它附近的地址很快也会被访问。这是MCU缓存存在的理论基础,CPU运行太快、内存反应相对太慢,中间夹一个又小又快的缓存。当访问一个地址时,先在cache中查找,有的话立即从cache中读取到CPU,否则从主存中去读取该数据,同时把它周围一整块一起搬进来(空间局部性,预判你接下来要读隔壁的数据)。只要程序行为符合局部性,大多数访问就能命中缓存,整体速度接近"小而快",而不是被"大而慢"拖累。
3 STM32的芯片结构
STM32基于ARM Cortex-M内核,内部采用改良的哈佛架构(Modified Harvard Architecture)。
物理上:指令总线(I-Bus)和数据总线(D-Bus)是分离的,CPU可以同时从Flash取指令和从RAM读写数据,这与传统冯·诺依曼架构(共享同一条总线)不同。
逻辑上:Flash和RAM被映射到统一的线性地址空间(例如STM32F103的Flash在0x08000000,SRAM在0x20000000),程序员看到的是一个连续的地址范围,这一点又类似于冯·诺依曼架构。
因此,STM32既不是纯粹的哈佛架构(地址空间独立),也不是纯粹的冯·诺依曼架构(总线不分离),而是结合了两者优点的改良哈佛架构。
4 CPU的工作步骤
取指:从内存(或Flash)中取出下一条要执行的指令,并将其送入CPU内部的指令寄存器(IR),取指结束后PC指针就会立即更新、
译码:分析指令寄存器中的机器码,确定这条指令要执行什么操作,以及操作数在哪里。
执行:真正完成指令所规定的运算或操作。
存结果:将执行阶段产生的结果写回到目标寄存器或内存中。