关于对汽车ECU软件测试的理解

原创 汽车ECU开发 2021-12-04 11:49

在汽车行业对软件开发重视的当下,不少从其他行业加入的,那熟悉ECU软件测试流程就是必要的了,另外对于一直在行业深耕的开发或测试人员,梳理一下测试流程也是有必要的。

接下来我们以常用的V模型开发流程为线索,列举实例来说明。

图1. V型开发流程

01.

需求编写

假如现在我写了一个系统需求,也就是图1中的“Technical Safety Concept”:
(PS:所有的Techincal Safety Concept都是系统级需求,不是软件需求)
系统需求:
自适应巡航功能只能在30公里到120公里每小时之间激活.[ACC-SysReq 001];
并且一旦退出后不可再自动激活[ACC-SysReq 002]
简单起见,我们先看第一条需求,并把这条系统需求写成软件需求:

软件需求:

当以下条件满足时,ACC功能状态设置为READY[ACC-Req 001]:

  • 车速大于或等于30kph AND

  • 车速小于或等于120kph.

当满足以下条件ACC功能状态设置为SUPPRESSED[ACC-Req 002]:

  • 车速小于30kph OR

  • 车速大于120kph.

在软件设计文档中, 也就是图1V模型中的Architectual Design里可以写:

Design Requirement

Acc_ActSt shall equal to READY if:

  • SafeVehSpd is greater or equal to 30kph AND

  • SafeVehSpd is less than or equal to 120kph.

Acc_ActSt shall equal to SUPPRESSEDif:

  • SafeVehSpd is less than 30kph OR

  • SafeVehSpd is greater than 120kph.

到这里,以上就是一个最简单的需求demo。根据这个需求,你通过几行代码来实现。假设使用C来写,在原有的C文件acc.c中加入了:

if((SafeVehSpd >= 30) && (SafeVehSpd <= 120)){
Acc_ActSt = READY;
}
else if((SafeVehSpd < 30) || (SafeVehSpd > 120)){
Acc_ActSt = SUPPRESSED;
}
else{
}
有同学可能会好奇,第一个if语句写完了直接写else不就完了嘛。

是的, 但是目前我也不知道客户后面会怎么改这个需求,可能会对其他速度段增加新的状态,所以就先写个else if在这里,方便以后扩展。

到这,V模型的左半边我们就做完了,现在我们开始来测试。

02.
单元测试

写完代码并编译成功后,先进行代码的单元测试,图1 V模型中的“Software Unit Verification”。顾名思义,就是把新编写或者修改过的单元(单独的C文件,在本例中是上述的acc.c)与整个软件工程隔离,单独测试其输入输出。

图2. 单元测试只关心某个具体的软件单元

汽车上的代码开发通常首先要做MISRA-C规则测试。MISRA-C测试是一种代码静态测试,用来检验编码是否符合一系列预先设定的编程规则。这里我们假设用的测试工具是QAC。

就我写的这段代码,估计会报出一个warning, 因为 “else” 这个分枝实际上是无法触发的,而MISRA-C的其中一个规则就是所有代码都必须可触发,所谓“Accessible”。当然啦,这里我是有意为之,所以可以注释一下就放过去了。

下一个步还可以进行Polyspace测试,Polyspace也是一种静态测试工具,其可以进一步帮助判断算法运算过程中,会不会产生诸如数组索引越界、被除数为零之类的bug 。上述例子中只有逻辑判断,所以其实不需要做Polyspace测试。

接下来进行功能测试。在功能测试中,我们需要:

  1. 梳理待测单元的输入和输出信号

  2. 设计一系列的输入信号值,并同时列举对应的正确输出信号值。我们把这个叫做“测试集”。

  3. 输入测试集中的输入信号值,运行单元代码。如果输出信号的值和测试集中的正确输出信号值相同,则功能测试通过。

编写测试集的基本原则之一为测试需覆盖所有代码,并且尽量测试所有判断逻辑。上述例子非常简单,只有一个输入变量和一个输出变量,分别为 SafeVehSpd 和Acc_ActSt。

