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

article/2025/7/28 11:13:29

目录

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.hkcw.cn/article/pPbuxdagmJ.shtml

相关文章

电路图识图基础知识-保护环节、自锁环节及互锁环节(十)

1 电路中的自锁环节 自锁环节是指继电器得电后能通过自身的常开触点闭合,给其线圈供电的环节。如图所示的电路图中,辅助电路中并联于启动按钮开关SB2 旁边的KM 常开触点就是自锁环节(此触 电称为自锁触电)。 图中所示的自锁过程是:当QK 闭合后…

Linux Windows之wsl安装使用简介

参考资料 如何使用 WSL 在 Windows 上安装 Linuxwindows11 安装WSL2全流程旧版 WSL 的手动安装步骤 目录 一. 前期准备1.1 确认windows的版本1.2 开启Linux子系统的支持1.2.1 图形化方式1.2.2 命令行方式 1.3 安装wsl软件1.4 安装Linux分发版 二. 基本配置2.1 Windows Termina…

网红家装企业上海总部人去楼空 欠款风波引关注

端午节放假前,每天有上百人来找住范儿,因为公司欠了不少钱。6月1日下午,记者来到住范儿上海公司所在地,发现公司大门被木板封得严严实实。守在门口的保安指着木板上的通知对记者说:“也省得你报警了,直接打派出所电话吧。”据官网介绍,住范儿是家居建材新零售服务商,成…

正则表达式笔记

正则表达式笔记 前言一、基本字符匹配二、字符类三、量词四、定位符五、贪婪匹配和非贪婪匹配六、旗标七、分组和引用八、前瞻九、后顾 前言 参考GeekHour视频和资料,讲的挺好的,B站有[GeekHour正则表达式] 正则表达式在线工具网站:https://…

齐达内拒利雅得新月一亿欧年薪合同 静候法国国家队帅位

齐达内拒绝了利雅得新月开出的1亿欧元年薪合同。沙特球队利雅得新月正在寻找新主帅,并希望邀请赋闲在家的齐达内。利雅得新月愿意为齐达内支付一亿欧元年薪,签约一年,让他率队参加今夏世俱杯。然而,齐达内已经拒绝了这份高薪邀请。随后,利雅得新月开始联系国米主帅小因扎吉…

【论文解读】DETR | End-to-End Object Detection with Transformers

论文地址:https://arxiv.org/pdf/2005.12872 代码地址:https://github.com/facebookresearch/detr 摘要 本研究提出了一种新的方法,该方法将目标检测视为一个直接的集合预测问题。本研究的方法简化了检测流程,有效地消除了对许多…

(C++)STL:string类(三)非成员重载函数和类型转化函数解析使用

string类&#xff08;三&#xff09; 非成员重载函数relational operaters 关系运算符operatoroperator<< operator>>getline <string>头文件内的函数string转化为数字类型其他数值类型转化为string练习&#xff1a;字符串最后一个单词的长度 非成员重载函数…

[Python] Python运维:系统性能信息模块psutil和系统批量运维管理器paramiko

初次学习&#xff0c;如有错误还请指正 目录 系统性能信息模块psutil 获取系统性能信息 CPU信息 内存信息 磁盘信息 网络信息 其他信息 进程信息 实用的IP地址处理模块IPy IP地址、网段的基本处理 多网络计算方法 系统批量运维管理器paramiko paramiko 的安装 Li…

声光控灯电路Multisim仿真

5V交流源充当声音信号源&#xff0c;可调电阻充当光敏电阻。 白天&#xff0c;不管是否有声音&#xff0c;灯都不会亮。 夜晚&#xff0c;当有声音时&#xff0c;灯亮一段时间&#xff0c;然后熄灭。 仿真时遇到的问题&#xff1a; 问题1、必须按照一定的流程才能正常运行。…

Blueprints - List View Widget

一些学习笔记归档&#xff1b; 需要读取动态数据把多个条目显示在UI上的时候&#xff0c;可能用到List View组件&#xff1b;假如有Widget要使用在List View中&#xff0c;此Widget需要继承相关接口&#xff1a; 这样就能在List View控件中选择已经继承接口的Widget组件了&…

