嵌入式系统上电后程序的运行过程

文章目录

  • 前言
  • 一、ROM 与 RAM
    • 1.1 ROM
    • 1.2 RAM
  • 二、两类嵌入式系统
    • 2.1 无操作系统
    • 2.1 有操作系统
  • 三、NAND FLASH 与 NOR FLASH
    • 3.1 NAND FLASH
    • 3.2 NOR FLASH
  • 四、开始执行代码的地址
  • 五、上电后怎么执行我们的程序
  • 六、总结


前言

  • 微控制器(单片机)上电后,是如何寻找到并执行main函数的呢?很显然微控制器无法从硬件上定位main函数的入口地址,因为使用C语言作为开发语言后,变量/函数的地址便由编译器在编译时自行分配,这样一来main函数的入口地址在微控制器的内部存储空间中不再是绝对不变的。
  • 无论性能高低,结构简繁,价格贵贱,每一种微控制器(处理器)都必须有启动文件,启动文件的作用便是负责执行微控制器从“复位”到“开始执行main函数”中间这段时间(称为启动过程)所必须进行的工作。但开发环境往往自动完整地提供了这个启动文件,不需要开发人员再行干预启动过程,只需要从main函数开始进行应用程序的设计即可。
  • 那么嵌入式系统上电后第一步做的事情是什么?是怎么样去执行我们的第一行代码的呢?

一、ROM 与 RAM

  • CPU的基本原理都相似,简单理解都是取指令和数据、执行指令处理数据。那么是从哪里取指令,指令存储在哪?就涉及到存储指令的介质了,这种介质可以是ROM和RAM,两种不同的存储介质,他们都可以做为存储指令的介质。

1.1 ROM

只读存储器,CPU只能从里面读数据,而不能往里面写数据,掉电后数据依然保存在存储器中 ; 主要存放我们的二进制程序代码 , 每次重新上电都会存在。

1.2 RAM

是随机存储器,CPU既可以从里面读出数据,又可以往里面写入数据,掉电后数据不保存;这个数据不是人为写入的,是CPU写入的。主要存放我们程序运行过程中产生的数据,程序的运行只能在RAM,不能在ROM,ROM只是起到一个存放的作用。

  • 一个与计算机专业相关的人,应当区分内存和存储这两个不同的概念,内存直接与性能挂钩,决定的是一个机器的卡顿与不卡顿问题,存储是与容量挂钩,决定的是一个机器可以存放多少G,甚至是多少T的东西。上面的ROM可以理解为存储,而RAM对应的则是内存。好比我们的手机 256G+8G , 这个256G所说的就是存储,8G说的就是内存。

二、两类嵌入式系统

2.1 无操作系统

应用软件直接建立在硬件上,没有专门的操作系统,软件的规模也较小,基本上都是硬件的附属品。

2.1 有操作系统

程序员在开发应用程序的时候,不是直接面对嵌入式硬件设备,而是在操作系统的基础上进行编写,提高了开发效率,有利于系统的移植和扩展。

三、NAND FLASH 与 NOR FLASH

3.1 NAND FLASH

非易失闪存(掉电不丢失)的一种,但是它虽然有数据总线,但是没有地址总线,所以cpu不能直接从NANDFLASH中取指运行,由于它价格便宜,所以常常用来存储大量数据,和我们常说的硬盘类似

3.2 NOR FLASH

非易失闪存,是一种外部存储介质,芯片内执行,应用程序可以直接在flash闪存内运行,不必再把代码读到系统RAM中,由于它有地址总线,cpu可以直接从norflash中取指,直接从FLASH中运行程序,但是工艺复杂,价格比较贵,容量较小。

四、开始执行代码的地址

  • 必须要知道的是,所有的处理器PC指针复位值都会是0,表示CPU从0地址开始执行指令。这个0地址是个很讲究的东西。通常有下面几种:
  1. 片内的SRAM
  2. 外部总线上的NOR FLASH
  3. 片内固化的ROM CODE。(这个一般对应的没有操作系统的嵌入式系统)

那么怎么知道map哪个呢,这种情况下CPU还没开始跑,所以只能依赖于硬件逻辑。例如ARM9将SRAM map到0地址。

五、上电后怎么执行我们的程序

对ARM而言:

  • 开机后,ARM有两种启动方式,一种是直接从0地址的NOR FLASH开始启动;一种是先将NAND FLASH中前4K的内容拷贝到内部4K的RAM中运行,并设定CPU从这个地址开始启动执行。

  • 使得有上述两种不同启动方式的原因是:人为使芯片上OM0,1管脚的电平不同。

  • 硬件实现的拷贝或自举,不需要软件进行干预,所以就不需要所谓的驱动程序。

六、总结

系统上电后,处理器PC指针复位值是0,第一步就是从0地址开始执行指令,这个0地址可以是RAM,也可以是NOR FLASH,主要看硬件设计怎么映射,对于有操作系统的嵌入式系统,通常最先执行的都是bootloader。没有操作系统的一般都是一些固化在rom中的自举程序。


本文纯属个人理解 , 经供参考 , 如有错误 , 欢迎大家在下方评论指出。

你可能感兴趣的:(程序的运行过程,嵌入式,操作系统,linux)