bootloader学习笔记---第二篇
目录
一、链接地址与跳转
二、bootloader疑难问题
1、应用程序中使用中断导致程序跑飞或者不能重新下载程序?
2、中断向量表具体是怎么重映射?
3、bootloader更新app过程中意外断电,怎么处理?流程是先备份后擦出然后烧写吗?
4、botloader烧写app程序过程中突然断电或者断开连接导致bootloader无法使用,必须重新烧写,这是什么原因呢?
5、怎么将BOOT程序和APP程序一起烧进板子?
6、第一,多核芯片是否给每个核编写一个bootloader,并分别放在每个核相应的flash里?第二,上位机软件下发的信息是否可以通过ID来区分送到哪个核里?第三,上位机软件是不是必须和CAN盒子配套?
7、bootloader升级过程很慢,100k左右的s19文件需要十多分钟?
8、boot程序,对于app的跳转地址有什么要求?boot程序比较大,跳转地址是0x25000,跳转总是失败?
9、可以直接从APP区域跳转到到BOOT区域直接升级,而不用经过一个重启的过程吗?正常项目都是APP启动升级的
10、boot 更新app的时候,将flash drv(擦除,写入等风险操作函数)临时通过can从上位机下载到ram中并运行,通过修改链接文件指定自定义的一块ram,可以把收到的flash drv的数据放到这块地址,在执行擦除或者写入操作时,1.怎么找到擦除或写入函数的ram地址并执行?2.如果可以找到地址,怎么往擦除或写入函数传递参数(这两个函数知道ram地址,不是函数,怎么传递参数)?
11、将地址强制转换为函数指针调用,会造成hard fault interrupt?
三、备注
一、链接地址与跳转
这里讨论第一篇文章中提到的第二种情况,即第二种常见的情况就是app烧写在flash上,app应该在ram内存里运行,app或者是bootloader需要把app拷贝到内存ram中去,1、如果是bootloader拷贝的,那么bootloader要跳转到内存ram中去执行app;2、如果是app自己把自己复制到内存中去的,那么bootloader直接跳转到app的位置就可以了。
这里有三个问题,1、谁把app从flash复制到ram中去?2、具体是复制到哪里?3、如果bootloader要跳转到ram中去怎么跳?
第一个问题,app自我复制,bootloader帮忙复制;第二个问题,这个地址我们可以预先设置好;第三个问题,用函数指针跳转。
下面介绍两种跳转方式。
第一、相对跳转,BL main; 这是条汇编语句,这条语句会让pc=当前pc+相对位移。不管我们程序放在哪里,相对跳转都能成功。编译器是默认优先使用相对跳转。
第二、绝对跳转,是让pc=要跳转的地址。比如,LDR r5 , [pc, #24] BLX r5。函数指针的方式也是绝对跳转的方式。对于绝对跳转,在对应的地址上面必须有对应的代码。stm32上电后第二件事情就是跳转到Reset_Handler中去,这也是绝对跳转。如果是长距离调用,也会使用绝对跳转。如果是绝对跳转,我们程序烧录的位置如果发生变化,即我们烧录的地址和链接文件(散列文件)中指定的地址不一致,那么跳转过去的地址就会出现错误,因为跳转的绝对地址的那块内存可能没有初始化,程序会崩溃。
如果我们如上图那样使用散列文件修改了app程序的链接地址,那么app程序会把指令和数据放在0x20000000。那么这相当于,bootloader跳转到app中,app自己把自己复制到0x20000000。可以看到散列文件中,链接地址和加载地址都是同一个地址,链接地址就是运行时的地址,我们可以使用烧录工具来决定程序的烧录地址,在这里加载地址没有用,只有链接地址有用。
上面的代码是app自己复制自己到内存的
第二种情况,需要bootloader把app复制到内存中去时,app文件的头部一般会包含以下几种信息,1、加载地址:即要拷贝到内存的那个地址,2、入口地址:即第一条指令地址,3、长度,4、CRC。
这就需要bootloader启动后需要去app的烧录地址读取这些头部信息,接着解析这些头部信息,然后读取app.bin存入内存,最后跳转到内存中去执行app程序。
解析头部信息,需要注意的是,存储方式是大字节序还是小字节序,
这里我补充一个知识点:我们在对flash进行读写操作时,flash中对应的应用程序文件将不能运行,所以必须将flash driver拷贝到ram区域,这是由flash的硬件性质决定的,为什么呢?
因为,flash只有一套自己的crossbar(类似交叉开关,同一时刻只能执行一种操作)访问总线,当其被用作写数据时,不能同时读取数据(譬如CPU取指执行程序)。但在支持RWW partition的flash中是不必如此操作的,它支持在不同flash分区同时进行读和写。
二、bootloader疑难问题
1、应用程序中使用中断导致程序跑飞或者不能重新下载程序?
这个要看具体的MCU(内核),一个原则是使能中断和异常发生之前必须确保其中断向量表和中断/异常ISR已经ready。
2、中断向量表具体是怎么重映射?
更改向量表基地址寄存器,也叫中断向量表偏移量寄存器,中断向量表的重定向可以是在bootloader进入用户程序之前改,也可以在用户程序里面改,对于在Cortex-M3内核的MCU上可以通过设置SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET,关于这个寄存器的描述可以见下图;该寄存器的值来实现中断向量表的重定义。如果没有这类的寄存器可以参考这位博主的办法尝试解决STM32F0芯片IAP实现之中断向量表重映射(没有中断向量表偏移寄存器SCB->VTOR的应对方法)_a只如初见的博客-CSDN博客_中断重映射
3、bootloader更新app过程中意外断电,怎么处理?流程是先备份后擦出然后烧写吗?
一般是双应用程序分区,更新完新的应用程序之后才擦除老的应用程序分区并设置跳转标志,以保证时钟有一个分区中的应用程序正确可用。
4、botloader烧写app程序过程中突然断电或者断开连接导致bootloader无法使用,必须重新烧写,这是什么原因呢?
如果应用程序新过程中断电或者意外复位,则应用程序更新失败,相应的应用程序完整性校验通不过,当然得重新下载,为了避免这种情况下应用程序丢失,常常BootLoader需要对应用程序进行双备份,即使用两个不同的NVM分区来保存应用程序,只有新的应用程序更新成功之后,才擦除老的应用程序。
5、怎么将BOOT程序和APP程序一起烧进板子?
用任意文本编辑器打开bootloader和app工程生成的S19文件拷贝即可合并,然后使用调试器通过SWD/JTAG接口下载即可。
6、第一,多核芯片是否给每个核编写一个bootloader,并分别放在每个核相应的flash里?第二,上位机软件下发的信息是否可以通过ID来区分送到哪个核里?第三,上位机软件是不是必须和CAN盒子配套?
多核MCU只需要为其boot CPU core开发一个bootloader就可以了,可以通过ID或者地址来判断,可以复用我们的上位机软件,但其只有简单功能,要用这个上位机软件需要使用匹配的CAN适配器,否则需要修改底层dll以适用于其他CAN适配器
7、bootloader升级过程很慢,100k左右的s19文件需要十多分钟?
Flash擦除本身很耗时间,另外,可以在将S19文件每行的数据设置为更长(比如128字节或者512字节)或者把bootloader里面改为接收10行s19再烧写,提高Flash烧写效率,再或者就是提高通信速率
8、boot程序,对于app的跳转地址有什么要求?boot程序比较大,跳转地址是0x25000,跳转总是失败?
这个要看跳转具体是如何实现的?要反汇编看看具体的汇编跳转指令,不同的汇编跳转指令支持的跳转地址范围不同。
9、可以直接从APP区域跳转到到BOOT区域直接升级,而不用经过一个重启的过程吗?正常项目都是APP启动升级的
可以在APP中接收到boot请求后使用函数指针直接跳转到bootloader的reset_handler,但需要在跳转之前反初始化/复位APP使用的所有时钟和外设,以避免APP与bootloader的相互影响。当然,我们推荐的方式还是软件复位或者看门狗溢出复位进入bootloader。
10、boot 更新app的时候,将flash drv(擦除,写入等风险操作函数)临时通过can从上位机下载到ram中并运行,通过修改链接文件指定自定义的一块ram,可以把收到的flash drv的数据放到这块地址,在执行擦除或者写入操作时,1.怎么找到擦除或写入函数的ram地址并执行?2.如果可以找到地址,怎么往擦除或写入函数传递参数(这两个函数知道ram地址,不是函数,怎么传递参数)?
第1个问题,使用函数查找表,类似中断向量表的工作原理;第2个问题使用函数指针,因为函数名本身就是地址,我们可以定义一个和flash drv相同格式的函数指针,然后向这个函数指针传递的参数就是传递给了flash drv函数;
11、将地址强制转换为函数指针调用,会造成hard fault interrupt?
typedef void(*pfun_t)(void);pfun_t pfun = (pfun_t)0x00500000;
pfun();
注意是把中断向量(中断ISR函数地址,存在中断向量表地址的内容)而不是中断向量地址本身转换成函数指针执行。
三、备注
本文部分内容是根据韦东山老师的视频整理编写的笔记从0写BootLoader(适用于单片机),还有部分公众号中汽车电子expert成长之路的文章评论,部分图片来自于cortex-m3权威指南。
=文档信息=
本学习笔记由博主整理编辑,仅供非商用学习交流使用
由于水平有限,错误和纰漏之处在所难免,欢迎大家交流指正
如本文涉及侵权,请随时留言博主,必妥善处置
版权声明:非商用自由转载-保持署名-注明出处
bootloader学习笔记---第二篇相关推荐
- bootloader学习笔记---第一篇以stm32为例
目录 一.bootloader的任务 二.bootloader开发的基础知识 段的概念 重定位的概念 散列文件的概念 异常向量(待补充) 三.最简单的bootloader程序 四.使用汇编跳转 五.备 ...
- 网络安全应急演练学习笔记第二篇之应急演练规划
文章目录 0x05 应急演练规划 第一部分 制定演练规划 第二部分 设计演练方案 第三部分 应急演练保障 摘抄 0x05 应急演练规划 第一部分 制定演练规划 演练计划由总指挥部策划小组组织各参演单位 ...
- Hibernate学习笔记--第二篇 关联关系映射 many –to –one
many –to –one 假设2个对象,分别是Person and Address . 1个Address中含有多个Person 分别建立类 package cn.itcase.hibernate. ...
- Linux学习笔记---命令篇
Linux学习笔记-命令篇 本笔记是根据尚硅谷的Linux视频,经过自己的总结得出来的笔记,分为两个大章节,一-四章讲的是Linux的文件目录结构.vim编辑器.网络配置和系统管理.进程和服务.第二个 ...
- Vue学习笔记进阶篇——Render函数
本文为转载,原文:Vue学习笔记进阶篇--Render函数 基础 Vue 推荐在绝大多数情况下使用 template 来创建你的 HTML.然而在一些场景中,你真的需要 JavaScript 的完全编 ...
- 视觉SLAM十四讲学习笔记-第二讲-开发环境搭建
专栏系列文章如下: 视觉SLAM十四讲学习笔记-第一讲_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第二讲-初识SLAM_goldqiu的博客-CSDN博客 lin ...
- MySQL学习笔记-基础篇1
MySQL 学习笔记–基础篇1 目录 MySQL 学习笔记--基础篇1 1. 数据库概述与MySQL安装 1.1 数据库概述 1.1.1 为什么要使用数据库 1.2 数据库与数据库管理系统 1.2.1 ...
- 坐标变换学习笔记—代码篇Matlab
坐标变换学习笔记-代码篇Matlab 四元数 →\to→ 旋转矩阵 quat2dcm quat2rotm 四元数 →\to→ 欧拉角 quat2angle quat2eul 旋转矩阵 →\to→ 四元 ...
- C# 学习笔记入门篇(上)
文章目录 C# 学习笔记入门篇 〇.写在前面 Hello World! 这篇学习笔记适合什么人 这篇学习笔记到底想记什么 附加说明 一.命名空间 "进入"命名空间 嵌套的命名空间. ...
最新文章
- 领导者有3个要求,你做到了吗?
- php xingnengfenxi_PHP 性能分析与实验:性能的微观分析
- 字符转换属性text-tranform改变大小写
- bim 模型web页面展示_BIM+装配式建筑工程师2020年必须拿下的技能证书
- Kubernetes 环境搭建 - MacOS
- 圆柱属于能滚动的物体吗_小学人教版六年级下册数学第3章《圆柱的表面积》知识点+同步练习...
- how to connect to eduroam
- 1.第一本 docker 书 --- 简介
- JavaSE基础 ——流程控制语句
- 基于matlab的声音个数识别
- ARM体系结构与编程学习(七)
- 7-5 鸡兔同笼 C++编程练习
- 惠普服务器显示器接口类型,介绍:目前显示器主要接口
- 怎么开启远程重启服务器,怎么正确重启服务器
- 211逆袭浙大-计算机及相关衍生专业保研之路纪实(深度长文,收藏了)
- 使用Java播放wav音乐
- 如何简单有效的管理企业数据安全
- caniuse-lite is outdated. Please run next command `npm update`
- 魔教传奇—阿里软件的魔方文化
- windows安装paddlepaddle踩坑教程
热门文章
- win7 iis php mysql_windows7和iis配置的php phpinfo()中没有mysql组件
- markdown 表情包大法
- 解码失败会显示绿屏,及yuv和rgb简单理解
- 每天盯着桌面,送你几个4k、8k壁纸资源的网站,请收好
- 蓝桥杯 单片机 决赛 第7届 电压、频率采集设备
- 如何从google play下载apk
- java graphics2d旋转_JAVA用Graphics2D实现图片旋转,缩放,合成
- 再次携号转网_全国携号转网真来了!这些坑一定要小心!
- zabbix应用之详细的拓扑图标签--链路流量
- AP计算机科学笔记,AP想5分,不看过来人的笔记怎么行?