七.MySQL内置函数

1.日期函数 MySQL 日期与时间函数对照表 函数名称描述current_date()当前日期&#xff08;格式&#xff1a;YYYY-MM-DD&#xff09;current_time()当前时间&#xff08;格式&#xff1a;HH:MM:SS&#xff09;current_timestamp()当前日期和时间&#xff08;等同于 now()&#x…

神经网络与Transformer详解

1. 一个模型的典型场景 对用户咨询的法律问题做自动归类: 婚姻纠纷、劳动纠纷、合同纠纷、债权债务、房产纠纷、交通事故、医疗纠纷、版权纠纷 2. 模型就是一个数学公式 我们一般将这样的问题描述为:给定一组输入数据,经过一系列数学公式计算后,输出n个概率,分别代表该…

《Python基础》第2期:环境搭建

在开始编写 Python 代码前&#xff0c;还需要搭建 Python 的开发环境。 电脑是没办法直接读懂 Python 代码的&#xff0c;而是需要一个解释器&#xff0c;实时把代码翻译成字节码&#xff0c;字节码再转换成 0 和 1&#xff0c;电脑就能读懂了。 Python 的运行过程就是翻译一行…

多线程——定时任务ScheduledThreadPoolExecutor用法

创建 同样是用Executors工具类&#xff1a; 创建定时任务线程池 还有一个重载方法 接收一个额外的参数&#xff1a;线程工厂 创建单个定时任务执行器&#xff1a; 重载&#xff1a;也接收一个线程工厂 区别说明 singleThread&#xff1a; 这里可以new, 说明他是一个类 传…

AI 代理框架:使用正确的工具构建更智能的系统

AI 代理框架&#xff1a;使用正确的工具构建更智能的系统 探索 AI 代理框架如何支持从单代理设置到复杂的多代理编排的自主工作流。了解它们有何不同、何时使用它们以及如何开始使用实际工具。 AI 代理框架 从本质上讲&#xff0c;AI 代理是可以感知、计划和行动的程序。它们旨…

计算机网络 TCP篇常见面试题总结

目录 TCP 的三次握手与四次挥手详解 1. 三次握手&#xff08;Three-Way Handshake&#xff09; 2. 四次挥手&#xff08;Four-Way Handshake&#xff09; TCP 为什么可靠&#xff1f; 1. 序列号与确认应答&#xff08;ACK&#xff09; 2. 超时重传&#xff08;Retransmis…

系统架构设计师(一):计算机系统基础知识

系统架构设计师&#xff08;一&#xff09;&#xff1a;计算机系统基础知识 引言计算机系统概述计算机硬件处理器处理器指令集常见处理器 存储器总线总线性能指标总线分类按照总线在计算机中所处的位置划分按照连接方式分类按照功能分类 接口接口分类 计算机软件文件系统文件类…

软件无线电关键技术之正交调制技术

与传统调制方式相比&#xff0c;IQ 调制不直接对相位或频率调制&#xff0c;而是简单的对载波及其正交量进行线性调制&#xff0c;进而达到相位或频率调制的效果。IQ 调制具有较高的数据传输速率&#xff0c;高频带利用率&#xff0c;可有效抑制镜频边带以及易于实现等优势&…

comfyui利用 SkyReels-V2直接生成长视频本地部署问题总结 1

在通过桌面版comfyUI 安装ComfyUI-WanVideoWrapper 进行SkyReels-V2 生成长视频的过程中&#xff0c;出现了&#xff0c;很多错误。 总结一下&#xff0c;让大家少走点弯路 下面是基于搜索结果的 ComfyUI 本地部署 SkyReels-V2 实现长视频生成的完整指南&#xff0c;涵盖环境配…

性能优化 - 案例篇:缓存

文章目录 Pre引言1. 缓存基本概念2. Guava 的 LoadingCache2.1 引入依赖与初始化2.2 手动 put 与自动加载&#xff08;CacheLoader&#xff09;2.2.1 示例代码 2.3 缓存移除与监听&#xff08;invalidate removalListener&#xff09; 3. 缓存回收策略3.1 基于容量的回收&…