• 形态各异的嵌入式系统有哪部分组成呢?一句话引出整个嵌入式系统: 支持多种设备启动
    • 为应对复杂的SPI协议,CPU内部有SPI控制器
    • 对于Nor Flash,CPU可以直接访问,所以CPU内部不需要NOR FLASH控制器;这样的设备称为XIP设备( eXecute In Place)

      XIP eXecute In Place   eXecute In Place,即芯片内执行,指应用程序可以直接在flash闪存内运行,不必再把代码读到系统RAM中。flash内执行是指nor flash 不需要初始化,可以直接在flash内执行代码。但往往只执行部分代码,比如初始化RAM. (注:片内执行不是说程序在存储器内执行哦,CPU的基本功能就是取指、译码和执行。norflash能在芯片内执行,就是指CPU的取指模块能够直接从norflash中把指令取出来,供后面的译码和执行模块使用)

    • 问题引出:

      a. 系统支持SPI FLASH启动. 这意味着可以运行SPI FLASH上的代码
      the system can boot from spi flash, so it needs to run code on spi flash
      b. 但是SPI FLASH不是XIP设备, cpu无法直接执行里面的代码
      but the spi flash isn’t xip device, cpu can’t run code on spi flash directly
      问题来了, CPU如何执行SPI FLASH上的代码? 一上电, CPU执行的第1个程序、第1条指令在哪里?
      how can the cpu run the code on spi flash ? where is the first code run by cpu, when power up ?

    • 系统一上电,CPU就一定要执行某些程序,从哪里开始执行呢?(程序放在哪里?)

    • 一上电,CPU执行的第一个程序、第一条指令必定位于某一个XIP设备上,一般是片内的ROM
    • ARM板子支持多种启动方式:XIP设备启动、非XIP设备启动等等。 比如:Nor Flash、SD卡、SPI Flash, 甚至支持UART、USB、网卡启动。这些设备中,很多都不是XIP设备。

      问:既然CPU无法直接运行非XIP设备的代码,为何可以从非XIP设备启动? 答:上电后,CPU运行的第1条指令、第1个程序,位于片内ROM中,它是XIP设备。

      1. 这个程序会执行必要的初始化,
      2. 比如设置时钟、设置内存;

      再从”非XIP设备”中把程序读到内存

      1. 最后启动这上程序。
    • 对于片内ROM,CPU指令集可以直接访问;片内ROM上的程序可以帮助CPU去运行SPI FLASH、SD Card等设备上的程序

    • 片内ROM的程序要支持SPI flash、SD Card等不同设备启动,显然是比较复杂的,一般用C语言编写
    • 片内ROM程序肯定有变量,变量可读可写,肯定不能直接在ROM上操作,那么要把变量放在什么地方呢? 放入片内RAM中
    • 片内RAM太贵了,一般做得很小,只有几KB、几百KB的量级;所以一般还要外接更大的SDRAM内存来存储,因此CPU内部一般也有对应的SDRAM控制器
    • 对于复杂的外设,芯片内部一般都有对应的控制器controller
    • CPU发出的地址不能直接到达复杂的外设的地址空间,一般只能到达对应的控制器上(对应寄存器)
    • 那么,CPU发出的地址到底会到达哪个外设控制器呢?这中间还有一个内存控制器,它把CPU发出的地址分发到对应的控制器/ROM/RAM上
    • image.png
    • 可以看出,芯片内部不仅有CPU,还有各种各样的控制器,这称为SoC片上系统
    • 以SoC设计出来的产品,体积更小、功耗更低,硬件的设计难度更加降低了
    • 在PC机主板中,可以看出每个模块都有其对应的控制芯片焊接在主板上,不是SoC设计

    关于嵌入式系统启动的几个问题:

    主芯片内部有ROM,ROM程序协助从非XIP设备启动;以SD卡启动为例。 CPU只能运行XIP设备中的程序,ROM程序做什么? 显然:ROM需要把SD卡上的程序读到内存里(片内RAM或是片外的DDR)

    • ROM程序要做什么事?
      • 初始化硬件
      • 初始化时钟,提高CPU、外设速度
      • 初始化内存:DDR需要初始化才能使用
      • 初始化其他硬件,比如看门狗、SD卡等
    • 嵌入式系统支持那么多的启动方式:SD卡、SPI FLASH、USB DISK等,怎么选择?
      • 通过跳线,选择某个设备;
      • 通过跳线,选择一个设备列表,按列表顺序逐个尝试
      • 不让客户选择,按固定顺序逐个尝试
    • 内存那么大,把程序从SD卡等设备,复制到内存哪个位置?复制多长?
      • 烧写在SD卡等设备上的程序,含有一个头部信息,里面指定了内存地址和长度;
      • 不给客户选择,程序被复制到内存固定的位置,长度也固定
    • 程序在SD卡上怎么存?
      • 原始二进制(raw bin),
      • 作为一个文件保存在分区里