建模规范 | MISRA Simulink/Stateflow建模规范逐条解读(5)

文摘   2024-08-28 12:52   上海  
MISRA AC SLSF 014: S-functions
A.  An S-function shall not be used unless:
·It is suitable for the target application
·Its code complies with the relevant coding standards for the project and
·At least one of the following is true:
-It provides significant of legacy code
-It provides obfuscation of the algorithm for the purposes of intellectual property rights (IPR) protection
-It allows access to features of the target not otherwise exposed in Simulink
上述规则的优先级均为:Required。
目标:Reliability, Usability, Functionality, Portability
【点评】MISRA不建议使用S-function,但给出了一些例外。    
在我看来,对于使用MBD方式开发软件的开发过程,这些例外都没必要给。我之所以不建议使用S-function,主要是因为缺少S-function开发环境。我们写完代码不可能不做测试,而测试出问题来,需要通过调试去定位问题,S-function缺少这样的环境供我们调试代码。
MISRA这里提到的target application,如果可能的话,最好能够做到Simulink软件和target无关;而对于legacy code,就更没有必要使用S-function了,Simulink里面调用legacy code的方法有很多,Stateflow、C-Caller都比S-function方便很多;至于IP保护,也没有必要使用S-function,之前写过一篇算法保护的文章,《甲方乙方 | 合作开发中的Simulink算法保护》,这里面也有更好的方式。
如此说来,S-function就一无是处了吗?也不是,也有需要用到S-function的地方,比如,仿真的时候,如果描述动态系统——模块中有微分环节,S-function还是有必要的,如果仅仅用于仿真,可以使用m语言编写S-function,m语言实现的S-function比C语言要更容易一些。

MISRA AC SLSF 015: Vector and matrix signals
A. A vector signal shall be created only by:
·feeding individual named scalar signals of the same datatype into a Mux-block,
·a vector constant,
·a Stateflow block, or
·a fundamental mathematical operation
B. A matrix signal shall be created only by:
·feeding individual vector signals into a Matrix Concatenation block,
·a matrix constant,
·a Stateflow block, or
·a fundamental mathematical operation.
C. Vector and matrix signals shall contain only signals with:
·common or related functionality and units, and
·matching datatype and dimensions.
D. Multiplex blocks shall be used to group signals only if all the signals are of the same type and if their order is defined.    
以上规则优先级均为:Required
目标:Functionality,Maintainability
【点评】这里面有些规则没道理。
比如,“把一些数据类型相同的scalar信号输入给Mux-block而得到vector”,数据类型相同可以理解,为什么一定要scalar?而不可以是vector加vector或者scalar加vector?
有时为了模型的可读性/可维护性,完全有必要通过vector加vector或者scalar加vector得到另外一个vector。
另外有关数据类型一致,维数匹配,也没有必要通过规则的方式约束。这类问题,Simulink自然会给出错误提示。对于开发环境/开发工具自身就可以给出很好预防的问题,制定建模规范的必要性不大。恰如C编码规则中没必要通过规则保证代码没有语法错误,语法不正确,编译器自然会在编译时报错。
跟十几年前看到第一版MISRA建模规范时的感觉一样,很多规则是为了严格而严格,而不管有没有道理。 

MISRA AC SLSF 016: Buses
B.All buses shall be named.
C. All signals within a bus shall be uniquely named.
D. A bus shall be connected only to the following blocks:
·Bus Creator
·Bus Selector
·Bus Assignment
·Inport
·Outport
·From
·Goto
·Terminator
·Merge
·Switch    
·Multiport Switch
上述规则的优先级为:Required
目标:Functionality,Maintainability
【点评】Bus是非常有效的信号封装方式,支持把不同数据类型的信号封装为一个Bus信号,也支持Bus的嵌套。
Bus信号实现为C代码就是结构体变量。
对于需要指定的Bus信号,建议使用Bus对象定义其所包含的信号个数以及各数据元素的数据类型,如果对Bus信号设置了Bus对象,就不再需要指定Bus中信号的名字了。
有关Bus的代码实现,以前也做过介绍,可以参照:《结构体变量建模之终极解决方案》。
简单说一下规则D,Bus信号只能连接列举出来的那些模块,看得出来,这里没有基础运算模块,因为基础运算模块没法处理Bus或者结构体这种复合数据类型,所以我们在进行运算之前,需要通过Bus Selector选择其中的数据元素进行运算。基础运算模块处理不了Bus信号,但是Stateflow是可以处理的,也就是说,可以把Bus信号输入给Stateflow,在Stateflow内部逻辑设计的时候,可以像处理结构体变量的成员数据一样对其中的某个成员数据做运算。
而这里列举的模块中没有Stateflow,按此规则,如果要输入Bus信号给Stateflow,必须先把Bus拆开,个人认为,这不是有必要的。
先更新到这里,上述规则,欢迎留言讨论。
 



SimulinkAUTOSAR

 | MISRA Simulink/Stateflow4

Let's KISS | 

MBDC

   

仨人谈起
咨询是盛开的生命;传播理念、思想、希望和行动;谈Automotive SPICE,汽车功能安全(ISO26262 + SOTIF),汽车网络信息安全
 最新文章