继续看下面的规则(Rules): MISRA AC SLSF 002: Data typesA. Only the Data Type Conversion block shall be used where signal data type conversion is required, i.e. data type conversion shall not be performed by any other Simulink block, e.g. Gain, Product, Sum, Inport, Outport.优先级:Required目标:Usability, Functionality, Maintainability, Efficiency【点评】这条规则的目的很清楚,通俗点讲,把事情做到明处,不要使用Simulink所提供的各种机巧,就算你很精通Simulink,也请你“明机巧而不用”。这在我们产品开发中非常重要,当下的软件规模,通常需要一个开发团队,在我们没法保证团队中每个成员都非常精通Simulink的情况下,尽量使用团队中每个人都可以理解的方式开发。数据类型的设置,最担心的莫过于数据类型设置错误而导致的溢出问题,为了避免数据溢出问题的发生,换一个思路,使用合适的静态检查工具检查溢出风险也是非常必要的,因为,即便是我们把数据类型转换都做到了明处,是否就可以做到类型转换的设置上绝对不会出错?我们做不到!那好,Simulink Design Verifier就可以无遗漏地检查模型中存在的溢出问题。这条规则中给了一些示例,用以说明怎么做正确,怎么做错误,而示例中的double类型有些扎眼,目前汽车电子控制器中使用的MCU大多不支持double,文档中经常出现double数据类型,显得有些草率。MISRA AC SLSF 003: Solver settingsA.The fixed step discrete solver shall be used for models that represent functional algorithms that will be run on production controllers, including where they are used as part of model in the loop, software in the loop, processor in the loop and hardware in the loop test environments.优先级:Required目标:Functionality, Portability【点评】这条规则是有关求解器设置的。做软件开发需要定步长、离散求解器,这个没啥说的。值得补充的是,有必要强调一下求解器的步长,也就是设置里的Step size,这个数据非常重要的,必须跟模型实现的算法将来要被调度的调度周期一致,否则Simulink模型在仿真中的行为就没法和生成的代码在部署后的行为一致。之所以强调这个步长,是因为通常情况下这个步长不会体现在生成的代码中,因此也很容易被广大用户忽略。如果你的算法中完全没有时间步长相关的内容,是否设置倒也无所谓,而如果算法中有了时间步长相关的部分,比如,定时计算、差分计算等,这个设置就至关重要了。另外,这条规则一连串的给出了各种in-the-loop测试,也就是MIL、SIL、PIL和HIL,试问,功能算法部分的模型会运行到HIL上吗?是不是又有点草率了?有关这几个in-the-loop测试的目的,可以参考我之前写过的一篇文字(简单说说MIL、SIL、PIL和HIL)。MISRA AC SLSF 005: Allowable Simulink blocksA.A controller model shall be composed only from allowed blocks listed in Appendix E- Allowable Simulink and Stateflow blocks.优先级:RequiredD. A plant model should be composed only from blocks allowed for plant modeling listed in Appendix E- Allowable Simulink and Stateflow blocks.优先级:Advisory目标:Reliability,Functionality,Portability【点评】很多公司都有这样的做法,行业标准ISO 26262-6中在编码/建模规范中也提到使用语言的子集(Use of language subsets.),这是非常有必要的规则,但是,但是,但是,MISRA的这份规范,管的实在太多了!大量的模块被限制使用,仿佛规则的制定者一定要带我们体验20年前的Simulink。比如,Discrete Filter不允许使用,Discrete PID Controller不允许使用,大量的逻辑运算模块和位运算模块不允许使用,n-D Lookup Table不允许使用(而这却是MathWorks推荐使用的模块),For-Each模块不允许使用,Atomic Subsystem模块不允许使用,Function Call Subsystem不允许使用,C Caller不允许使用,Function Caller不允许使用,Simulink Function也不允许使用......好吧,不一一列举了,这条规则对于Simulink模块的限制到了令人发指的地步,面对这样的规则,我们需要有自己的判断能力,切不可人云亦云,也不要迷信权威,要做有独立思考能力的工程师。为什么这些限制不合理?欢迎留言讨论,如果大家认为有必要,也可以专门写一篇文章讨论一下这些被MISRA限制的模块。