广告

一文搞懂AUTOSAR安全机制的程序流监控

2023-07-03 汽车电子与软件 阅读:
在autosar 定义中,一般的说 software monitor 指的是 通过看门狗实现的机制。那么在Autosar 定义的监控实体是什么呢?

从Autosar 说汽车软件监控a77ednc

在autosar 定义中,一般的说 software monitor 指的是 通过看门狗实现的机制。(当然有OS 和 其他定时器的机制,这里我们主要说一下看门狗)。a77ednc

那么在Autosar 定义的监控实体是什么呢?这里说一下解释。a77ednc

  • Alive Supervision a77ednc

检查程序被检测的点是否被运行到了,所以简单的来说,打check point的点,在定义的周期运行了,就通过。a77ednc

  • Deadline Supervisiona77ednc

这里需要两个check point. 开始点和结束点。结束点运行到的时间 减去 开始点运行到的时间,是否在设计范围内。a77ednc

  • Logical Supervision a77ednc

这个逻辑监控,也就是标题提到的 程序流监控,是对软件最有效的检测手段之一。可以定义多个check point. 并且定义好逻辑顺序,如1,2,3,4,5 则在软件运行的时候,1,2,3,4,5 需要依次被运行到,不可跳过 不可错序,否则认为 程序流有问题。a77ednc

从e-gas 三层架构谈软件监控a77ednc

在三层架构种,program flow control 在L3监控层a77ednc

具体的需求是什么呢:a77ednc

The program flow control shall verify if all monitored level2 modules are processing in fixed timeslots and in the right sequence.a77ednc

就是说 所有L2层 有固定时间的,有明确顺序的程序,都可以需要被监控。a77ednc

真的是 需求一句话,开发干费啦a77ednc

代码实现a77ednc

下面从三个方面说a77ednc

01a77ednc

看门狗在autosar 架构中位置a77ednc

在autosar定义中,看门狗有自己的独立纵向协议栈。a77ednc

  • WatchDog Drivera77ednc

  • WatchDog Interfacea77ednc

  • WatchDog Managementa77ednc

看门狗也有内狗,外狗之分。这里不一一赘述。a77ednc

这里拿内部看门狗为例子。a77ednc

寄存器 WDTSCON0 是一个比较重要的寄存器,在使用过程中 需要对REL 也就是常说的 喂狗的计数器进行赋值。当然具体使用我们没有必要扣,这里只需要直到这个,并且Mcal的接口会使用就可以了。a77ednc

/** brief Safety WDT Control Register 0 */typedef struct _Ifx_SCU_WDTS_CON0_Bits{    Ifx_Strict_32Bit ENDINIT:1;       /**< brief [0:0] End-of-Initialization Control Bit - ENDINIT (rwh) */    Ifx_Strict_32Bit LCK:1;           /**< brief [1:1] Lock Bit to Control Access to WDTxCON0 - LCK (rwh) */    Ifx_Strict_32Bit PW:14;           /**< brief [15:2] User-Definable Password Field for Access to WDTxCON0 - PW (rwh) */    Ifx_Strict_32Bit REL:16;          /**< brief [31:16] Reload Value for the WDT (also Time Check Value) - REL (rw) */} Ifx_SCU_WDTS_CON0_Bits;

Mcal 接口a77ednc

/********************************************************************************* Traceability     : [cover parentID={F43AB8FF-39D2-4828-8E27-1580287B2E57}] ****                                                                            **** Syntax           : void Wdg_17_Scu_SetTriggerCondition                     ****                    (                                                       ****                      const uint16 timeout                                  ****                    )                                                       ****                                                                            **** Description      : The function Wdg_17_Scu_SetTriggerCondition shall sets  ****                    Timeout value (milliseconds) for setting the trigger    ****                    counter                                                 **** [/cover]                                                                   ****                                                                            **** Service ID       : 0x03                                                    ****                                                                            **** Sync/Async       : Synchronous                                             ****                                                                            **** Reentrancy       : Non Reentrant                                           ****                                                                            **** Parameters(in)   : timeout - Timeout value for setting the trigger counter ****                                                                            **** Parameters (out) : none                                                    ****                                                                            **** Return value     : none                                                    ****                                                                            *********************************************************************************/

02a77ednc

看门狗在autosar中简单流程a77ednc

这里大可不必多说。截一张图,简单了解一下即可。我们主要关注如何实现。a77ednc

03a77ednc

Alive Supervision 如何实现a77ednc

