0

0

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

星夢妙者

星夢妙者

发布时间:2025-07-03 10:50:01

|

507人浏览过

|

来源于php中文网

原创

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

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

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

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

1

硬件初始化

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

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

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

2

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

许多Bootloader支持两种模式:

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

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

3

Avatar AI
Avatar AI

AI成像模型,可以从你的照片中生成逼真的4K头像

下载

启动代码

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

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

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

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

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

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

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">Reset_Handler:    ; 设置堆栈指针    ldr r0, =_estack    mov sp, r0    ; 复制.data段从Flash到RAM    ldr r1, =_sidata    ldr r2, =_sdata    ldr r3, =_edata    b LoopCopyDataInitCopyDataInit:    ldr r4, [r1], #4    str r4, [r2], #4LoopCopyDataInit:    cmp r2, r3    bcc CopyDataInit    ; 清零.bss段    ldr r2, =_sbss    ldr r3, =_ebss    mov r4, #0    b LoopFillZerobssFillZerobss:    str r4, [r2], #4LoopFillZerobss:    cmp r2, r3    bcc FillZerobss    ; 调用main函数    bl main    ; 如果main返回,进入无限循环    b .</code>

代码说明:

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

Bootloader是嵌入式系统启动过程中的核心组件,负责从冷上电到main()函数的顺利过渡。

通过硬件初始化、模式选择和启动代码执行,Bootloader为应用程序提供了稳定的运行环境。

尽管不同微控制器的实现细节各异(如STM32、ARM Cortex-M等),但其核心原则保持一致。

理解Bootloader的工作原理有助于开发者设计更可靠的嵌入式系统,并为固件更新和调试提供支持。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

443

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

605

2023.08.10

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

443

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

605

2023.08.10

数据库Delete用法
数据库Delete用法

数据库Delete用法:1、删除单条记录;2、删除多条记录;3、删除所有记录;4、删除特定条件的记录。更多关于数据库Delete的内容,大家可以访问下面的文章。

287

2023.11.13

drop和delete的区别
drop和delete的区别

drop和delete的区别:1、功能与用途;2、操作对象;3、可逆性;4、空间释放;5、执行速度与效率;6、与其他命令的交互;7、影响的持久性;8、语法和执行;9、触发器与约束;10、事务处理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

222

2023.12.29

linux是嵌入式系统吗
linux是嵌入式系统吗

linux是嵌入式系统,是一种用途广泛的系统软件,其特点是:1、linux系统是完全开放、免费的;2、linux操作系统的显著优势是多用户和多任务,保证了多个用户使用互不影响;3、设备是独立的,只要安装驱动程序,任何用户都可以对任意设备进行使用和操作。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

175

2024.02.23

C++ 嵌入式系统开发入门与实践
C++ 嵌入式系统开发入门与实践

本专题将带你系统掌握 C++ 在嵌入式系统中的实战应用,内容覆盖硬件抽象、驱动开发、内存与性能优化、实时系统编程、跨平台编译构建,以及常用嵌入式框架与调试技巧,帮助开发者从零构建可运行于 MCU、ARM 等平台的高性能嵌入式项目。

224

2025.11.18

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

3

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Git 教程
Git 教程

共21课时 | 4.2万人学习

麻省理工大佬Python课程
麻省理工大佬Python课程

共34课时 | 5.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号