当下ECU软件开发的挑战
随着软件技术的发展,车辆的开发过程从硬件主导转变为软件定义汽车(SDV),软件开发在汽车的开发过程中扮演着举足轻重的角色。车辆E/E架构由原先的各ECU只负责单一功能的分布式架构,转变为高性能计算单元(HPC)和区域控制单元(Zonal ECU)分工协作的架构。因此,ECU的软件功能越来越多,越来越复杂。ECU的软件开发,也将引入不同部门、不同公司的更多项目开发人员的协作。在ECU软件开发变得更加复杂更加紧密协作的同时,软件的版本迭代周期也变得越来越短。
传统的工作流程和开发过程难以满足这些要求,因此以DevOps为导向的持续集成方法正成为新的趋势。然而,由于AUTOSAR Classic项目的单一工程结构,实现AUTOSAR Classic ECU软件开发的持续集成并不是一项容易的任务。根据项目的部署和开发过程,可以观察到以下三种方式及挑战。
1.1 基于功能开发中的合并冲突问题
将项目中各成员的增量(设计、配置和实现)合并是一个重大挑战,特别是基于各功能团队独立开发的模式。对于AUTOSAR Classic项目(图1-1),基于功能的开发方式意味着项目成员开发应用软件(SWC),并自行将其集成到基础软件(BSW)中。这种方法可以应用于独立完整的SWC,也可以应用于与其他项目成员协作开发的SWC。
图1-1 基于功能的开发方式
1.2 基于组件开发的集成滞后问题
另一种方法是将工作角色划分为项目内更专业的角色,这里定义为基于组件的开发方式(图1-2)。在这种项目开发方式中,有专注于SWC的应用开发人员,以及一个软件集成团队负责配置BSW,并将SWC和BSW进行集成。
图1-2 基于模块的开发方式
在这种情况下,应用开发人员既无法访问BSW的配置,也无法使用工具将SWC与BSW集成。相比于基于功能的开发方式(每个项目成员可以独立处理自己的功能),在基于组件的开发方式中,应用开发人员依赖于软件集成团队。
图1-3 基于模块的开发方式的集成流程
这种方法的好处是减少了合并问题,缺点是集成的总时长增加了。软件集成团队只能在应用开发人员完成他们的工作后才开始集成,而且集成必须根据软件集成团队的可用时间进行安排。据应用开发人员的反馈,许多人等待他们的SWC与BSW集成的时间在1到4周之间,导致验证延迟,发现问题延迟,最终可能会危及项目的里程碑。图1-3描述了这种集成流程。
1.3 手动集成中的重复工作问题
在传统的基于DaVinci Configurator Classic GUI的工作模式中,将SWC与BSW集成需要许多手动步骤(图1-4)。
图1-4 手动集成步骤
首先,需要打开DaVinci Configurator Classic并将SWC加载到项目中。接下来,针对每个 SWC需要执行以下重复的步骤:
手动配置RTE,例如将Runnable映射到Task,将NvSWC连接到对应部分,创建或调整内存块,以及添加数据映射;
配置完成后,需要验证配置,并解决可能存在的问题。
在SWC和Runnable数量庞大的大型项目中,这种重复的集成活动将非常耗时,并且会花费大量人力。因此,手动集成步骤的自动化实现,对缩减项目集成时间,降低集成的人力成本,加快版本发布,都能带来极大的好处。
如何解决这些挑战?
上述挑战,使得ECU的软件开发过程变得繁琐,且迭代周期变得滞后。为了应对这些挑战,DaVinci Team提供一种分布式开发团队高效协作的解决方案。基本概念如下:
SWC和BSW解耦;
前移集成决策(例如,Runnable和Task的映射、端口映射、数据映射或NvM集成决策),以便于SWC开发人员能够自行将SWC与BSW集成;
提供一个自动化Pipeline,自动执行SWC与BSW集成的步骤。
结合支持自动化的工具,基于定制的持续集成Pipeline,工程师能够独立工作,并省去大量的重复工作。
2.1 基于组件开发的集成滞后问题
使用DaVinci Team,可以通过不同的方式组织项目,从而显著解决前文提到的这些挑战。首先是拆分项目(图2-1)使得SWC与BSW解耦并将BSW定义为Root Configuration。
对于优化工作流程至关重要的一步是移除RTE并为SWC添加集成指令(Integration Instruction)。这完全避免了RTE的合并,解决了合并项目增量时经常遇到的冲突问题。
图2-1 DaVinci Team工作流程
关于SWC,需要由SWC开发人员将其分解为App Package。这种分解的最大好处是限制合并冲突,并通过Instruction文件来管理App Package,从而实现持续集成。
在此背景下,App Package定义如下:
SWC组件(ARXML)
源代码或库文件
Instruction文件(Task Mapping、Port Mapping、Data Mapping等JSON文件)
图 2-2 示例App-Package
图2-2显示了一个示例App Package。这些JSON格式的Instruction文件描述了RTE应该如何构建(下一章中将详细说明)。
尽管项目被拆分成多个包,用户仍然可以自由选择他们喜欢的开发方法。这只是一个在仓库中组织包的问题:包含所有包的单一仓库(适用于基于功能的开发方法)或创建多个仓库,每个仓库包含单一的包(适用于基于组件的开发方法)。
2.2 前移集成决策
App Package作为DaVinci Team的输入,包含了JSON格式的Integration Instruction。为了在不同角色之间实现高效协作,也可以为整个项目定义全局集成指令(Global Integration Instruction),不同集成角色将使用不同类型的Integration Instruction。
> 显式映射
这种类型的Integration Instruction可用于明确定义映射关系。例如,在Task映射的示例中,可以定义哪些runnable应该映射到哪些Task。如图2-3所示,runnable0和runnabl1需要映射到task0,并且在JSON文件中列出了runnable的属性(以runnable0为例,runnable0在swc0中,具有schedulePoint和activationOffset的属性)。
图2-3 显式映射
> 基于规则的映射
也可以使用基于规则的映射方式,如图2-4所示,是一个包括了不同规则的Instruction文件。首先定义应用规则的Task(task0),然后指定触发类别(周期、初始化或其他),接着是触发条件(周期:100ms),最后列出应用此规则的SWC(这里是swc2)。
图 2-4 基于规则的映射
> 自动映射
这个功能可以在配置文件中配置为启用或禁用。特别是在项目早期阶段或用于原型设计时,自动映射可以在不需要Integration Instruction的情况下获得符合AUTOSAR标准的映射。这个功能旨在作为一个补充解决方案,生成的配置应该由开发人员进行评估或优化。
除了Task映射之外,还有其他类型的Instruction,如时序顺序约束文件(Execution Order Constraint)和NvM集成Instruction,还可以为端口映射(Port Mapping)和数据映射(Data Mapping)提供Integration Instruction。
> 全局集成指令
全局集成指令很多情况下,中央集成团队可能仍然希望监督集成决策,这可以通过提供Global Instruction来实现。这些Global Instruction具有与App Package相同的格式和映射指令类型,但具有更高的优先级,并且会覆盖App Package中的指令。
2.3 用于自动集成的Pipeline
该Pipeline基于Gradle构建系统实现,并且项目中每个成员都可以使用。无论是更改SWC还是更改BSW的Root Configuration,都会以确定性的方式执行相同的集成步骤。根据这一理念,每个开发人员都可以轻松集成ECU软件。
DaVinci Team可以在本地或服务器上运行。在服务器场景下,对代码仓库的提交可以触发Pipeline的集成动作,例如通过Jenkins这样的构建服务器进行控制。这使得SWC开发人员可以独立于中央集成团队工作。在本地场景下,可以通过命令行触发Pipeline的集成动作。前文描述的在DaVinci Configurator Classic的GUI中的重复手动步骤(见第1.3节),现在可以完全自动化处理。如图2-5所示,集成Pipeline被触发后将自动执行图中灰色的集成步骤。
图2-5 自动集成步骤
自动集成步骤如下:
1.准备步骤:
a. SIP被复制到执行主机(如有必要)
b. Root Configuration和App Package被复制到执行主机
2.执行DaVinci Team自动化操作:
a. SWC类型被实例化
b. 通过NV data port配置文件,生成NvSWC
c. 基于集成指令(如Port Mapping、Data Mapping、Task Mapping等),生成RTE
d. 初始化未使用的SWC端口
3.输出步骤:
a. 生成模块
b. 生成源码
c. 编译
d. 打包工程
集成ECU软件(包括SWC、RTE和BSW)完成后,输出文件包括.elf、.c/.h和.dpa,同时还包括执行Pipeline期间的操作报告。值得一提的是,DaVinci Team支持vVIRTUALtarget项目以及Real Target平台,无论开发人员是基于vVIRTUALtarget或是实际ECU验证,都能通过DaVinci Team集成软件并生成相应的目标产物来支持后续的验证工作。
集成后的结果可以上传到类似Artifactory的二进制数据管理系统,以便开发人员下载集成版本。然而,集成结果不需要存储在像Git这样的源代码管理系统中,后者更适合用作开发人员代码版本管理的工具。这种集成过程通过动态执行,可以有效避免RTE的合并问题。
自动化Pipeline还可以通过添加自定义扩展来进行定制,这使得工具专家可以进一步创建适配于项目工程的自动化工具脚本,并扩展CI/CD Pipeline。
总结
当今的ECU软件开发正逐步转变,以应对日益增加的软件功能、更多的协作以及实现更短的发布周期。然而,采用DevOps方法并实现持续集成的自动化会面临诸多挑战,特别是由于AUTOSAR Classic项目的串行开发特性。面对这些挑战,Vector基于DaVinci Team工具,为软件开发人员提供可行的解决方案:
挑战:不同软件开发人员在同一项目中的SWC和BSW配置有不同的实现,合并这些不同的实现是一个重大的挑战。
解决方案:通过移除RTE,来解耦SWC和BSW,极大程度地避免了合并时的冲突问题。这个解决方案在第2.1节中有详细描述。
挑战:按计划进行的SWC集成时间过长,导致延迟发现问题,这可能会危及项目的里程碑。
解决方案:将集成决策前置(例如Runnable和Task的映射、端口映射、数据映射或NvM集成决策),以赋予SWC开发人员自行集成SWC与BSW的能力。这一概念在2.2节中有详细描述。
挑战:将SWC集成到BSW中通常涉及许多手动步骤,违背了敏捷开发的原则。
解决方案:DaVinci Team使用自动化Pipeline,可以自动执行SWC和BSW集成过程中的手动步骤。这个自动化Pipeline在2.3节中有详细描述。
Vector通过DaVinci Team提供解决方案,以实现敏捷和高效的AUTOSAR Classic ECU软件开发。工程师们可以通过基于多种工具的自动化Pipeline来独立工作。这一自动化过程可以简化大部分重复的工作步骤,避免集成过程中的冲突问题,集成时间滞后问题。
全部0条评论
快来发表一下你的评论吧 !