打印
[应用相关]

【转】STM32启动代码与Bootloader

[复制链接]
1214|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
联通移不动|  楼主 | 2017-2-11 12:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
注意:很多初学者总是将启动代码和Bootloader联系在一起,这是错误的
什么是启动代码?
      启动代码是系统上电或者复位后运行的第一段代码,是进入C 语言的main 函数之前需要执行的那段汇编代码。
启动代码有何用?
      它的作用是在用户程序运行之前对系统硬件及软件环境进行必要的初始化并在最后使程序跳转到用户程序。它直接面对ARM 处理器内核及硬件控制器进行编程,所执行的操作与具体的目标系统紧密相关。
      C语言程序的运行需要具备一定的条件,如分配好外部数据空间,堆栈空间和中断入口等。另外,汇编代码可以更直接地对硬件进行操作,效率更高,这对启动中断等对时间要求更高的情况是非常必要的
什么是Bootloader?
      Bootloader不是一段代码,它是一个具有引导装载功能的完整的程序,如可以引导装载Linux的vivi,uboot,以及通常PC机上的BOIS程序等。
启动代码和Bootloader关系?
      Bootloader也包含了相应的启动代码,也就是说,启动代码是Bootloader的一部分,是所有相应应用程序的一部分。

Bootloader讲解       简单地说,BootLoader 就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。
      系统加电或复位后,所有的 CPU 通常都从某个由 CPU 制造商预先安排的地址上取指令。这是由处理器设计决定的。比如,基于 ARM7TDMI core 的 CPU 在复位时通常都从地址 0x00000000 取它的第一条指令。而基于 CPU 构建的嵌入式系统通常都有某种类型的固态存储设备(比如:ROM、EEPROM 或 FLASH 等)被映射到这个预先安排的地址上。因此在系统加电后,CPU 将首先执行 Boot Loader 程序。
Boot Loader 的操作模式
       通常多阶段的 Boot Loader 能提供更为复杂的功能,以及更好的可移植性。大多数 Boot Loader 都包含两种不同的操作模式:"启动加载"模式和"下载"模式,这种区别仅对于开发人员才有意义。但从最终用户的角度看,Boot Loader 的作用就是用来加载操作系统,而并不存在所谓的启动加载模式与下载工作模式的区别。
       启动加载(Boot loading)模式:这种模式也称为"自主" (Autonomous)模式。也即 Boot Loader 从目标机上的某个固态存储设备上将操作系统加载到 RAM 中运行,整个过程并没有用户的介入。这种模式是 Boot Loader 的正常工作模式,因此在嵌入式产品发布的时侯,BootLoader 显然必须工作在这种模式下。
      下载(Downloading)模式:在这种模式下,目标机上的 Boot Loader 将通过串口连接或网络连接等通信手段从主机(Host)下载文件,比如:下载内核映像和根文件系统映像等。从主机下载的文件通常首先被 Boot Loader 保存到目标机的 RAM 中,然后再被 Boot Loader 写到目标机上的FLASH 类固态存储设备中。
Boot Loader的组成       从操作系统的角度看,BootLoader 的总目标就是正确地调用内核来执行。另外,由于 Boot Loader 的实现依赖于 CPU 的体系结构,因此大多数 Boot Loader 都分为 stage1 和 stage2 两大部分。依赖于 CPU 体系结构的代码,比如设备初始化代码等,通常都放在 stage1 中,而且通常都用汇编语言来实现,以达到短小精悍的目的。而 stage2 则通常用C语言来实现,这样可以实现给复杂的功能,而且代码会具有更好的可读性和可移植性。
一、Boot Loader 的 stage1 通常包括以下步骤(以执行的先后顺序)首先是硬件设备初始化。这是 Boot Loader 一开始就执行的操作,其目的是为 stage2 的执行以及随后的 kernel 的执行准备好一些基本的硬件环境。它通常包括以下步骤(以执行的先后顺序):
1.屏蔽所有的中断。为中断提供服务通常是 OS 设备驱动程序的责任,因此在 Boot Loader 的执行全过程中可以不        必响应任何中断。中断屏蔽可以通过写 CPU的中断屏蔽寄存器或状态寄存器(比如 ARM 的 CPSR 寄存器)来完      成。
2.设置 CPU 的速度和时钟频率。
3.RAM 初始化。包括正确地设置系统的内存控制器的功能寄存器以及各内存库控制寄存器等。
等。
之后是下面的步骤:
      为加载Boot Loader 的 stage2 准备 RAM 空间。
      拷贝Boot Loader 的 stage2 到 RAM 空间中。
      设置好堆栈。
      跳转到stage2 的 C 入口点。
二、Boot Loader的 stage2 通常包括以下步骤(以执行的先后顺序)      初始化本阶段要使用到的硬件设备。
      检测系统内存映射(memory map)。
      将kernel 映像和根文件系统映像从 flash 上读到RAM 空间中。
      为内核设置启动参数。
      调用内核。



沙发
捉虫天师| | 2017-2-11 15:47 | 只看该作者
Bootloader不是一段代码,它是一个具有引导装载功能的完整的程序,如可以引导装载Linux的vivi,uboot,以及通常PC机上的BOIS程序等。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

67

主题

127

帖子

0

粉丝