什么是bootloader?

百度百科解释:
Bootloader是嵌入式系统在加电后执行的第一段代码,在它完成CPU和相关硬件的初始化之后,再将操作系统映像或固化的嵌入式应用程序装载到内存中然后跳转到操作系统所在的空间,启动操作系统运行。
这和汽车嵌入式开发多少有点不一样
ISO14229中的给出的程序执行流程:

由上图可知,一个ECU包含了三部分 Boot Manager、Application Software以及Boot Software,其中Boot Software由Boot Manager和Reprogramming Software组成,在汽车嵌入式中,我们常说的bootloader就是Boot Software。

为什么要用bootloader?

我们先假设这样一个场景:车辆某个ECU只有Application Software,由于某种故障导致该ECU的Application Software异常,进而导致车辆故障,不能使用。既然属于Application Software问题,软件工程师修复好Application Software以后,重新将Application Software刷写进该ECU即可。问题来了:怎么将修复好的Application Software刷写进该ECU?

为了解决这个问题,Bootloader应运而生,即:Bootloader是为更新Application Software而存在。既然是为更新Application Software而存在,Bootloader就没有必要时常更新。当车辆下线以后,Bootloader就固化在ECU指定内存区,不做更新,而Application Software可能会因用户的需求存在升级的可能。

Bootloader如何更新App Software

1、程序上电流程

了解Bootloader如何更新Application Software之前,我们需要先了解程序上电的执行流程。

如“图1 Application与Boot Software交互”所示:当ECU上电或者程序复位以后,最先执行Boot Manager代码,在这个过程中检查一下Application程序更新标志:ProgrammingRequest,判断一下Application是否请求升级。如果Application没有请求升级,那么再判断一下ApplicationValid标志,看看Application程序是否有效,如果有效就跳转到Application程序,即Application的主程序(main函数)。注意:如果是多核系统,跳转到core0_main()主程序,如果是单核系统,跳转到单核的main()程序;如果Application请求升级,程序跳转到Reprogramming Software,此时开始,Reprogramming Software对Application Software进行升级。

多核系统补充:以英飞凌tc397为例,其包含6个核,1个主核与5个从核。为了区分每个核的应用程序主函数,用户可以自定义应用程序主函数名称,示例:

void core0_main (void);
void core1_main (void);
void core2_main (void);
void core3_main (void);
void core4_main (void);
void core5_main (void);

2、Application Software程序升级步骤

对于汽车ECU的Application Software升级,OEM几乎都是遵循UDS规范。

Application Software程序升级主要分为三个阶段:Pre-Programming Step、Programming Step、Post-Programming Step

2.1、Pre-Programming Step


此阶段的主要​做一些Application Software升级前的检查,确保正式升级Application软件之前,车辆工况的安全性。这里举几个常见的检查条件:车速、诊断电压、KL15信号有效性等。

车速:约束车速<3Km/h,也就是说不允许车辆行驶过程中进行软件升级。
诊断电压:诊断电压会约束在一定的范围,比如:9V~16V,避免升级过程中,因电压过低或者过高导致刷写失败。
KL15信号有效性:为了确保收到的信号质量,一般会检查这个信号的有效性(Valid or Invalid),有效的信号才能确保升级过程中的稳定性。

当然,每家OEM的条件检查可能有所区别,但是,都为一个目的:安全。

2.2、Programming Step

经过了前面车辆工况的安全检查,此时可以进行Application Software的软件升级。Application Software的软件遵循UDS协议,主要流程如下:

**Step1:**进入编程会话,只有特定的工况下(编程会话)才能进行Application Software升级。
**Step2:**进行安全检查,通过OEM指定的算法进行Key的比对,主要是确认操作人员的合法性。就好比每个人只有自家的钥匙,自家的钥匙只能打开自家的门,而不能打开别人家的门一样,也就是Key的唯一性。
**Step3:**写指纹信息,比如Application程序的软件版本号等。
**Step4:**此过程将Flash Driver下载到ECU中,为擦除旧的Application Software做准备,确切说是下载内存擦除例程(memory erase routine)。一般Flash Driver不会放在ECU内部,担心程序异常跑到Flash Driver位置,将有效的Application擦除,所以,Flash Driver只有在Application程序升级时下载到ECU的RAM区。
**Step5:**检查Flash Driver的有效性,只有Flash Driver成功下载,之后的Application程序擦除和更新才能成为可能。
**Step6:**执行旧Application程序的擦除。
Step7Step8**:与**Step4Step6功能类似,这里是下载Flash Driver的内存编程例程(memory programming routine)。在实际项目中,Step4~Step8就是Flash Driver的下载,包括memory erase routine和memory programming routine。
**Step9:**刷写新的Application Software到ECU。
**Step10:**更新Application Software以后,需要检查下载数据的完整性,确保数据可靠。

**Step11:**检查Application Software的有效性,比如签名(signature)是否正确等。

**Step12:**写配置信息,比如车辆VIN等。

2.3、Post-Programming Step

此阶段主要是Application Software更新后的网络恢复,即:Application Software更新好以后,重新参与工作。

