单片机的运行

1.组成:

  • CPU(中央处理器):核心部件,决定了主要功能特性(分为运算器和控制器两大部分)。
  • 存储器:由ROM和RAM组成(例:51单片机在系统结构上采用了哈佛型,将程序和数据分别存放在两个存储器内,一个称为程序存储器,另一个为数据存储器在物理结构上分程序存储器和数据存储器,有四个物理上相互独立的存储空间,即片内ROM和片外ROM,片内RAM和片外RAM。)
  • 定时器/计数器(T/C):51单片机内有两个16位的定时器/计数器,每个T/C既可以设置成计数方式,也可以设置成定时方式,并以其定时计数结果对计算机进行控制。
  • 并行I/O:实现数据的并行输入输出。
  • 串行口:可实现单片机和单片机或其他设备间的串行通信。
  • 中断控制系统:常用于实时控制、故障自动处理、计算机与外设间传送数据及人机对话等。

2.启动:

启动代码主要完成两方面的工作,一是初始化执行环境,例如中断向量表、堆栈、I/O等;二是初始化c库和用户应用程序。
启动过程是加电后,先运行芯片内部固有程序(这个程序是用户访问不到也改写不了的),即启动代码。启动代码程序建立完运行环境后,会去读串口状态,就是用户下载程序用到的各个端口,判断用户是否正在使用端口准备下载程序。
如果是,就按用户要求,把用户程序下载到指定地址上。如果不是,就跳转到已经下载过的用户程序入口,从而把芯片控制权交给用户程序。如果是新的芯片还没有下载过,那么就停留在读取串口状态的循环中。
启动代码通常都烧写在flash中,它是系统一上电就执行的一段程序,它运行在任何用户C代码之前。上电后,arm处理器处于arm态,运行于管理模式,同时系统所有中断被禁止,PC到地址0处取指令执行。
可执行映像文件必须有个入口点,而能放在ROM起始处的映像文件的入口地址也必须设置为0。在汇编语言中,可以自行定义定义一个程序的入口点,当工程中有多个入口点时,需要在连接器中使用-entry指出程序的入口点。
如果用户创建的程序中,包含了main函数,则与C库初始化代码对应的也会有个入口点。
在第一阶段,启动代码的过程可以描述为:

  • 建立中断向量表;
  • 初始化存储器;
  • 初始化堆栈寄存器;
  • 初始化i/o以及其他必要的设备;
  • 根据需要改变处理器的状态。

3.程序执行:

单片机中一个程序的运行过程分为取指令,分析指令和执行指令几个步骤。

  • 取指令的任务是:根据程序计数器PC中的值从程序存储器读出现行指令,送到指令寄存器。
  • 分析指令阶段的任务是:将指令寄存器中的指令操作码取出后进行译码,分析其指令性质。如指令要求操作数,则寻找操作数地址。
  • 计算机执行程序的过程实际上就是逐条指令地重复上述操作过程,直至遇到停机指令可循环等待指令。
    RAM和Flash都是内存。

4.多线程执行:

为了提高CPU的使用率,既然不能减少一段程序的执行时间,就在同样的时间执行更多的程序,一个核执行一段程序,两个核就可以执行两段程序,于是多核CPU成为了现在的主流)。
所以裸机程序指令就在Flash(Flash memory)中存放,而数据就放在了RAM中(flash的写入次数有限制,同时它的速度和RAM还是差很多)。更广泛说,在单片机上RAM存放data段,bss段,堆栈段;ROM(EPROM,EEPROM,Flash等非易失性存储设备)存放代码,只读数据段。
本质上说,这和PC上程序都在RAM中存放是一样的,PC 上是操作系统规定了可读与可写,而单片机上是依靠不同的存储设备区分了可读与可写。

5.数据存取:

对于单片机的程序执行时指令和数据的存放与读取,对单片机编程后,程序的代码段,data段,bss段,rodata段等都存放在Flash中。当单片机上电后,初始化汇编代码将data段,bss段,复制到RAM中,并建立好堆栈,开始调用程序的main函数。
之后,便有了程序存储器,和数据存储器之分,运行时从Flash(即指令存储器,代码存储器)中读取指令 ,从RAM中读取与写入数据。RAM存在的意义就在于速度更快。无论是单片机也好,PC,速度的因素,成本的限制导致了一级级更快的存储器的更快速度与更高的成本。