40
1 © 2016 The MathWorks, Inc. 统一的模型和代码验证 23 June 2016 Application Engineering

统一的模型和代码验证 - MathWorks · 2 为何做? 当前大多数控制系统软件既包含模型自动生成代码又包含手写代码 如何高效的测试混在一起的手写代码和自动生成代码呢?

  • Upload
    others

  • View
    11

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 统一的模型和代码验证 - MathWorks · 2 为何做? 当前大多数控制系统软件既包含模型自动生成代码又包含手写代码 如何高效的测试混在一起的手写代码和自动生成代码呢?

1© 2016 The MathWorks, Inc.

统一的模型和代码验证

23 June 2016

宋 登 Application Engineering

Page 2: 统一的模型和代码验证 - MathWorks · 2 为何做? 当前大多数控制系统软件既包含模型自动生成代码又包含手写代码 如何高效的测试混在一起的手写代码和自动生成代码呢?

2

为何做?

当前大多数控制系统软件既包含模型自动生成代码又包含手写代码

如何高效的测试混在一起的手写代码和自动生成代码呢?

MathWorks提供了不同的工具用于测试模型和代码

有没有一个流程可以以最高效的方式使用这些工具呢?

Page 3: 统一的模型和代码验证 - MathWorks · 2 为何做? 当前大多数控制系统软件既包含模型自动生成代码又包含手写代码 如何高效的测试混在一起的手写代码和自动生成代码呢?

3

如何做?

功能测试之前模型和代码的静态分析

动态测试:对模型、S-function和自动生成的代码进行功能验证

静态分析集成的代码:手写代码、S-function和自动生成代码

统一的、互为补充的模型和代码验证流,持续提高产品信心

Page 4: 统一的模型和代码验证 - MathWorks · 2 为何做? 当前大多数控制系统软件既包含模型自动生成代码又包含手写代码 如何高效的测试混在一起的手写代码和自动生成代码呢?

4

案例研究: 巡航定速控制应用

65 mph

目标: 根据驾驶员的操控和车辆的运行工况设定目标速度和踏板位置

巡航定速控制应用 (C 代码)

• 手写代码模块单元

• 基于模型的Stateflow模块单元

• 基于模型的S-function模块单元

Page 5: 统一的模型和代码验证 - MathWorks · 2 为何做? 当前大多数控制系统软件既包含模型自动生成代码又包含手写代码 如何高效的测试混在一起的手写代码和自动生成代码呢?

5

案例研究: 巡航定速控制系统架构

巡航定速控制系统

读取输入

故障日志

踏板命令控制模块

控制输出

手写代码

自动生成代码

S-function代码

目标速度控制模块功能调度

系统输入

Cruise Power

Brake

Vehicle Speed

Coast/Set

Accel/Resume

系统输出

Target Speed

Engaged

Pedal Position

Page 6: 统一的模型和代码验证 - MathWorks · 2 为何做? 当前大多数控制系统软件既包含模型自动生成代码又包含手写代码 如何高效的测试混在一起的手写代码和自动生成代码呢?

6

案例研究: Roles & Workflow

MBD 控制模块负责人: Chuck– 基于Simulink模型进行开发– 通过s-functions在模型中集成C代码– 产生代码– 依靠基于模型的测试方法

集成和编译负责人: Anthony– 基于手写C代码进行开发– 集成手写代码和自动生成代码– 创建ECU编译– 依靠HiL设备进行测试

读取输入

故障日志

控制输出

巡航定速控制应用系统

目标速度控制模块

踏板命令控制模块

自动生成的C代码

集成的C 代码

Page 7: 统一的模型和代码验证 - MathWorks · 2 为何做? 当前大多数控制系统软件既包含模型自动生成代码又包含手写代码 如何高效的测试混在一起的手写代码和自动生成代码呢?

7

案例研究: 向客户提交第一个发布版本

向客户提交的第一个版本必须包含如下新功能/改变:

目标速度模块中的信号/标定量从浮点类型转为整型

在踏板命令模块中包含用户的查找表以便支持标定

展示生成的代码是遵循MISRA编码规范的

移除无用的故障记录

移植代码运行在用户的 ECU (14-bit to 12-bit ADC)

除了这些改变,我们还需要向用户提供基于模型的模块和集成代码功能测试报告。

Page 8: 统一的模型和代码验证 - MathWorks · 2 为何做? 当前大多数控制系统软件既包含模型自动生成代码又包含手写代码 如何高效的测试混在一起的手写代码和自动生成代码呢?