常用的做法就是执行ECU Reset,也可以让诊断刷写的S3时间超时,程序重新复位。

什么是bootloader?相关推荐

  1. ARM的位置无关程序设计在Bootloader中的应用

    http://www.mcuol.com/tech/107/26052.htm 引言 基于位置无关代码PIC(PositionIndependent Code)的程序设计在嵌入式应用系统开发中具有重 ...

  2. BootLoader与MCU启动过程

    STM32那点事(1)_STM32F40_41xx启动文件详解 STM32 官方为广大开发者提供一套统一开发固件,主要是屏蔽寄存器封装,提供初始化等功能,较少开发者负担.只需要调用相关模块封装,对相关 ...

  3. grub2引导linux内核,一种基于grub2的linux系统启动bootloader的制作方法与流程

    技术领域 本发明涉及服务器应用技术领域,具体涉及一种基于grub2的linux系统启动bootloader的制作方法. 背景技术: 当前linux系统的内核版本已经升级至4.0以上,最新的linux系 ...

  4. Bootloader

    在嵌入式操作系统中,BootLoader是在操作系统内核运行之前运行.可以初始化硬件设备.建立内存空间映射图,从而将系统的软硬件环境带到一个合适状态,以便为最终调用操作系统内核准备好正确的环境.在嵌入 ...

  5. 利用Arduino Nano 对于另外的Arduino控制板下载Bootloader

    简 介: 测试了利用Nano板对于基于MEGA328的Arduino的Bootloader下载,在此基础之上,利用了FT232TL的USB-TTL UART模块对测试MEGA328下载执行程序. 关键 ...

  6. bootloader烧写

    http://blog.chinaunix.net/space.php?uid=7313069&do=blog&id=1676091 关于bootloader,先简要地总结一下.经过了 ...

  7. Bootloader的分区和启动

    Bootloader大多是两阶段启动过程.第一阶段使用汇编来实现,完成一些依赖于CPU体系结构的初始化,并调用第二阶段的代码:第二阶段则通常使用C语言来实现,这样可以实现更复杂的功能,有更好的可读性和 ...

  8. bootloader详解(转载)

    一.bootloader介绍 bootloader是硬件在加电开机后,除BIOS固化程序外最先运行的软件,负责载入真正的操作系统,可以理解为一个超小型的os.目前在Linux平台中主要有lilo.gr ...

  9. mini2440通过JLink烧写BootLoader到Nor Flash

    开发板:友善之臂mini2440,64M Nand Flash 操作系统:Win7 电脑:笔记本Lenovo Y450 连接器:由于我的笔记本没有并口,所有买了个J-Link和转接板 软件:JLink ...

  10. Linux内核启动速度优化,嵌入式Linux启动时间优化的秘密之五-Bootloader

    描述 本文主要讲述嵌入式Linux启动时间优化的秘密,我们继续上篇没有讲完的嵌入式Linux启动时间优化方法,本文主要会讲Bootloader.想看上一篇的请查看本文结尾的链接. Bootloader ...

最新文章

  1. 计算机书籍-医学图像数据可视化分析与处理
  2. java 自定义对话框_Java经典实例:用户自定义对话框
  3. mysql 层级 统计_MySQL系列(7)
  4. 2篇word文档比较重复率_继续教育 | 你该知道的论文小技巧——重复率检测
  5. linux睿频是自动的吗,Linux限制cpu睿频限制频率
  6. 如何定义一个 Listint,string 这样的 List ?
  7. Android之Android Studio 快捷键整理分享
  8. Windows环境下多个tomcat启动,CATALINA_HOME配置(大坑)
  9. (11)Zynq SPI控制器介绍
  10. conda 命令 直接安装 OpenCV[Anaconda]
  11. 导致存储过程重新编译的原因
  12. C语言的隐式类型转换
  13. Oracle GoldenGate Director安装配置详细手册
  14. Alienware-17-R4-630-1060-MacOS 笔记本双显卡 外星人黑苹果hackintosh 10.15
  15. 快速串联 RNN / LSTM / Attention / transformer / BERT / GPT
  16. datawhale 8月学习——NLP之Transformers:编写BERT模型
  17. QtCreator插件开发(四)——QtCreator编辑器
  18. C语言中||和能同时出现在一条语句中吗?
  19. C++:getenv setenv -- 获取设置系统环境变量
  20. Macbook充电和电池保养的标准答案

热门文章

  1. ChatGPT的出圈与大佬们的焦虑
  2. AccessibilityService之微信抢红包辅助功能实现
  3. 关于交友网站的开发分享(漂流瓶功能)
  4. SQL Server 数据类型详解
  5. windows上帝模式是什么:一键开启windows7上帝模式、windows10上帝模式、win11上帝模式的小工具,无需windows上帝模式代码
  6. javascript 中感叹号的用法
  7. 捕鱼系列之2:magic3d粒子系统简介
  8. 2021最新Java零基础自学路线图(全套视频教程)
  9. 史蒂夫•鲍尔默(Microsoft)
  10. 【C++】入门(上)