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

文摘   2024-06-28 08:46   湖北  
接着上回往下讲。

MISRA AC SLSF 006: Block parameters
A.  Block parameters evaluated at runtime as a numeric value shall not contain:
·Expressions
·Data type conversions
·Selection of rows or columns
B. Block parameters, whether intended to be configured or calibrated or not, shall be entered as named constants.
Exceptions:
·Numeric values specifying the number of inputs or outputs of a block (e.g. Mux). This information is pertinent to the model design.
·Values that do not have a physical or logical meaning, e.g. 2 as the divisor when calculating the mean of two numbers.
·The values 0 or 1, when not used as calibration parameters.
·Default parameters within a Simulink block.
E. Masked subsystems shall not be used to pass parameters to the underlying Simulink model.
Exceptions:
·Third-party subsystems where the underlying Simulink model is not available to the user.
以上规则的优先级均为:Required。
目标:Maintainability,Portability
【点评】大家可能已经注意到,这里只有A、B、E,没有了C、D,第一版中的C、D在这个版本中被合并到其他规则中了。
这里把A和B结合一下,模块的参数设置,直接使用参数名即可。考虑到后续的代码生成工作,基本上都可以使用参数对象,参数对象的定义如下:    
K = Simulink.Parameter
然后定义参数对象的数值,以及参数对象中有关代码生成相关的设置。
规则B中给了几个例外,比如,没有物理意义或者逻辑意义的数据,比如算平均值时用到除数2,再比如,1和0,通常用于表达真和假、开和关、通和断等开关量,这些量不会被用作标定量。说到这里,为了可读性,开关量定义为常数或者参数对象可能更好,比如ON/OFF,CLOSE/OPEN,更有助于提升模型的可读性。
再说一次,说明规则的模型中使用double数据类型总是有点别扭。
MISRA AC SLSF 007: Initialization
A.Blocks that have an initialization parameter (e.g. unit delays, integrators, outputs in conditionally executed subsystems) shall define the initialization value explicitly.
优先级:Required
目标:Functionality,Portability
【点评】这条规则没什么可说的,初始化的好习惯要养成。虽然你不做初始化,系统通常会默认处理为0初始化,但是,我们还是有必要做好初始化工作。
MISRA AC SLSF 008: Rounding and saturation in Simulink blocks
A.Simulink blocks that can be configured to saturation on overflow shall not have the saturation property selected.
优先级:Required
B. Simulink blocks that allow the integer rounding behavior to be configured shall be set to round towards zero.
优先级:Required    
目标:Functionality,Maintainability
【点评】规则A是为了把溢出处理工作做到明处,不要隐藏在模块设置里,也就是说,使用Saturation Block,好处显而易见,只是要避免滥用Saturation Block,看到过一些模型,不管青红皂白在所有输出端口前都加上Saturation Block,这是不负责任的另外一种体现,因为并非所有数据都有必要通过这个模块加以限制;再者,这也会造成代码量的增加,前面也提到过,Simulink Design Verifier可以分析哪些信号有可能溢出,而哪些信号根本不会溢出。
有关规则B,一律采用向0圆整,这种做法有些武断,可能会带来明显的精度损失,比如1.9这样的小数,被圆整之后变成的整数为1,精度损失是不是有点大?个人观点,圆整方式的选择,还是有考虑具体的要求,是不是只关心速度而不在乎精度?如果在乎精度,显然”四舍五入”更为合适。
MISRA AC SLSF 057: Bitwise Operator blocks
A.Bitwise operations shall be performed only on unsigned integers.
优先级:Required
目标:Usability, Maintainability,Functionality
【点评】这条规则没啥说的,但凡有点软件开发常识的都应该知道,不要拿浮点数、有符号数做位运算。只是,在前面Allowed Blocks规则里面,很多跟位运算相关的模块被不允许使用。
MISRA AC SLSF 009: Block execution frequency and order
B.Block priority shall not be used to specify the block execution order.
C. Block execution order shall be specified by either data flow or function calls.
D. All blocks shall have the sample time set to “inherited”.
Exceptions:
·Blocks that contain state information, for example discrete time integrators, unit delays, rate transitions and signal sources excluding inports and constants.
·Triggered subsystems and any logic within triggered subsystems.    
以上优先级均为:Required
目标:Functionality,Maintainability,Portability
【点评】
如图所示,每个模块都有Priority属性,但是,不要使用这个优先级去影响模型运行的时序,当然,很多时候也影响不了,就当成没有这个选项吧!
规则C还是让我们把事情做到明处,这里是模块或者子系统的执行顺序,希望由开发者人为指定。
规则D里的例外中提到了Discrete-Time Integrator,这不是附录E不允许使用的模块吗?所以说规则005就是瞎搞!
高铁上,1500来字写得我头晕眼花,就先这样,下回继续。同样,欢迎留言,欢迎讨论。   

推荐阅读


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

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

有关模型验证的一些基础逻辑

雕虫小技 | Simulink模型开发中的一些自动化方法

Let's KISS | 单元模型的圈复杂度多大合适?

MBD开发嵌入式软件的C语言基础



 

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