当前位置: 首页 > backend >正文

从冷上电到main()函数,Bootloader都做了什么?

目录

1、硬件初始化

2、引导模式与应用模式的抉择

3、启动代码


在嵌入式系统中,从设备上电到执行应用程序的main()函数,Bootloader扮演着至关重要的角色。作为系统启动的首个程序,Bootloader负责初始化硬件、设置运行环境,并最终将控制权移交至应用程序。

从冷上电到main()函数的执行,嵌入式系统的启动流程可分为以下几个阶段:

  • 上电复位:微控制器在接收到电源或复位信号后,从预定义的复位向量地址开始执行代码。通常,这个地址位于Flash存储器的起始位置(如STM32的0x08000000)。
  • 初始硬件设置:处理器执行存储在ROM或Flash中的代码,配置时钟系统、存储器控制器等关键硬件,确保系统稳定运行。
  • Bootloader执行,Bootloader接管控制权,进一步初始化系统,可能包括:设置堆栈和堆。初始化外设。从外部存储器加载应用程序代码(若需要)。执行安全检查,如验证固件数字签名。跳转到应用程序的入口点。
  • 应用程序启动:启动代码完成环境设置后,调用main()函数,应用程序开始执行。对于带操作系统的系统(如嵌入式Linux),Bootloader会加载并启动操作系统内核。

1、硬件初始化

上电后,微控制器首先执行硬件初始化。这通常包括:

  • 时钟配置:设置系统时钟、PLL(锁相环)等,以确保处理器和外设以正确的频率运行。
  • 存储器配置:初始化存储器控制器,启用RAM或外部存储器。
  • 外设初始化:配置关键外设,如串口、GPIO等。

这些初始化通常在汇编语言中实现,以确保高效和精确。例如,在STM32中,系统时钟的初始化可能在SystemInit()函数中完成。

2、引导模式与应用模式的抉择

许多Bootloader支持两种模式:

  • 引导模式:用于固件更新或调试,通常通过特定输入(如按键、GPIO状态或串口命令)触发。
  • 应用模式:默认模式,直接运行应用程序。

Bootloader会在启动时短暂等待用户输入(如按下F2、Delete键或设置特定GPIO)。若无输入,则跳转到应用程序代码。例如,U-Boot(一种常见的嵌入式Bootloader)通过串口、USB或以太网检测用户输入。

3、启动代码

启动代码是Bootloader的核心部分,负责为应用程序准备运行环境。主要任务包括:

  • 设置堆栈指针:为函数调用和局部变量分配堆栈空间。
  • 初始化数据段:将初始化数据(.data段)从Flash复制到RAM。将未初始化数据(.bss段)清零。
  • 调用main()函数:将控制权移交至应用程序。

在某些系统中,启动代码还会初始化C/C++运行时环境,如调用静态构造函数(C++)或设置标准库。

例如,STM32的启动代码通常在汇编文件中实现,如startup_stm32f4xx.s,位于STM32Cube固件包中(STM32CubeF4)。其主要功能包括:

  • 定义向量表,包含初始堆栈指针和复位处理程序地址。
  • 实现复位处理程序(Reset Handler),执行初始化任务并调用main()。

以下是一个简化的STM32启动代码示例(基于ARM Cortex-M):

Reset_Handler:; 设置堆栈指针ldr r0, =_estackmov sp, r0; 复制.data段从Flash到RAMldr r1, =_sidataldr r2, =_sdataldr r3, =_edatab LoopCopyDataInitCopyDataInit:ldr r4, [r1], #4str r4, [r2], #4LoopCopyDataInit:cmp r2, r3bcc CopyDataInit; 清零.bss段ldr r2, =_sbssldr r3, =_ebssmov r4, #0b LoopFillZerobssFillZerobss:str r4, [r2], #4LoopFillZerobss:cmp r2, r3bcc FillZerobss; 调用main函数bl main; 如果main返回,进入无限循环b .

代码说明

  • 堆栈指针初始化:将堆栈指针设置为RAM末尾(_estack)。
  • 复制.data段:将初始化数据从Flash(_sidata)复制到RAM(_sdata到_edata)。
  • 清零.bss段:将未初始化数据段(_sbss到_ebss)设置为零。
  • 调用main():跳转到应用程序的main()函数。

Bootloader是嵌入式系统启动过程中的核心组件,负责从冷上电到main()函数的顺利过渡。通过硬件初始化、模式选择和启动代码执行,Bootloader为应用程序提供了稳定的运行环境。尽管不同微控制器的实现细节各异(如STM32、ARM Cortex-M等),但其核心原则保持一致。理解Bootloader的工作原理有助于开发者设计更可靠的嵌入式系统,并为固件更新和调试提供支持。

http://www.xdnf.cn/news/10523.html

相关文章:

  • 数据类型检测有哪些方式?
  • robot_lab学习笔记【MDP综述】
  • QuickJS 如何计算黄金分割率 ?
  • barker-OFDM模糊函数原理及仿真
  • Linux防火墙:全面解析IPTables的表、链、规则!
  • Cypress + TypeScript + Vue3
  • 数据库管理与高可用-MySQL全量,增量备份与恢复
  • 劫持进程注入
  • C语言进阶--程序的编译(预处理动作)+链接
  • 数据结构:递归(Recursion)
  • 基于TMC5160堵转检测技术的夹紧力控制系统设计与实现
  • 输入ifconfig,发现ens33不见了,无法连接至虚拟机
  • Golang——3、流程控制语句
  • C++实现伽罗华域生成及四则运算(三)
  • Python----目标检测(《SSD: Single Shot MultiBox Detector》论文和SSD的原理与网络结构)
  • CppCon 2014 学习:C++ in Huge AAA Games
  • STM32F407寄存器操作(多通道单ADC+DMA)
  • 前端面试准备-5
  • Mask_RCNN 环境配置及训练
  • QT中子线程触发主线程弹窗并阻塞等待用户响应-传统信号槽实现
  • DRW - 加密市场预测
  • 考研系列—操作系统:第四章、文件管理(part.2)
  • 利用DeepSeek编写能在DuckDB中读PostgreSQL表的表函数
  • 多任务——进程
  • 基于机器学习的心脏病预测模型构建与可解释性分析
  • WIN11+VSCODE搭建的c/c++环境调试报错解决
  • vue+mitt的简便使用
  • API异常信息如何实时发送到钉钉
  • 重读《人件》Peopleware -(14)Ⅱ 办公环境 Ⅶ 把门带上
  • Windows商店中的免费扫雷游戏应用