9

基于模型的设计任务

首先关注在基于模型的设计任务中可以进行哪些检查:

将目标速度模块单元中的信号/标定量从浮点类型转换成整型

在踏板命令模块中包含用户查找表以便支持标定

展示自动生成的代码是MISRA规则兼容的

我们的方法将会在功能测试之前进行检查,在开发过程的早期最小化返工

Page 9: 统一的模型和代码验证 - MathWorks · 2 为何做? 当前大多数控制系统软件既包含模型自动生成代码又包含手写代码 如何高效的测试混在一起的手写代码和自动生成代码呢?

10

浮点型到整型的转换: 检查模型中设计错误

Simulink Design Verifier识别可以产生“dead logic”的模型设计错误,确保功能测试能够顺利进行

目标速度控制模块

Page 10: 统一的模型和代码验证 - MathWorks · 2 为何做? 当前大多数控制系统软件既包含模型自动生成代码又包含手写代码 如何高效的测试混在一起的手写代码和自动生成代码呢?

11

Dead Logic的根源分析/修复

Dead logic 是因为 incdec/holdrate*10 中的“uint8”运算

Fix: 改变运算顺序为10*incdec/holdrate

条件不可能为false

Page 11: 统一的模型和代码验证 - MathWorks · 2 为何做? 当前大多数控制系统软件既包含模型自动生成代码又包含手写代码 如何高效的测试混在一起的手写代码和自动生成代码呢?

12

基于模型的设计任务

首先关注在基于模型的设计任务中可以进行哪些检查:

将目标速度模块单元中的信号/标定量从浮点类型转换成整型

在踏板命令模块中包含用户查找表以便支持标定

展示自动生成的代码是MISRA规则兼容的

我们的方法将会在功能测试之前进行检查,在开发过程的早期最小化返工

Page 12: 统一的模型和代码验证 - MathWorks · 2 为何做? 当前大多数控制系统软件既包含模型自动生成代码又包含手写代码 如何高效的测试混在一起的手写代码和自动生成代码呢?

13

用户查找表: 检查 S-Function代码是否含有Runtime Errors踏板命令控制模块

Page 13: 统一的模型和代码验证 - MathWorks · 2 为何做? 当前大多数控制系统软件既包含模型自动生成代码又包含手写代码 如何高效的测试混在一起的手写代码和自动生成代码呢?

14

S-Function中Run-time Errors的根源分析/修复踏板命令控制模块

Page 14: 统一的模型和代码验证 - MathWorks · 2 为何做? 当前大多数控制系统软件既包含模型自动生成代码又包含手写代码 如何高效的测试混在一起的手写代码和自动生成代码呢?

15

基于模型的设计任务

首先关注在基于模型的设计任务中可以进行哪些检查:

将目标速度模块单元中的信号/标定量从浮点型转换成整型

在踏板命令模块单元中包含用户查找表以便支持标定

展示自动生成的代码是MISRA规则兼容的

我们的方法将会在功能测试之前进行检查,在开发过程的早期最小化返工

Page 15: 统一的模型和代码验证 - MathWorks · 2 为何做? 当前大多数控制系统软件既包含模型自动生成代码又包含手写代码 如何高效的测试混在一起的手写代码和自动生成代码呢?

16

使用Model Advisor检查MISRA规则兼容性 目标速度控制模块

Page 16: 统一的模型和代码验证 - MathWorks · 2 为何做? 当前大多数控制系统软件既包含模型自动生成代码又包含手写代码 如何高效的测试混在一起的手写代码和自动生成代码呢?

17

目标速度控制模块使用Model Advisor检查MISRA规则兼容性

Page 17: 统一的模型和代码验证 - MathWorks · 2 为何做? 当前大多数控制系统软件既包含模型自动生成代码又包含手写代码 如何高效的测试混在一起的手写代码和自动生成代码呢?

18

检测模型设计和代码生成配置 提高产生遵循 MISRA C:2012 编码规范的代码

使用Model Advisor检查MISRA规则兼容性 目标速度控制模块

Page 18: 统一的模型和代码验证 - MathWorks · 2 为何做? 当前大多数控制系统软件既包含模型自动生成代码又包含手写代码 如何高效的测试混在一起的手写代码和自动生成代码呢?

19

从模型中配置 Polyspace 验证选项目标速度控制模块

