目录

一、链接地址与跳转

二、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学习笔记---第二篇相关推荐

  1. bootloader学习笔记---第一篇以stm32为例

    目录 一.bootloader的任务 二.bootloader开发的基础知识 段的概念 重定位的概念 散列文件的概念 异常向量(待补充) 三.最简单的bootloader程序 四.使用汇编跳转 五.备 ...

  2. 网络安全应急演练学习笔记第二篇之应急演练规划

    文章目录 0x05 应急演练规划 第一部分 制定演练规划 第二部分 设计演练方案 第三部分 应急演练保障 摘抄 0x05 应急演练规划 第一部分 制定演练规划 演练计划由总指挥部策划小组组织各参演单位 ...

  3. Hibernate学习笔记--第二篇 关联关系映射 many –to –one

    many –to –one 假设2个对象,分别是Person and Address . 1个Address中含有多个Person 分别建立类 package cn.itcase.hibernate. ...

  4. Linux学习笔记---命令篇

    Linux学习笔记-命令篇 本笔记是根据尚硅谷的Linux视频,经过自己的总结得出来的笔记,分为两个大章节,一-四章讲的是Linux的文件目录结构.vim编辑器.网络配置和系统管理.进程和服务.第二个 ...

  5. Vue学习笔记进阶篇——Render函数

    本文为转载,原文:Vue学习笔记进阶篇--Render函数 基础 Vue 推荐在绝大多数情况下使用 template 来创建你的 HTML.然而在一些场景中,你真的需要 JavaScript 的完全编 ...

  6. 视觉SLAM十四讲学习笔记-第二讲-开发环境搭建

    专栏系列文章如下: 视觉SLAM十四讲学习笔记-第一讲_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第二讲-初识SLAM_goldqiu的博客-CSDN博客 ​​​​​​​ lin ...

  7. MySQL学习笔记-基础篇1

    MySQL 学习笔记–基础篇1 目录 MySQL 学习笔记--基础篇1 1. 数据库概述与MySQL安装 1.1 数据库概述 1.1.1 为什么要使用数据库 1.2 数据库与数据库管理系统 1.2.1 ...

  8. 坐标变换学习笔记—代码篇Matlab

    坐标变换学习笔记-代码篇Matlab 四元数 →\to→ 旋转矩阵 quat2dcm quat2rotm 四元数 →\to→ 欧拉角 quat2angle quat2eul 旋转矩阵 →\to→ 四元 ...

  9. C# 学习笔记入门篇(上)

    文章目录 C# 学习笔记入门篇 〇.写在前面 Hello World! 这篇学习笔记适合什么人 这篇学习笔记到底想记什么 附加说明 一.命名空间 "进入"命名空间 嵌套的命名空间. ...

最新文章

  1. 领导者有3个要求,你做到了吗?
  2. php xingnengfenxi_PHP 性能分析与实验:性能的微观分析
  3. 字符转换属性text-tranform改变大小写
  4. bim 模型web页面展示_BIM+装配式建筑工程师2020年必须拿下的技能证书
  5. Kubernetes 环境搭建 - MacOS
  6. 圆柱属于能滚动的物体吗_小学人教版六年级下册数学第3章《圆柱的表面积》知识点+同步练习...
  7. how to connect to eduroam
  8. 1.第一本 docker 书 --- 简介
  9. JavaSE基础 ——流程控制语句
  10. 基于matlab的声音个数识别
  11. ARM体系结构与编程学习(七)
  12. 7-5 鸡兔同笼 C++编程练习
  13. 惠普服务器显示器接口类型,介绍:目前显示器主要接口
  14. 怎么开启远程重启服务器,怎么正确重启服务器
  15. 211逆袭浙大-计算机及相关衍生专业保研之路纪实(深度长文,收藏了)
  16. 使用Java播放wav音乐
  17. 如何简单有效的管理企业数据安全
  18. caniuse-lite is outdated. Please run next command `npm update`
  19. 魔教传奇—阿里软件的魔方文化
  20. windows安装paddlepaddle踩坑教程

热门文章

  1. win7 iis php mysql_windows7和iis配置的php phpinfo()中没有mysql组件
  2. markdown 表情包大法
  3. 解码失败会显示绿屏,及yuv和rgb简单理解
  4. 每天盯着桌面,送你几个4k、8k壁纸资源的网站,请收好
  5. 蓝桥杯 单片机 决赛 第7届 电压、频率采集设备
  6. 如何从google play下载apk
  7. java graphics2d旋转_JAVA用Graphics2D实现图片旋转,缩放,合成
  8. 再次携号转网_全国携号转网真来了!这些坑一定要小心!
  9. zabbix应用之详细的拓扑图标签--链路流量
  10. AP计算机科学笔记,AP想5分,不看过来人的笔记怎么行?