一种面向车载嵌入式设备的应用程序动态更新方法

文档序号:26139021发布日期:2021-08-03 14:22阅读:93来源:国知局

本发明涉及ecu动态升级技术领域,尤其是车辆ecu在正在运行中进行动态更新。的方法。



背景技术:

随着目前世界车辆数量的不断增加,以及物联网技术的不断发展,大量嵌入式设备不断涌现,汽车自动化程度越来越高,汽车会集成大量的ecu(electroniccontrolunit电子控制单元),软件成为了ecu中最主要的组成部分,对于车辆ecu中的程序迭代速度的不断加快,所需要的更新次数就不断增加。而目前ota技术虽然提高了软件更新的速度,但是需要车辆在停车并且关闭所有用电设备特定情况下才能进行更新。而且该操作比较繁琐,需要驾驶员对更新操作有一定理解才能进行操作。

一辆车通常有很多个ecu电控单元,而在升级时,目前的ota技术需要ecu的运行程序在静止状态的状态下才能进行更新,这极大的限制了更新的效率。



技术实现要素:

本发明提供一种面向车载嵌入式设备的应用程序动态更新方法,以解决现有ota远程升级ecu的方法存在局限性和缺陷的问题。

本发明采取的技术方案是,包括下列步骤:

步骤一:将生成好的软件更新包,通过以太网上http服务传至远程ota服务器端,远程ota服务器中存出着当前所加入ota服务器中车辆所有的ecu软件版本信息,通过新旧版本的软件版本号,对相应的车辆发送软件更新指令,通知相应车辆的tbox准备接收即将到来的软件更新包;

步骤二:车载tbox在接收到远端ota服务器的更新指令后,开启动态更新准备程序,开启http服务,及开启获取当前车辆其他ecu数据的程序,以及加载判断当前车辆运行状态是否符合动态要求的程序,以准备接收更新包,并通知远端ota服务器可以发送更新包;

步骤三:远端ota服务器开始发送更新包,待车载tbox接收到完整更新包后,通过md5校验码进行校验更新包的完整性,若不完整,通知远程ota服务器重新发送更新包;

步骤四:车载tbox获取车辆当前运行状态信息,即获取当前车辆其他ecu传感器信息,以得知当前安全车辆运行状态,3种安全车辆运行状态符合其中任意一种状态即满足动态更新要求,若满足动态更新要求,车载tbox通过can总线向待更新车载ecu发送更新指令,通知车载ecu准备接收tbox发送的更新包;

步骤五:车载ecu接收到tbox发送的指令后,开始加载车载ecu的动态更新引导程序,包括开启can总线的更新包的数据接收线程,待tbox开始发送更新包后,车载ecu开始进行接收更新包;

步骤六:车载ecu在接收到更新包之后,通过md5校验码校验更新包是否完整,若不完整,通知车载tbox重新发送更新包;

步骤七·:动态更新

(1)动态更新引导程序开始加载动态更新包,开始进行动态更新,ecu中运行的更新程序会修改当前运行程序中所有线程的下一条指令,采用加入信号量的方式使所有线程都进入阻塞状态,阻塞状态就是线程处于一个暂时停止的状态,在等待所有线程均进入阻塞状态后,依据线程运行的先后逻辑顺合并,在线程创建时会根据程序运行的逻辑对每一个线程进行分配优先级,通过线程优先级的高低,将现有的多个线程合并成一个进程运行;

(2)动态更新程序开始更新原程,将原内存中.data段所在地址的数据和所在地址.bss段的数据均更新成目前版本的新数据;

(3)动态更新程序遍历当前函数栈中存在的函数,存在于栈中存在的函数即为当前正在调用的函数,对于未存在于函数栈中的函数,将旧版函数的函数入口地址更改为新函数版本的函数地址;