Page 19: 统一的模型和代码验证 - MathWorks · 2 为何做? 当前大多数控制系统软件既包含模型自动生成代码又包含手写代码 如何高效的测试混在一起的手写代码和自动生成代码呢?

20

从模型中启动 Polyspace 进行验证 目标速度控制模块

Page 20: 统一的模型和代码验证 - MathWorks · 2 为何做? 当前大多数控制系统软件既包含模型自动生成代码又包含手写代码 如何高效的测试混在一起的手写代码和自动生成代码呢?

21

查看 Bug Finder MISRA 分析结果目标速度控制模块

Page 21: 统一的模型和代码验证 - MathWorks · 2 为何做? 当前大多数控制系统软件既包含模型自动生成代码又包含手写代码 如何高效的测试混在一起的手写代码和自动生成代码呢?

22

设置 “Code Placement” 减少 MISRA 冲突目标速度控制模块

Page 22: 统一的模型和代码验证 - MathWorks · 2 为何做? 当前大多数控制系统软件既包含模型自动生成代码又包含手写代码 如何高效的测试混在一起的手写代码和自动生成代码呢?

23

通过添加注释解释其它MISRA冲突目标速度控制模块

Page 23: 统一的模型和代码验证 - MathWorks · 2 为何做? 当前大多数控制系统软件既包含模型自动生成代码又包含手写代码 如何高效的测试混在一起的手写代码和自动生成代码呢?

24

基于模型的设计任务

首先关注在基于模型的设计任务中可以进行哪些检查:

将目标速度模块单元的信号/标定量从浮点型转换为整型

在踏板命令模块单元中包含用户的查找表以便支持标定

展示自动生成的代码是MISRA规则兼容的

我们的方法将会在功能测试之前进行检查,在开发过程的早期最小化返工

Page 24: 统一的模型和代码验证 - MathWorks · 2 为何做? 当前大多数控制系统软件既包含模型自动生成代码又包含手写代码 如何高效的测试混在一起的手写代码和自动生成代码呢?

28

基于模型的测试

所有的检查结束后,我们将为基于模型的模块产生测试结果:

基于踏板命令模块对s-function进行功能测试

目标速度模块的等效性测试(model-to-code)

Page 25: 统一的模型和代码验证 - MathWorks · 2 为何做? 当前大多数控制系统软件既包含模型自动生成代码又包含手写代码 如何高效的测试混在一起的手写代码和自动生成代码呢?

29

踏板命令(S-Function)的功能测试踏板命令模块

对模型 和 s-function 代码进行覆盖率分析

Page 26: 统一的模型和代码验证 - MathWorks · 2 为何做? 当前大多数控制系统软件既包含模型自动生成代码又包含手写代码 如何高效的测试混在一起的手写代码和自动生成代码呢?

30

基于模型的测试

所有的检查结束后,我们将为基于模型的模块产生测试结果:

基于踏板命令模块对s-function进行功能测试

目标速度模块的等效性测试(model-to-code)

Page 27: 统一的模型和代码验证 - MathWorks · 2 为何做? 当前大多数控制系统软件既包含模型自动生成代码又包含手写代码 如何高效的测试混在一起的手写代码和自动生成代码呢?

31

检查生成的代码与模型行为的一致性

集成的 SIL 模式支持模型到代码的等效性测试

自动生成代码的覆盖报告用于详细的等效性分析

Page 28: 统一的模型和代码验证 - MathWorks · 2 为何做? 当前大多数控制系统软件既包含模型自动生成代码又包含手写代码 如何高效的测试混在一起的手写代码和自动生成代码呢?

32

基于模型的测试

所有的检查结束后,我们将为基于模型的模块产生测试结果:

基于踏板命令模块对s-function进行功能测试

目标速度模块的等效性测试(model-to-code)

Page 29: 统一的模型和代码验证 - MathWorks · 2 为何做? 当前大多数控制系统软件既包含模型自动生成代码又包含手写代码 如何高效的测试混在一起的手写代码和自动生成代码呢?

33

集成的代码测试

手写代码设计任务:

移除无用的故障记录

移植代码到用户的 ECU (14-bit to 12-bit ADC)

少量手写代码改变已经完成。

基于集成的手写代码和生成代码的ECU 编译已经创建

我们现在需要产生集成的代码在HiL设备上的功能测试结果

发现这些已经测试过的模块在代码集成过程中引入的缺陷(手写代码、s-function代码 和 基于模型生成的代码)。

