网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
05月25日漏签0天
嵌入式吧 关注:104,318贴子:477,459
  • 看贴

  • 图片

  • 吧主推荐

  • 游戏

  • 1 2 下一页 尾页
  • 37回复贴,共2页
  • ,跳到 页  
<<返回嵌入式吧
>0< 加载中...

Bootloader面试问题初探

  • 只看楼主
  • 收藏

  • 回复
  • 猴头菇在跑
  • 实时系统
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
1. Bootloader导学课
1.2 重映射知识:
1.3 Bootloader执行步骤
2.单片机启动流程
2.1 ARM架构:


  • 猴头菇在跑
  • 实时系统
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
首先了解下FLASH、SRAM的区别:
一个掉电可以存储数据、一个掉电没有数据
STM32空间 FLASH>SRAM
显而易见OTA升级:就应该在FLASH内部划分多个APP区域
那么引出一个问题,启动哪个APP,由谁来启动,怎么启动,水平有限不懂。


2026-05-25 10:39:15
广告
不感兴趣
开通SVIP免广告
  • 猴头菇在跑
  • 实时系统
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
上面说到了这么多APP,但是CPU是从0x0000 0000 取指令进行运行的。
引申出下面知识:STM32重映射:
先讲本质的例子:
重映射的本质是"地址别名"机制,类似于现实中的"快捷方式"概念。例如:
你家实际地址是XX路100号(物理地址)
但快递柜显示你的快递在A区001柜(逻辑地址)
物业在后台配置了A区001柜 → XX路100号的映射关系
STM32的重映射就是芯片内部的"物业管理系统",在硬件层面建立逻辑地址 ↔ 物理地址的对应关系。(重映射不复制数据,只是建立地址对应关系)
所以bootloader这个跳转程序可以跳转到任意一个区域,通过STM32的重映射让CPU从0x0000 0000执行指令,实际上执行了跳转区域的程序指令。


  • 猴头菇在跑
  • 实时系统
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
STM32空间分布:
FLASH(起始地址) ———— 0x0800 0000
系统存储器(起始地址)—— 0x1FFF0000
SRAM(起始地址) —— 0x20000000
STM32有这么多空间,难道STM32就锁死了FLASH启动吗,肯定不是的
STM32也有一个Bootloader,但是手册叫boot模式,选择哪个存储器进行启动,然后地址进行重映射:


  • 猴头菇在跑
  • 实时系统
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
讲到这里,Bootloader就清楚了,就是一个启动程序,跳转到另外一个地址,这个地址可以是flash任意的一个空间,SRAM任意空间,STM32的内置存储空间。


  • 猴头菇在跑
  • 实时系统
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
// 在main函数中验证映射关系
uint32_t *flash_start = (uint32_t*)0x08000000;
uint32_t *logic_start = (uint32_t*)0x00000000;
printf("物理FLASH[0]: 0x%08X\n", flash_start[0]); // 实际存储的栈指针
printf("逻辑地址[0]: 0x%08X\n", logic_start[0]); // 应等于flash_start[0]
感兴趣的新建一个cubemx试一试


  • 猴头菇在跑
  • 实时系统
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
上电启动:
启动流程:
STM32官方规定,上电后要读取栈首地址和中断向量表
The Cortex-M3 can only boot from address 0x0 from reset(解释为什么CPU从0x00000000启动)
The boot-up sequence for M3 is different to traditional ARM cores, in that the first fetch from address 0x0 is the initial value of the SP, the second value is reset vector, i.e. the starting address of program code.
所以0x0000 0000(这个重映射地址)储存的内容必须是栈的首地址
0x0000 0004 (这个重映射地址)存储的内容必须是复位函数的地址
所以我们的bootloader需要做的事情就很清晰了:
创建两个工程,一个工程从0x0800 0000开始 编写Bootloader函数,在mian内部使用
一个工程从0x080 xxxx(根据上一个项目的大小得知起始地址),mian内while进行循环打印测试。
程序:
#define AppAddr APP第一个四字节的地址——
只要通过keil下载的,开始地址就是栈的首地址(复位函数同理)
1、设置主堆栈指针地址:
__set_MSP(*(uint32_t *)AppAddr;
2、启动复位函数
typedef void (*Function)(void);
Function = *(volatile uint32_t *) AppAddr + 4;
Function();//程序将已函数的形式执行
然后Bootloader就跳转过去了APP地址,进行执行APP程序。
2、APP应该做什么:
APP此时应该把中断向量表迁移过来,不然发生中断会跑去Bootloader地址寻址,容易出现fault


  • 西南小镰锤
  • 启动代码
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼


2026-05-25 10:33:15
广告
不感兴趣
开通SVIP免广告
  • 哈哈哈屁111
  • 启动代码
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
🐮


  • 拯救迷失小猫
  • 固件驱动
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
诶,是猴头菇


  • 一叶一追寻💼
  • 晶体管
    3
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
cy


  • AA72🐿
  • 集成电路
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
罕见的技术贴


  • 马粥
  • 实时系统
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
菇哥技术贴


  • 盼守
  • 板级软件
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
老早之前看到你要去sgg培训了 专业不换一个 很难有面试的啊 之前没有试过直接编个假专业先拿面试机会吗


2026-05-25 10:27:15
广告
不感兴趣
开通SVIP免广告
  • 嘎嘎咯娄
  • 微控制器
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
不是映射,粗略理解可以。实际上是根据boot引脚选择启动模式,芯片内部有个固化代码根据boot 引脚来选择从哪里加载程序,而且bootloader 一般是引导操作系统程序或app 的,是你自己编写的,而不是芯片内部一直存在的,从引导阶段来看可别称之为spl 。


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 1 2 下一页 尾页
  • 37回复贴,共2页
  • ,跳到 页  
<<返回嵌入式吧
分享到:
©2026 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示