在Autosar 中可以定义多个监控实体。Supervision Entity。这里叫做SE。a77ednc

一个SE 可以通过一系列的监控check point 来实现一系列的监控机制。a77ednc

这里假设我们设计了两个check point 分别为a77ednc

CP1a77ednc

CP2a77ednc

Autosar定义了一个APIa77ednc

/******************************************************************************************** Name              :   WdgM_CheckpointReached* Description       :   Indicates to the Watchdog Manager that a Checkpoint within a Supervised*                       Entity has been reached.* Parameters[in]    :   SEID, CheckpointID* Limitations       :   None* ReturnType        :   Std_ReturnType*******************************************************************************************/

从这个形参可以看出来,第一个是SE, 第二个是CP。a77ednc

所以从使用的角度来说。只需要在需要监控的地方调用。a77ednc

WdgM_CheckpointReached(WdgM_SupervisedEntityIdType SEID,WdgM_CheckpointIdType CheckpointID)

注意这里面监控不同的位置,需要不同的checkpoint ID。a77ednc

那么这个函数具体做什么了呢?怎么就起到监控效果了呢。a77ednc

这就要从这个结构体来说。a77ednc

typedef struct{    uint8 FailedAliveSupervisionRefCycleCtr;              /* To track the failed reference cycles of SE*/    uint8 FailedAliveSupervisionRefCycleTol;   /* Configuration Value to be copied at Mode change of WdgM from WdgM_LocalStatusParams. */    uint16 IndividualSupervisionCycleCtr;        /* To track the supervision cycles of SE*/    uint32 IndividualAliveUpdateCtr;    /* To track the alivecounter of SE*/    uint16 AliveSupervisionIdx;    WdgM_LocalStatusType NewLocalStatus;    WdgM_LocalStatusType OldLocalStatus;          /* Only to be updated in WdgM_MainFunction after current Monitoring Status is reported to RTE */}WdgM_SupervisedEntityDynType;

其中的a77ednc

IndividualAliveUpdateCtr

在每次调用的时候会自加1.a77ednc

这个需要个main函数配合使用,main函数里面同样监控这个数值,来和 约束好的上下限进行对比,如果超过上线限,则认为有问题发生。可以停止喂狗,或者是触发其他机制。a77ednc

这张图可以看清楚 如何和main函数配合。a77ednc

main 函数主要通过配置文件与时间的这个counter进行对比。a77ednc

if (((IndividualAliveUpdateCtrCache )>=                ((uint32)AliveSupervisionPtr[AliveSupervisionIdx].ExpectedAliveIndications - (uint32)AliveSupervisionPtr[AliveSupervisionIdx].MinMargin))&&                ((IndividualAliveUpdateCtrCache) <=                ((uint32)AliveSupervisionPtr[AliveSupervisionIdx].ExpectedAliveIndications + (uint32)AliveSupervisionPtr[AliveSupervisionIdx].MaxMargin)))

不过这里有个东西需要注意,就是监控周期,比如10个运行周期 只需要监控一次。或者每个周期都需要监控。那么这里的Max Min 肯定是需要有不同的配置的。a77ednc

假设CP1 的周期的 main的周期一致。并且配置10个周期监控一次。则 上下限可能设置为9,11a77ednc

下面有两个示例图。摘来的。仅供参考。可以通过这种机制 配置我们自己的软件。a77ednc

04a77ednc

Deadline Supervision 如何实现a77ednc

和上面一样,定义了CP0, CP1 a77ednc

这里也是通过一样的函数接口a77ednc

WdgM_CheckpointReached(WdgM_SupervisedEntityIdType SEID,WdgM_CheckpointIdType CheckpointID)

只是调用的时候,第二个参数不一样。a77ednc

这里简单说一下机制。配置文件记录了CP0 和 CP1。所以当软件运行到CP0 的时候, 该机制是知道这里是初始点。a77ednc

所以记录一下OS counter 这里为T1。a77ednc

当软件下一次运行到CP1 的时候,机制直到这里是结束点。记录一下OS Counter 这里为T2.a77ednc