Page 30: 统一的模型和代码验证 - MathWorks · 2 为何做? 当前大多数控制系统软件既包含模型自动生成代码又包含手写代码 如何高效的测试混在一起的手写代码和自动生成代码呢?

35

通过HIL测试发现的缺陷…

在故障检测中巡航速度控制关闭

并且, 目标速度从未超过 40 mph

Page 31: 统一的模型和代码验证 - MathWorks · 2 为何做? 当前大多数控制系统软件既包含模型自动生成代码又包含手写代码 如何高效的测试混在一起的手写代码和自动生成代码呢?

36

读取输入 写入输出 调度算法 故障日志

目标速度控制模块

踏板命令模块

创建Code Prover 工程检查集成代码

Page 32: 统一的模型和代码验证 - MathWorks · 2 为何做? 当前大多数控制系统软件既包含模型自动生成代码又包含手写代码 如何高效的测试混在一起的手写代码和自动生成代码呢?

37

使用 Polyspace 进行代码集成检查:

手写代码中的 Non-terminating loop缺陷故障日志

Page 33: 统一的模型和代码验证 - MathWorks · 2 为何做? 当前大多数控制系统软件既包含模型自动生成代码又包含手写代码 如何高效的测试混在一起的手写代码和自动生成代码呢?

38

故障检测中巡航速度控制关闭的原因故障日志

Page 34: 统一的模型和代码验证 - MathWorks · 2 为何做? 当前大多数控制系统软件既包含模型自动生成代码又包含手写代码 如何高效的测试混在一起的手写代码和自动生成代码呢?

39

巡航速度控制关闭的根源

1210

故障日志

Page 35: 统一的模型和代码验证 - MathWorks · 2 为何做? 当前大多数控制系统软件既包含模型自动生成代码又包含手写代码 如何高效的测试混在一起的手写代码和自动生成代码呢?

40

修复并验证手写代码中已经排除 Runtime Errors故障日志

Page 36: 统一的模型和代码验证 - MathWorks · 2 为何做? 当前大多数控制系统软件既包含模型自动生成代码又包含手写代码 如何高效的测试混在一起的手写代码和自动生成代码呢?

41

使用Polyspace 进行代码集成检查:

自动生成代码中的Dead Code

Unreachable/Dead code

Maximum target speed = 90Vehicle speed signal propagated to

“CruiseControl_PS.c” [0 … 40]

目标速度控制模块

Page 37: 统一的模型和代码验证 - MathWorks · 2 为何做? 当前大多数控制系统软件既包含模型自动生成代码又包含手写代码 如何高效的测试混在一起的手写代码和自动生成代码呢?

42

Dead Code 产生的根源:

Speed Sensor Input Hand Code

14 to 12-bit的模拟-数字转换器的改变导致了dead code

MASK – accounts for scaling down

for new ADC from 14-bit to 12-bit

Overlooked changing

CONV_FACTOR for new ADC

读取输入

Page 38: 统一的模型和代码验证 - MathWorks · 2 为何做? 当前大多数控制系统软件既包含模型自动生成代码又包含手写代码 如何高效的测试混在一起的手写代码和自动生成代码呢?

44

巡航速度控制系统

MBD

生成代码

流程小结:

模型&代码验证互为补充

• 功能测试(simulation)

• 通过模型早期检查设计缺陷

• 检测MISRA编码规范 (Mdl Advisor)

• 检查s-function代码的run-time errors

• 检查MISRA 编码规范 (Polyspace)

• 代码覆盖率 (SIL)

• SIL 模式支持

• 检查集成代码的run-time errors手写代码

Page 39: 统一的模型和代码验证 - MathWorks · 2 为何做? 当前大多数控制系统软件既包含模型自动生成代码又包含手写代码 如何高效的测试混在一起的手写代码和自动生成代码呢?

45

互为补充的模型验证和代码验证过程 …

功能测试之前的模型和代码检查减少返工

基于模型进行功能测试、动态测试 并且 自动完成代码结构分析、重用测试资源

分析代码找出如下代码集成过程中引入的缺陷:o 手写代码

o s-function代码

o 基于模型生成的代码

除功能测试之外引入形式化分析方法

实现了模型和代码的早期验证

持续提高产品信心

Page 40: 统一的模型和代码验证 - MathWorks · 2 为何做? 当前大多数控制系统软件既包含模型自动生成代码又包含手写代码 如何高效的测试混在一起的手写代码和自动生成代码呢?

46

Thank You!