/注/ 作者,刘忠凯,内容摘录自作者发表的期刊文章,已获作者授权发布,内容供学习参考。
CP AUTOSAR中根据ISO26262提出的安全相关的需求,提出了对应的安全机制。针对ISO26262提出的Timing And Execution、Memory、Exchange of information三个方面的要求,CP AUTOSAR分别提供了时间保护(WDGM And OS Timing Protection)、内存保护(Memory Protection)、数据一致性(E2E算法)等安全机制来实现。Functional safety monitoring mechanism of WDGM针对功能安全对Timing and execution的安全机制,AUTOSAR中主要依靠两个主要的功能来保证,分别是AURTOSAR的WDGM协议栈以及OS的Timing Protection。每个被监控的函数称之为一个SE(Supervisor Entity)。在WDGM整个协议栈中主要提供了三种监控手段,具体的监控作用内容如下:- Alive Supervisor 监控:周期函数在特定的时间内调用不能频率过快或者过慢。SE的WDGM_CheckpointReached每调用一次,对应的Checkpoint的Alive Counter就会加1,主函数在定义的监控周期内会去检测Alive Counter的数目。只有Alive Counter在该周期内属于定义的次数范围就认为该SE处于正常的模式,如果Alive Counter小于定义的调度次数最小值则认为所监控的SE执行太慢,相反Alive Counter大于定义的调度次数最大值,则认为SE执行的太快。
- Deadline Supervisor 监控:监控两个函数调用间隔的时间限制。Deadline Supervision主要用于监控非周期运行的SE,主要定义了某个事件发生后,在特定的时间窗内去执行相应的SE的Checkpoint,一般认为在事件发生后在定义的最短时间和最长时间内去执行相应的Checkpoint,认为程序属于正常的执行,如果在事件发生后执行相关SE的Checkpoint时间小于最小的时间,或者大于最大的时间去执行SE的Checkpoint都认为是错误的。
- Logic Supervisor 监控:监控程序按照设计的调用逻辑进行调用。主要用于监控程序是否按照正确的逻辑转换条件去执行。对于每一个Logical Supervision都有一个调用关系图来表示SE中各个Checkpoint点在控制流上的转换关系。
在WDGM中每一个SE都有一个自己的Local Status来表示自己SE的Alive/Deadline/Logic Supervision的状态,同时WDGM还有一个全局的Global Status来表示整个监控功能的状态。在WDGM初始化完成后每个SE的各个子功能监控的Local Status以及Global Status的状态都是OK的状态。每个SE的Local Status以及Global Status都包含了OK、DEACTIVATED、FAILED、EXPIRED状态。在每个SE的功能做监控的时候,会根据监控的结果在MainFunction中设置对应的Local Status。其中Alive Supervision有单独的状态设置,而Deadline和Logic Supervision共用一个Local Status。在使用的时候可以根据每个SE的三个监控设计的条件在MainFunction中会设置对应的状态,同时MainFunction根据定义的所有SE的状态输出对应的Global Status,如果最终的Global Status出现错误的时候,User可以认为系统的时间或者函数的调度功能已经导致程序出现了Error,那么可以去触发相应的错误处理以及故障反应。除了WDGM对程序的执行以及逻辑进行时序的监控之外,在Task执行的时候可以通过OS的Timing Protection功能实现对函数调度以及Task被Block的时间监控。相比于WDGM的监控,OS Timing Protection的函数监控更侧重于非功能安全的任务Task调度以及被Block时间监控。图中绿色的是低优先级的Task,红色的是高优先级的Task。在实时抢占的系统中低优先级的Task可以被高优先级的Task抢占。OS Time Protection主要考虑低优先级的Task在被高优先级的Task抢占的情况下执行时间不能超过图中LOW Deadline定义的时间;保证被中断或者高优先级Task Block的时间不能太长大;保证LOW Inter-Arive Time的时间不能调度太快。在OS Timing Protection中,当达到上述定义的错误的时候可以选择相应的安全反应(Reset操作、结束函数调用等)来保证程序的正常运行。