直接 T2 -T1 和配置 设计的时间进行对比 即可。就可以直到 软甲你的这段运行时间是过长了 还是过短 了 还是正常。进而进行不同的操作 reaction.a77ednc

            RunningCounterValueTemp = WdgM_ConfigSetPtr->PtrToRunningCounterValue[DeadlineIdx];            if ((CheckpointID == DeadlineSupervisionPtr[DeadlineIdx].StopCheckpointId)&&                        (RunningCounterValueTemp != ((TickType)WDGM_PRV_C_ZERO)))            {#if((WDGM_RB_DEADLINE_TIMER_SELECTION) == (WDGM_RB_DEADLINE_TIMER_SELECTION_MCU))                ElapsedCounterValueTemp = RunningCounterValueTemp;                /*                 * TRACE[BSW_SWS_AR4_0_R2_WatchDogManager_Ext-2821]                 */                RunningCounterValueTemp = (TickType)Mcu_Rb_GetSysTicks();                ElapsedCounterValueTemp = RunningCounterValueTemp - ElapsedCounterValueTemp;                /*                 * TRACE[BSW_SWS_AR4_0_R2_WatchDogManager_Ext-2861]                 */                /* TRACE[WDGM229] Perform checking when deadline endpoint reached*/                if ((ElapsedCounterValueTemp >= DeadlineSupervisionPtr[DeadlineIdx].DeadlineMin) &&                        (ElapsedCounterValueTemp <= DeadlineSupervisionPtr[DeadlineIdx].DeadlineMax))                {

从这部分代码 可以看出来,Deadline Supervision 机制其实很简单。只需要计算出 ElapsedCounterValueTemp  即可。方式有很多。a77ednc

05a77ednc

Logical Supervision 如何实现a77ednc

Logical Supervision 也就是 ISO26262 和 E-Gas 非常推荐的 program flow control  monitor 机制。对软件的监控起到非常有效的作用。a77ednc

程序流监控参考循环, 也是对应监控实体的实际运行周期, 一般以WdgM监测主函数周期的整数倍来定
义。a77ednc

首先说一下这里的配置流。a77ednc

在配置过程中其实不是想着的那样1,2,3,4,5 而是a77ednc

1到2a77ednc

2到3a77ednc

3到4a77ednc

4到5a77ednc

这样的一个过程,相当于每一个流,只有两个checkpoint。组合起来就变成了一整个程序流。a77ednc

这里定义1,2,3,4,5a77ednc

分别被set 到不同的位置。a77ednc

当软件运行的cp1 的时候, 会记录当前节点为1, 当下一个节点运行到了3, 但是配置文件直到 上一个是1, 这一个应该是1 + const 数 不等于3, 那么机制就直到出了问题。a77ednc

这里看一下代码。a77ednc

当运行到一个CP点时候a77ednc

                       WdgM_InternalGraph_StatusDyn[InternalGraphIdx].idLastReachedCheckpoint = CheckpointID;                        WdgM_InternalGraph_StatusDyn[InternalGraphIdx].flgActivity = TRUE;

先在全局变量记录一下当前的cp 和状态。a77ednc

下一个CP时a77ednc

                    idxCPProperty_givenCP = WdgM_SupervisedEntity[SEID].idxInternalGraphCPProperty + WdgM_InternalGraph_StatusDyn[InternalGraphIdx].idLastReachedCheckpoint;                    idxStartDestCPs = WdgM_InternalGraph_CPProperty[idxCPProperty_givenCP].idxDestCheckpoints;                    nrDestCheckpoints = WdgM_InternalGraph_CPProperty[idxCPProperty_givenCP].nrDestCheckpoints;                    for(cntrDestCPs=0;cntrDestCPs                    {                        if(WdgM_InternalGraph_DestCheckpoints[idxStartDestCPs + cntrDestCPs] == CheckpointID)                        {                            WdgM_InternalGraph_StatusDyn[InternalGraphIdx].idLastReachedCheckpoint = CheckpointID;                            break;                        }                    }

通过上一个点计算出这次应该的dest 在通过start点,所以start 点 和 dest点可以计算出 这次的CP 应该是多少。a77ednc

这里就给出了判断。判断是否是正确的程序流。a77ednc

这就是三种监控的基本说明。a77ednc

当然还有更详细的机制,可不同core之间的监控。后面有机会再说。a77ednc

责编:Ricardo
文章来源及版权属于汽车电子与软件,EDN电子技术设计仅作转载分享,对文中陈述、观点判断保持中立,不对所包含内容的准确性、可靠性或完整性提供任何明示或暗示的保证。如有疑问,请联系Demi.xia@aspencore.com
汽车电子与软件
汽车电子与软件
  • 微信扫一扫
    一键转发
  • 最前沿的电子设计资讯
    请关注“电子技术设计微信公众号”
广告
热门推荐
广告
广告
EE直播间
在线研讨会
广告
广告
面包芯语
广告
向右滑动:上一篇 向左滑动:下一篇 我知道了