我们需要把输入信号按判断逻辑分成若干个Equivalent Class 。在上述例子中,将输入信号(假设 SafeVehSpd的类型为Unsigned int, 速度上限为500 kph)SafeVehSpd分成三个Equivalent Class,分别为:

1. [0, 30)

2. [30, 120]

3. (120,500]

于是这三个Equivalent Class里随机各取一个值,就能测试所有代码逻辑了。但实际测试中,往往还需进一步进行边界测试, 也就取每个Equivalent Class的两端的值来进行测试。这就涉及到精度问题了。假设这段代码是定点运算,车速数值由10bit表示,前述车速上限为500,车速的精度就是 500/(2^10)= 0.48828125。

所以严格来说,测试集需要测试的输入变量SafeVehSpd的值有6个,分别是 0 ,29.5117188 ,30 , 120 , 120.48828125 , 500 。

当然,现在很多工具支持自动生成测试集,所以不用程序员费劲的去算这些破玩意儿。

需要说明的是,就算进行了完善的功能测试,也并不能保证功能就没有bug,因为实际工程中输入信号的组合是无穷无尽的,再加上时序等因素,功能测试不可能穷尽所有的实际情况,我们只是尽力而为。

汽车行业比较流行的单元测试工具有VectorCAST、Cantata等。

03.
软件集成测试

完成单元测试后,就要把测试好的软件单元集成到整个软件工程里来测试。这一步对应图1中的“software verification and integration"。

图3.集成测试关注整个系统的输入输出


在单元测试中,我们通过直接改变SafeVehSpd 的值来进行测试。实际上,SafeVehSpd来自CAN总线上的车轮轮速数据。

假设如图3所示,获取CAN总线上传来的原始轮速信号WheelSpdRaw, 经过通信接口模块COM_IF.c处理 以及车速计算模块VehSpd.c计算后 ,得到信号SafeVehSpd 。那么在集成测试中,我们通过改变WheelSpdRaw的数值来对acc.c中的代码进行测试。为了其目的是为了验证acc.c模块与其他模块的接口是否正确,以及各模块之间是否有冲突。

进行软件集成测试的时候,图3的三个模块其实合并在了一起形成了一个“黑盒”,我们只关心最初的输入信号WheelSpdRaw 和最终的输出信号Acc_ActSt 之间的逻辑。

在实际工程中,COM_IF.c、VehSpd.c 和 Acc.c 三个模块很可能是由三个工程师维护的,这就可能导致任何一个模块单独进行集成测试都通过不了。这时候就需要由项目经理或者product owner提前进行沟通协调,确保所有功能都更新以后,三个模块一起进行集成测试。

软件集成测试流行的工具和单元测试一样, 也是Cantata之类的。

软件单元测试和软件集成测试都可以被称为软件在环测试(Software in the loop , SIL)。

04.
硬件在环测试(HIL)


完成SIL测试后,下面就是硬件在环测试了(Hardware in the loop, HIL),对应了图1中的 “Testing of embedded software”。有一些企业在硬件在环测试前之还会进行PIL测试(Processor in the loop),这里就不讨论了。
HIL测试也是一种集成测试。前面讨论的软件集成测试,是在PC 仿真环境执行的,而实际ECU无论是负载、内存、硬件等方面和PC环境有很大的不同,所以相同的功能需要在实际硬件中再测试一遍。
也就是说,HIL测试与软件集成测试最大的不同在于,前者运行于实际硬件中,而后者只是运行在计算机仿真环境下。
硬件在环测试的主要工具是实际的零部件。比如测试ACC功能的话可以是ADAS控制器,或者是集成了ACC功能的毫米波雷达、摄像头等。除此之外还要有一个实验台架提供必要的运行环境、电力供应和总线接口。
常用的HIL测试工具比如dspace的测试环境,dspace control desk。
和软件集成测试一样,HIL测试也是通过改变原始的CAN信号(上述中的WheelSpdRaw)来进行测试,只不过,这一次不是直接改变WheelSpdRaw在内存中的数值,而是通过HIL测试台架真的向ECU通过CAN发送真实的WheelSpdRaw信号。
HIL测试的测试集,也就是测试用例需要和软件需求Software Requirement 严格对应,可以是一对一,一对多或者多对一都可以。所有的 HIL测试用例都必须根据一条对应的Software Requirement 写出,但是条件就没有单元测试时候那么苛刻了。
比如为了测试需求ACC-Req 001,HIL测试用例可以写成:
  1. Turn ECU on;
  2. Set all wheel speed at 0;
  3. Turn ACC function on;
  4. Observe ACC status to be SUPPRESSED;
  5. Gradually increase all wheel speed to 31 kph;
  6. Observe ACC status change to READY after 30 kph;
  7. Gradually increase all wheel speed to 121 kph;
  8. Observe ACC status change to SUPPRESSED;
  9. Gradually decrease all wheel speed to 119 kph;
  10. Observe ACC status change to READY below 120 kph;
  11. Gradually decrease all wheel speed to 29 kph;
  12. Observe ACC status change to SUPPRESSED;
  13. Turn ECU off.