(4)对于存在于函数栈的函数,将旧函数的内容与新函数的内容同时加载到一个辅助线程中运行,辅助进程是为更新正在被调用函数的一个进程,该进程在动态更新开始时已经加载到内存中开始运行;当遍历函数栈时获得当前正在运行的函数名称,通过得到的函数名称,通过函数名称将旧版的函数加载辅助进程中。在制作新版更新包时,会创建一个新旧函数对应表,该对应表采用c++stl库用map的方式对应存在新版本的更新包中,其中包含新旧函数的对应关系,通过遍历该map得知,正在函数栈中调用的函数存在有需要更新的函数,对于需要的更新的函数,同时将新版本的函数加载到辅助进程中,对于不需要更新的函数继续使用原来旧版的函数;辅助进程中存在一种判断程序语义歧义的问题,通过在新版函数中,通过人工标记可以更新的安全位置,安全位置即可以进行动态更新的位置,更新后不存在语义歧义的问题;因为辅助线程中存在新旧2个版本的函数,在没有到达安全位置时,辅助进程运行旧版本的函数,一旦到达了新版本的位置将跳转到新版本的函数位置继续运行;

步骤八:由更新执行监控子系统监控软件更新状态,若更新成功,将更新结果上传至远端ota服务器;若更新失败将结果上传至更新服务器,并告知服务器即将进行下一次动态更新,返回至第五步执行。

本发明所述步骤四中安全车辆运行状态包括:车辆处于等待红灯状态,车辆自动变速箱处于n挡或p挡状态,及车辆处于续航定速状态。

本发明所述步骤七(2)中.bss是指用来存放程序中未初始化的或者初始值为0的全局变量的一块内存区域序中所有静态变量,.data数据段(datasegment)是指用来存放程序中已初始化的全局变量的一块内存区域,数据段属于静态内存分配。

本发明远端服务器通过汽车ecu上报的程序信息,和现存在的ecu最新程序版本进行对比,对需要升级的ecu所在车辆的tbox发送车辆ecu即将更新的指令,tbox在接收到更新包后,通过can总线对ecu发送更新包,ecu在接收到更新包等待tbox发送更新指令,ecu在接收到tbox的更新指令后开始进行动态更新,更新完成·。

本发明的优点是:

一、解决了现有软件更新迭代速度慢,及更新步骤繁杂的问题,及时修复软件中存在的漏洞。

二、由于车辆上安全性相关的嵌入式设备需要长时间上电运行,传统软件更新方法会导致重启设备后数据丢失,动态更新方法可以保证不影响原程序运行的情况下,完成软件的更新,保护了原始数据不丢失。

三、目前应用在服务器上动态更新的方法存在多线程同时更新死锁的问题,由于车载嵌入式设备要求极高的系统稳定性,针对嵌入式设备,该方法可以良好的解决现有动态更新方法中存在死锁的问题。

四、在辅助线程中,由于同时存在新版本的函数与旧版本的函数,到达安全更新位置时,程序将会跳转到新函数的位置继续运行,完成正在运行的函数的更新。和目前主流的动态更新方法相比,现有程序动态更新通常在函数栈中的函数不能进行动态更新,这就导致了更新程序存在语义歧义问题,从而导致更新失败,采用辅助进程的方式不仅解决了函数语义歧义的问题,而且解决了多线程资源死锁的问题。

具体实施方式

远端服务器通过在数据库中存储的车辆vin唯一识别码对相应的车辆下发需要更新的版本信息。vin(vehicleidentificationnumber车辆识别码)码包含了车辆的生产厂家、年代、车型、车身型式及代码、发动机代码及组装地点等信息,每辆车的vin码是唯一的,能够有效表明车辆的身份。因此,通过接收vin码,对于快速正确地识别车型,以致进行正确地诊断和维修都是十分重要的。

首先采用nxp公司,imx6q开发板作为车载tbox端的模拟设备内置linux操作系统,采用nxp的imx6ull开发板模拟车载ecu控制单元内置linux操作系统,采用centos7操作系统搭建的linux服务器作为远程ota服务器。包括下列步骤:

步骤一:将生成好的软件更新包,通过以太网上http服务传至远程ota服务器端,远程ota服务器中存出着当前所加入ota服务器中车辆所有的ecu软件版本信息,通过新旧版本的软件版本号,对相应的车辆发送软件更新指令,通知相应车辆的tbox准备接收即将到来的软件更新包。

步骤二:车载tbox在接收到远端ota服务器的更新指令后,开启动态更新准备程序,开启http服务,及开启获取当前车辆其他ecu数据的程序,以及加载判断当前车辆运行状态是否符合动态要求的程序,以准备接收更新包,并通知远端ota服务器可以发送更新包;

