硬件结构

从本质上讲,目前无论是PC还是嵌入式开发板,所有计算机无外乎是两种硬件架构。一种是冯诺依曼架构体系、一种是哈佛架构体系。这两种架构体系对于仅仅从事驱动开发的嵌入式开发者是透明无感的,因此不需要掌握它俩的区别,感兴趣的话可以自行在网上搜索相关内容。

但如论是哪种架构体系计算机都是由以下基本硬件构成的:cpumemorystoragebusperipheral。 它们之间的关系如下图:

硬件架构ppc 硬件架构是什么_linux

  • CPU
    CPU为中央处理器,有常识的人都应该懂,这里就不再罗嗦了。但有一点要提一下,CPU虽然很复杂,但是本质上它与其他电器(比如灯泡)没有区别,就是通电就工作。它的工作就是从memory中取指令,并执行执行。而指令需要的数据可能来自memory,也可能来自bus。虽然不太准确,但是这么理解通常是没有问题的,就是CPU只能直接与MEMORY和BUS进行沟通,而不能直接与peripheral、storage沟通。
  • memory
    memory中文通常被翻译成“内存”,指令只有存放在内存中才能被CPU读取和执行。memory分两种一种是RAM(随机访问内存),断电后信息会消失。另一种是sRAM(静态随机访问内存),断电后信息不消失。
  • bus
    bus被翻译成总线,总线的种类有很多,比如I2C,SDIO,USB总线,GPIO等。可以将总线想象成家里的插排,不能与CPU直接沟通的所有外设都要插到总线接口上。每种总线都有其对应的总线控制器,在编程时我们是通过CPU去操作总线控制器来控制各种外设,因此在编程中提到总线无特殊说明,一般指的就是总线控制器。
  • peripheral
    peripheral被翻译成“外设”,如键盘、鼠标、SD/TF卡、显示器。这些都属于外设,它们没法直接与CPU沟通,只能被插到合适的bus上。
  • storage
    storage被翻译成“存储器”。本质上它也是一种外设,只不过通常来说一个完整的计算机通常都会包含一个storage才能正常工作,因为计算机大量的信息在断电后,都需要存储在存储器上。PC上的存储器主要是硬盘;而嵌入式系统中常见的存储器有SD卡、eMMC、NAND等

CPU的工作流程

对于嵌入式软件工程师来说,初期不需要指导CPU复杂的工作原理,只需要CPU的工作只有两步。

  • 第一步:根据地址从memory中取指令。
  • 第二步:执行指令。

详细但不准确的来说。CPU有一个寄存器,叫IP寄存器,这个IP寄存器保存着CPU要取的下一条指令在memory中的地址。CPU会根据IP寄存器中的地址去memory中取指令,然后执行。
如果执行的指令不是跳转指令,IP寄存器会自动更新成紧挨着的下一条指令的地址。这样CPU执行完当前指令后就会去取下一条指令并执行。
如果当前指令是跳转指令,则当前执行的跳转指令会设置IP寄存器的值,这样当CPU执行完当前跳转指令后,就会跳到指定的地址去取下一条指令并执行。

软件构成和启动流程

硬件架构ppc 硬件架构是什么_寄存器_02


嵌入式软件开发,要开发的主要是上图三类软件。

  • bootloader
    bootloder是CPU通电后自动执行的。每种CPU都会有一个初始的IP寄存器值,该值是固定的由硬件决定。CPU一通电就会去这个地址取指令执行。由上面对硬件结构的介绍也可知道,CPU开机默认地址一定是指向SRAM的,因为只有SRAM在断电的情况下还能保存信息,并且可以与CPU直接沟通。因此bootloder一定是被保存在SRAM上的。bootloader的关键作用是将kernel加载到内存中,并将CPU的IP寄存器的值修改成kernel第一条指令的地址。
    为什么要有bootloader? 关于这个问题网上的答案一般都是说bootloader需要做一些初始化工作。但这并没有说到点子上。因为初始化工作完全可以直接由kernel来完成。需要bootloader的根本原因是SRAM的空间很小,不能把整个kernel及启动需要的数据全部保存下来。因此必须设计一个小而精的程序,它既能保存到SRAM上,又能初始化一些必要的硬件和提供一些服务。使得可以将kernel加载到RAM。
    举个例子,现在SRAM只有512K,而kernel有1G。因此kernel不能直接存到SRAM上。这时我们可以将kernel存到storage上。然后编写一个小于512K的bootloader,保存到SRAM上。而这个bootloader只需要作三件事情:1.完成RAM的初始化。2.从storage上将kernel加载到RAM上。3.将IP寄存器指向kernel的第一条指令的地址。
  • kernel
    kernel是整个操作系统的核心,负责整个系统的资源分配,任务(线程)调度,提供设备驱动框架等。作为驱动开发者主要工作就是要修改kernel中设备驱动相关的代码。
  • application
    application即应用程序,他是直接面向用户的程序。application会调用操作系统提供的API。它是由操作系统加载到RAM上并执行的。