需要把trigger和recover的情况都覆盖到。事实上这个测试用例也可以用来测试ACC-Req 002,这就是“一对多”的情况。
05.
实车测试


实车测试就很好理解了,在所有前述测试都通过以后,工程师上车来实际测试相关功能。这对应了图1中的“System and item integration and testing”。实车测试用例需要根据系统需求来制定。
对于本文的例子,可以写成:
1.着车后打开ACC功能,保持车辆静止。观察仪表盘,ACC 功能未启动。
2. 将汽车加速至30kph,再次打开ACC 功能, 观察仪表盘,ACC启动。将汽车减速至29kph,观察仪表盘,ACC 功能退出。
3. 将汽车加速至110 kph, 打开ACC 功能, 观察仪表盘, ACC 启动。将汽车加速到121kph,观察仪表盘,ACC 功能退出。

后台回复汽车ECU开发001获取CANoe.Diva操作指南及2021年全球半导体研究报告。

阅读原文,关注作者知乎

推荐阅读

特斯拉最新的12V蓄电池有什么不同?

特斯拉最新中央计算模块(CCM)解析

2021款特斯拉Model Y ECU接口梳理

详解CANoe之CAPL编程

关于CAN时间同步的理解

dbc文件的格式以及创建详解

大众ID.4 X网络架构详解

基于UDS的Bootloder详解

关于整车上下电流程的理解

一文详解CAN总线错误帧|附下载

DoIP协议介绍,资料分享!

详解车载网络 OTA系统的开发|文末附下载

一文了解汽车嵌入式AUTOSAR架构|附下载

特斯拉Autopilot系统安全研究|附dbc下载

