Upload
others
View
11
Download
0
Embed Size (px)
Citation preview
1© 2016 The MathWorks, Inc.
统一的模型和代码验证
23 June 2016
宋 登 Application Engineering
2
为何做?
当前大多数控制系统软件既包含模型自动生成代码又包含手写代码
如何高效的测试混在一起的手写代码和自动生成代码呢?
MathWorks提供了不同的工具用于测试模型和代码
有没有一个流程可以以最高效的方式使用这些工具呢?
3
如何做?
功能测试之前模型和代码的静态分析
动态测试:对模型、S-function和自动生成的代码进行功能验证
静态分析集成的代码:手写代码、S-function和自动生成代码
统一的、互为补充的模型和代码验证流,持续提高产品信心
4
案例研究: 巡航定速控制应用
65 mph
目标: 根据驾驶员的操控和车辆的运行工况设定目标速度和踏板位置
巡航定速控制应用 (C 代码)
• 手写代码模块单元
• 基于模型的Stateflow模块单元
• 基于模型的S-function模块单元
5
案例研究: 巡航定速控制系统架构
巡航定速控制系统
读取输入
故障日志
踏板命令控制模块
控制输出
手写代码
自动生成代码
S-function代码
目标速度控制模块功能调度
系统输入
Cruise Power
Brake
Vehicle Speed
Coast/Set
Accel/Resume
系统输出
Target Speed
Engaged
Pedal Position
6
案例研究: Roles & Workflow
MBD 控制模块负责人: Chuck– 基于Simulink模型进行开发– 通过s-functions在模型中集成C代码– 产生代码– 依靠基于模型的测试方法
集成和编译负责人: Anthony– 基于手写C代码进行开发– 集成手写代码和自动生成代码– 创建ECU编译– 依靠HiL设备进行测试
读取输入
故障日志
控制输出
巡航定速控制应用系统
目标速度控制模块
踏板命令控制模块
自动生成的C代码
集成的C 代码
7
案例研究: 向客户提交第一个发布版本
向客户提交的第一个版本必须包含如下新功能/改变:
目标速度模块中的信号/标定量从浮点类型转为整型
在踏板命令模块中包含用户的查找表以便支持标定
展示生成的代码是遵循MISRA编码规范的
移除无用的故障记录
移植代码运行在用户的 ECU (14-bit to 12-bit ADC)
除了这些改变,我们还需要向用户提供基于模型的模块和集成代码功能测试报告。
9
基于模型的设计任务
首先关注在基于模型的设计任务中可以进行哪些检查:
将目标速度模块单元中的信号/标定量从浮点类型转换成整型
在踏板命令模块中包含用户查找表以便支持标定
展示自动生成的代码是MISRA规则兼容的
我们的方法将会在功能测试之前进行检查,在开发过程的早期最小化返工
10
浮点型到整型的转换: 检查模型中设计错误
Simulink Design Verifier识别可以产生“dead logic”的模型设计错误,确保功能测试能够顺利进行
目标速度控制模块
11
Dead Logic的根源分析/修复
Dead logic 是因为 incdec/holdrate*10 中的“uint8”运算
Fix: 改变运算顺序为10*incdec/holdrate
条件不可能为false
12
基于模型的设计任务
首先关注在基于模型的设计任务中可以进行哪些检查:
将目标速度模块单元中的信号/标定量从浮点类型转换成整型
在踏板命令模块中包含用户查找表以便支持标定
展示自动生成的代码是MISRA规则兼容的
我们的方法将会在功能测试之前进行检查,在开发过程的早期最小化返工
13
用户查找表: 检查 S-Function代码是否含有Runtime Errors踏板命令控制模块
14
S-Function中Run-time Errors的根源分析/修复踏板命令控制模块
15
基于模型的设计任务
首先关注在基于模型的设计任务中可以进行哪些检查:
将目标速度模块单元中的信号/标定量从浮点型转换成整型
在踏板命令模块单元中包含用户查找表以便支持标定
展示自动生成的代码是MISRA规则兼容的
我们的方法将会在功能测试之前进行检查,在开发过程的早期最小化返工
16
使用Model Advisor检查MISRA规则兼容性 目标速度控制模块
17
目标速度控制模块使用Model Advisor检查MISRA规则兼容性
18
检测模型设计和代码生成配置 提高产生遵循 MISRA C:2012 编码规范的代码
使用Model Advisor检查MISRA规则兼容性 目标速度控制模块
19
从模型中配置 Polyspace 验证选项目标速度控制模块
20
从模型中启动 Polyspace 进行验证 目标速度控制模块
21
查看 Bug Finder MISRA 分析结果目标速度控制模块
22
设置 “Code Placement” 减少 MISRA 冲突目标速度控制模块
23
通过添加注释解释其它MISRA冲突目标速度控制模块
24
基于模型的设计任务
首先关注在基于模型的设计任务中可以进行哪些检查:
将目标速度模块单元的信号/标定量从浮点型转换为整型
在踏板命令模块单元中包含用户的查找表以便支持标定
展示自动生成的代码是MISRA规则兼容的
我们的方法将会在功能测试之前进行检查,在开发过程的早期最小化返工
28
基于模型的测试
所有的检查结束后,我们将为基于模型的模块产生测试结果:
基于踏板命令模块对s-function进行功能测试
目标速度模块的等效性测试(model-to-code)
29
踏板命令(S-Function)的功能测试踏板命令模块
对模型 和 s-function 代码进行覆盖率分析
30
基于模型的测试
所有的检查结束后,我们将为基于模型的模块产生测试结果:
基于踏板命令模块对s-function进行功能测试
目标速度模块的等效性测试(model-to-code)
31
检查生成的代码与模型行为的一致性
集成的 SIL 模式支持模型到代码的等效性测试
自动生成代码的覆盖报告用于详细的等效性分析
32
基于模型的测试
所有的检查结束后,我们将为基于模型的模块产生测试结果:
基于踏板命令模块对s-function进行功能测试
目标速度模块的等效性测试(model-to-code)
33
集成的代码测试
手写代码设计任务:
移除无用的故障记录
移植代码到用户的 ECU (14-bit to 12-bit ADC)
少量手写代码改变已经完成。
基于集成的手写代码和生成代码的ECU 编译已经创建
我们现在需要产生集成的代码在HiL设备上的功能测试结果
发现这些已经测试过的模块在代码集成过程中引入的缺陷(手写代码、s-function代码 和 基于模型生成的代码)。
35
通过HIL测试发现的缺陷…
在故障检测中巡航速度控制关闭
并且, 目标速度从未超过 40 mph
36
读取输入 写入输出 调度算法 故障日志
目标速度控制模块
踏板命令模块
创建Code Prover 工程检查集成代码
37
使用 Polyspace 进行代码集成检查:
手写代码中的 Non-terminating loop缺陷故障日志
38
故障检测中巡航速度控制关闭的原因故障日志
39
巡航速度控制关闭的根源
1210
故障日志
40
修复并验证手写代码中已经排除 Runtime Errors故障日志
41
使用Polyspace 进行代码集成检查:
自动生成代码中的Dead Code
Unreachable/Dead code
Maximum target speed = 90Vehicle speed signal propagated to
“CruiseControl_PS.c” [0 … 40]
目标速度控制模块
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
读取输入
44
巡航速度控制系统
MBD
生成代码
流程小结:
模型&代码验证互为补充
• 功能测试(simulation)
• 通过模型早期检查设计缺陷
• 检测MISRA编码规范 (Mdl Advisor)
• 检查s-function代码的run-time errors
• 检查MISRA 编码规范 (Polyspace)
• 代码覆盖率 (SIL)
• SIL 模式支持
• 检查集成代码的run-time errors手写代码
45
互为补充的模型验证和代码验证过程 …
功能测试之前的模型和代码检查减少返工
基于模型进行功能测试、动态测试 并且 自动完成代码结构分析、重用测试资源
分析代码找出如下代码集成过程中引入的缺陷:o 手写代码
o s-function代码
o 基于模型生成的代码
除功能测试之外引入形式化分析方法
实现了模型和代码的早期验证
持续提高产品信心
46
Thank You!