步骤三:远端ota服务器开始发送更新包,待车载tbox接收到完整更新包后,通过md5校验码进行校验更新包的完整性,若不完整,通知远程ota服务器重新发送更新包;

步骤四:车载tbox获取车辆当前运行状态信息,即获取当前车辆其他ecu传感器信息,以得知当前车辆运行状态。安全车辆运行状态包括,车辆处于等待红灯状态,车辆自动变速箱处于n挡或p挡状态,及车辆处于续航定速状态,3种状态符合其中任意一种状态即满足动态更新要求。若满足动态更新要求,车载tbox通过can总线向待更新车载ecu发送更新指令,通知车载ecu准备接收tbox发送的更新包。

步骤五:车载ecu接收到tbox发送的指令后,开始加载车载ecu的动态更新引导程序,包括开启can总线的更新包的数据接收线程。待tbox开始发送更新包后,车载ecu开始进行接收更新包。

步骤六、车载ecu在接收到更新包之后,通过md5校验码校验更新包是否完整,若不完整,通知车载tbox重新发送更新包。

步骤七、动态更新

(1)动态更新引导程序开始加载动态更新包,开始进行动态更新。ecu中运行的更新程序会修改当前运行程序中所有线程的下一条指令,采用加入信号量的方式使所有线程都进入阻塞状态,阻塞状态就是线程处于一个暂时停止的状态,在等待所有线程均进入阻塞状态后,依据线程运行的先后逻辑顺合并,在线程创建时会根据程序运行的逻辑对每一个线程进行分配优先级,通过线程优先级的高低,将现有的多个线程合并成一个进程运行,通过该合并方法解决了现有动态更新方法中线程之间争夺资源而存在的死锁问题。

(2)动态更新程序开始更新原程,将原内存中.data段所在地址的数据和所在地址.bss段的数据均更新成目前版本的新数据,.bss通常是指用来存放程序中未初始化的或者初始值为0的全局变量的一块内存区域序中所有静态变量,.data数据段(datasegment)通常是指用来存放程序中已初始化的全局变量的一块内存区域,数据段属于静态内存分配。

(3)动态更新程序遍历当前函数栈中存在的函数,存在于栈中存在的函数即为当前正在调用的函数,对于未存在于函数栈中的函数,将旧版函数的函数入口地址更改为新函数版本的函数地址。

(4)对于存在于函数栈的函数,将旧函数的内容与新函数的内容同时加载到一个辅助线程中运行,辅助进程是特殊为更新正在被调用函数的一个进程,该进程在动态更新开始时已经加载到内存中开始运行,其特点一在于,当遍历函数栈时获得当前正在运行的函数名称,通过得到的函数名称,通过函数名称将旧版的函数加载辅助进程中。在制作新版更新包时,会创建一个新旧函数对应表,该对应表采用c++stl库用map的方式对应存在新版本的更新包中,其中包含新旧函数的对应关系,通过遍历该map得知,正在函数栈中调用的函数存在有需要更新的函数,对于需要的更新的函数,同时将新版本的函数加载到辅助进程中,对于不需要更新的函数继续使用原来旧版的函数。其特点二在于,辅助进程中存在一种判断程序语义歧义的问题,通过在新版函数中,通过人工标记可以更新的安全位置,安全位置即可以进行动态更新的位置,更新后不存在语义歧义的问题。因为辅助线程中存在新旧2个版本的函数,在没有到达安全位置时,辅助进程运行旧版本的函数,一旦到达了新版本的位置将跳转到新版本的函数位置继续运行。

步骤八:由更新执行监控子系统监控软件更新状态,若更新成功,将更新结果上传至远端ota服务器。若更新失败将结果上传至更新服务器,并告知服务器即将进行下一次动态更新,返回至第五步执行。

优点:在辅助线程中,由于同时存在新版本的函数与旧版本的函数,到达安全更新位置时,程序将会跳转到新函数的位置继续运行,完成正在运行的函数的更新。和目前主流的动态更新方法相比,现有程序动态更新通常在函数栈中的函数不能进行动态更新,这就导致了更新程序存在语义歧义问题,从而导致更新失败,采用辅助进程的方式不仅解决了函数语义歧义的问题,而且解决了多线程资源死锁的问题。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1