分享不易,恳请点个【在看】
汽车ECU开发 专注于汽车电子ECU软件开发,技术分享。
评论
  • 在智能家居领域中,Wi-Fi、蓝牙、Zigbee、Thread与Z-Wave等无线通信协议是构建短距物联局域网的关键手段,它们常在实际应用中交叉运用,以满足智能家居生态系统多样化的功能需求。然而,这些协议之间并未遵循统一的互通标准,缺乏直接的互操作性,在进行组网时需要引入额外的网关作为“翻译桥梁”,极大地增加了系统的复杂性。 同时,Apple HomeKit、SamSung SmartThings、Amazon Alexa、Google Home等主流智能家居平台为了提升市占率与消费者
    华普微HOPERF 2025-01-06 17:23 145浏览
  • By Toradex 秦海1). 简介嵌入式平台设备基于Yocto Linux 在开发后期量产前期,为了安全以及提高启动速度等考虑,希望将 ARM 处理器平台的 Debug Console 输出关闭,本文就基于 NXP i.MX8MP ARM 处理器平台来演示相关流程。 本文所示例的平台来自于 Toradex Verdin i.MX8MP 嵌入式平台。  2. 准备a). Verdin i.MX8MP ARM核心版配合Dahlia载板并
    hai.qin_651820742 2025-01-07 14:52 44浏览
  • 每日可见的315MHz和433MHz遥控模块,你能分清楚吗?众所周知,一套遥控设备主要由发射部分和接收部分组成,发射器可以将控制者的控制按键经过编码,调制到射频信号上面,然后经天线发射出无线信号。而接收器是将天线接收到的无线信号进行解码,从而得到与控制按键相对应的信号,然后再去控制相应的设备工作。当前,常见的遥控设备主要分为红外遥控与无线电遥控两大类,其主要区别为所采用的载波频率及其应用场景不一致。红外遥控设备所采用的射频信号频率一般为38kHz,通常应用在电视、投影仪等设备中;而无线电遥控设备
    华普微HOPERF 2025-01-06 15:29 127浏览
  • 光耦合器,也称为光隔离器,是一种利用光在两个隔离电路之间传输电信号的组件。在医疗领域,确保患者安全和设备可靠性至关重要。在众多有助于医疗设备安全性和效率的组件中,光耦合器起着至关重要的作用。这些紧凑型设备经常被忽视,但对于隔离高压和防止敏感医疗设备中的电气危害却是必不可少的。本文深入探讨了光耦合器的功能、其在医疗应用中的重要性以及其实际使用示例。什么是光耦合器?它通常由以下部分组成:LED(发光二极管):将电信号转换为光。光电探测器(例如光电晶体管):检测光并将其转换回电信号。这种布置确保输入和
    腾恩科技-彭工 2025-01-03 16:27 180浏览
  • 彼得·德鲁克被誉为“现代管理学之父”,他的管理思想影响了无数企业和管理者。然而,关于他的书籍分类,一种流行的说法令人感到困惑:德鲁克一生写了39本书,其中15本是关于管理的,而其中“专门写工商企业或为企业管理者写的”只有两本——《为成果而管理》和《创新与企业家精神》。这样的表述广为流传,但深入探讨后却发现并不完全准确。让我们一起重新审视这一说法,解析其中的矛盾与根源,进而重新认识德鲁克的管理思想及其著作的真正价值。从《创新与企业家精神》看德鲁克的视角《创新与企业家精神》通常被认为是一本专为企业管
    优思学院 2025-01-06 12:03 116浏览
  • PLC组态方式主要有三种,每种都有其独特的特点和适用场景。下面来简单说说: 1. 硬件组态   定义:硬件组态指的是选择适合的PLC型号、I/O模块、通信模块等硬件组件,并按照实际需求进行连接和配置。    灵活性:这种方式允许用户根据项目需求自由搭配硬件组件,具有较高的灵活性。    成本:可能需要额外的硬件购买成本,适用于对系统性能和扩展性有较高要求的场合。 2. 软件组态   定义:软件组态主要是通过PLC
    丙丁先生 2025-01-06 09:23 85浏览
  • 这篇内容主要讨论三个基本问题,硅电容是什么,为什么要使用硅电容,如何正确使用硅电容?1.  硅电容是什么首先我们需要了解电容是什么?物理学上电容的概念指的是给定电位差下自由电荷的储藏量,记为C,单位是F,指的是容纳电荷的能力,C=εS/d=ε0εrS/4πkd(真空)=Q/U。百度百科上电容器的概念指的是两个相互靠近的导体,中间夹一层不导电的绝缘介质。通过观察电容本身的定义公式中可以看到,在各个变量中比较能够改变的就是εr,S和d,也就是介质的介电常数,金属板有效相对面积以及距离。当前
    知白 2025-01-06 12:04 170浏览
  •     为控制片内设备并且查询其工作状态,MCU内部总是有一组特殊功能寄存器(SFR,Special Function Register)。    使用Eclipse环境调试MCU程序时,可以利用 Peripheral Registers Viewer来查看SFR。这个小工具是怎样知道某个型号的MCU有怎样的寄存器定义呢?它使用一种描述性的文本文件——SVD文件。这个文件存储在下面红色字体的路径下。    例:南京沁恒  &n
    电子知识打边炉 2025-01-04 20:04 100浏览
  • 大模型的赋能是指利用大型机器学习模型(如深度学习模型)来增强或改进各种应用和服务。这种技术在许多领域都显示出了巨大的潜力,包括但不限于以下几个方面: 1. 企业服务:大模型可以用于构建智能客服系统、知识库问答系统等,提升企业的服务质量和运营效率。 2. 教育服务:在教育领域,大模型被应用于个性化学习、智能辅导、作业批改等,帮助教师减轻工作负担,提高教学质量。 3. 工业智能化:大模型有助于解决工业领域的复杂性和不确定性问题,尽管在认知能力方面尚未完全具备专家级的复杂决策能力。 4. 消费
    丙丁先生 2025-01-07 09:25 80浏览
  • 根据Global Info Research项目团队最新调研,预计2030年全球封闭式电机产值达到1425百万美元,2024-2030年期间年复合增长率CAGR为3.4%。 封闭式电机是一种电动机,其外壳设计为密闭结构,通常用于要求较高的防护等级的应用场合。封闭式电机可以有效防止外部灰尘、水分和其他污染物进入内部,从而保护电机的内部组件,延长其使用寿命。 环洋市场咨询机构出版的调研分析报告【全球封闭式电机行业总体规模、主要厂商及IPO上市调研报告,2025-2031】研究全球封闭式电机总体规
    GIRtina 2025-01-06 11:10 104浏览
  • 根据环洋市场咨询(Global Info Research)项目团队最新调研,预计2030年全球无人机锂电池产值达到2457百万美元,2024-2030年期间年复合增长率CAGR为9.6%。 无人机锂电池是无人机动力系统中存储并释放能量的部分。无人机使用的动力电池,大多数是锂聚合物电池,相较其他电池,锂聚合物电池具有较高的能量密度,较长寿命,同时也具有良好的放电特性和安全性。 全球无人机锂电池核心厂商有宁德新能源科技、欣旺达、鹏辉能源、深圳格瑞普和EaglePicher等,前五大厂商占有全球
    GIRtina 2025-01-07 11:02 68浏览
  • 随着市场需求不断的变化,各行各业对CPU的要求越来越高,特别是近几年流行的 AIOT,为了有更好的用户体验,CPU的算力就要求更高了。今天为大家推荐由米尔基于瑞芯微RK3576处理器推出的MYC-LR3576核心板及开发板。关于RK3576处理器国产CPU,是这些年的骄傲,华为手机全国产化,国人一片呼声,再也不用卡脖子了。RK3576处理器,就是一款由国产是厂商瑞芯微,今年第二季推出的全新通用型的高性能SOC芯片,这款CPU到底有多么的高性能,下面看看它的几个特性:8核心6 TOPS超强算力双千
    米尔电子嵌入式 2025-01-03 17:04 55浏览
  • 自动化已成为现代制造业的基石,而驱动隔离器作为关键组件,在提升效率、精度和可靠性方面起到了不可或缺的作用。随着工业技术不断革新,驱动隔离器正助力自动化生产设备适应新兴趋势,并推动行业未来的发展。本文将探讨自动化的核心趋势及驱动隔离器在其中的重要角色。自动化领域的新兴趋势智能工厂的崛起智能工厂已成为自动化生产的新标杆。通过结合物联网(IoT)、人工智能(AI)和机器学习(ML),智能工厂实现了实时监控和动态决策。驱动隔离器在其中至关重要,它确保了传感器、执行器和控制单元之间的信号完整性,同时提供高
    腾恩科技-彭工 2025-01-03 16:28 170浏览
  • 本文介绍Linux系统更换开机logo方法教程,通用RK3566、RK3568、RK3588、RK3576等开发板,触觉智能RK3562开发板演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。制作图片开机logo图片制作注意事项(1)图片必须为bmp格式;(2)图片大小不能大于4MB;(3)BMP位深最大是32,建议设置为8;(4)图片名称为logo.bmp和logo_kernel.bmp;开机
    Industio_触觉智能 2025-01-06 10:43 87浏览
  • 村田是目前全球量产硅电容的领先企业,其在2016年收购了法国IPDiA头部硅电容器公司,并于2023年6月宣布投资约100亿日元将硅电容产能提升两倍。以下内容主要来自村田官网信息整理,村田高密度硅电容器采用半导体MOS工艺开发,并使用3D结构来大幅增加电极表面,因此在给定的占位面积内增加了静电容量。村田的硅技术以嵌入非结晶基板的单片结构为基础(单层MIM和多层MIM—MIM是指金属 / 绝缘体/ 金属) 村田硅电容采用先进3D拓扑结构在100um内,使开发的有效静电容量面积相当于80个
    知白 2025-01-07 15:02 75浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