万字来介绍一下Autosar WdgM

万字来介绍一下Autosar WdgM

BSW –> ASW Component –> Composition –> RTE –> OS –> 编译链接 

万字来介绍一下Autosar WdgM

Autsoar 看门狗 M

万字来介绍一下Autosar WdgM

目录

万字来介绍一下Autosar WdgM

  

          


一:原理简单介绍

1. 三种监控

1.1 Alive Supervision

监控任务,SWC 是否还在运行的checkpoint. 比如说10ms 运行一次的SWC, 看看是不是运行的准确?是不是快了,或者慢了,或者被不运行了。一般来说这种监控会使用在周期的运行中,

不过这种也会有很多的弊端,比如一个SWC1 被发现运行不到了,实际上很大情况不是这个SWC1 的问题,而是前面的SWC 或者是任务 不行了。这里也不重要了,各有利弊的监控手段。    

万字来介绍一下Autosar WdgM

1.2 Deadline Supervision

这里面就需要两个checkpoint. 一个开始,一个结束,概念很好理解。当然这个就可以用在周期的和非周期的。主要是看SWC 是否有进有出。中间没有卡顿,或者说被抢占回不来了的情况。    

万字来介绍一下Autosar WdgM

1.3 逻辑监控

逻辑监控简单的来说就是增加了很多个有定义顺序的checkpoint点来进行监控。很早以前叫做PFC – program flow control。

它可以监控出下面几种错误

Blocking of execution

Deadlocks

Livelocks

Incorrect allocation of execution time

Incorrect synchronization between software elements

在watchdog 里面配置很多个checkpoints, 在代码中不同的地方加入。达到下图的效果,经过每一个打卡点, WDGM 都会进行判断。    

万字来介绍一下Autosar WdgM

                  

上述所有的checkpoint 都是下面描述的过程,就没必要一一介绍了。

万字来介绍一下Autosar WdgM

                      

二:开发实操

2 BSW

2.1 BSW watchDog Modules

BSW 里面有很多的模块,这次我们从WdgM 入手,来说一下。

首先在WatchDog Modules 里面有如下几个配置项。

万字来介绍一下Autosar WdgM

实际上绝大部分的工作量都是在WdgM 里面。上面的ExtWdg以及 IntWdg 都是需要Mcal支持的。对于我们的应用层代码来说主要就是使用WdgM 提供的接口,下面会对接口进行生成,调度,使用。

2.2 WdgM

这里我们给出了两个WdgMModes

FastMode

SlowMode

Fastmode(快速模式):这种模式下,看门狗的时钟频率较高,因此其响应速度较快。当检测到系统故障或异常时,看门狗会很快触发复位操作,从而迅速恢复系统。这对于需要快速响应的应用场合是非常有用的。                 
Slowmode(慢速模式):与快速模式相反,这种模式下看门狗的时钟频率较低,因此其响应速度相对较慢。这种模式适用于那些对系统稳定性要求较高,但允许一定程度的延迟恢复的应用场合。    

万字来介绍一下Autosar WdgM

2.3 Alive Supervisions

这里我们设计一个监控Checkpoint的参数,目的是监控Core0 BSW 10ms 里面的运行 是否是 alive的。也就是说 是否被调度到。

WdgMAliveSupervision_core0_BSW_10ms

因为main函数我设置了0.001s 的调度周期,所以这里设置的参数意思是 主函数运行100次 需要运行这一个checkpoint 10次。容错不能超过10次,最少也要运行9次。

配置如下

万字来介绍一下Autosar WdgM    

2.4 Deadline Supervisions

这里我们设计一个监控Checkpoint的参数,目的是监控Core0 BSW 10ms 里面的运行 是否从头运行到尾。也就是说 是否完全执行了。以及运行的时间长短进行监控

WdgMDeadlineSupervision_core0_BSW_10ms

因为我们是监控10ms 任务里面的runnbale. 所以这里加了时间。最大只允许运行0.01s 最小可以不调度。

注意这里需要reference 两个point 一个是 dealine 的 起点,一个是deadline 的 stop点。正常来说,这个具体位置是开发人员自己定义的。根据需求定义的。这里只是实现了机制本身。

配置如下

万字来介绍一下Autosar WdgM

2.5 Program Flow Monitor

这里我们通过SE2 来对程序流进行监控。下面的配置需要几个位置,逐一介绍。

WdgMLocalStatusParams_core0_BSW_10ms

下图为程序流的主体。只体现了SE 也就是监控实体。和容错。容错是0. 也就是说 一点也不可以跑乱。    

万字来介绍一下Autosar WdgM

2.5.1 PFM 内部终点起点

我们设计了三个点。

0,1,2 运行顺序按照0,1,2 的顺序运行。

下面只给了起点和终点。    

万字来介绍一下Autosar WdgM

2.5.2 PFM 内部流

根据上面配置的终点 与 起点。在实际操作过程中,只是两个点之间的计算,所以再多的位置,也是两个两个组成的。

所以这里配置的结果是

0-1;1-2 的过程。

万字来介绍一下Autosar WdgM

到此位置BSW 的模块配置完毕,我们生成代码看一下大概的变动在哪里。

                        

2.6 BSW 代码生成

2.6.1 配置文件改变

全局变量与结构体。在后面实际调试过程解释。这里解释也没什么用途。

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;

              

typedef struct                    {                        uint16 NoOfCheckpoint;                        boolean PartionEnabled;                        CounterType TimerId;                        ApplicationType OsApplicationId;                        const WdgM_CheckpointType * PtrToCheckpoint;                        WdgM_SupervisedEntityDynType * const PtrToSupervisedEntityDyn;                    #if WDGM_INTERNAL_GRAPH_CONFIGURED == STD_ON                        boolean hasInternalGraph;    /* True means it has Internal Graph, False means it does not have Internal Graph*/                        uint16 idxInternalGraphCPProperty;                    #endif                        }WdgM_SupervisedEntityType;                    

                   

const WdgM_SupervisedEntityType WdgM_SupervisedEntity


typedef struct                    {                        uint16 NoOfDeadlineSupervision;                        uint16 * PtrToDeadlineIndices;                    }WdgM_CheckpointDynType;                    

typedef struct { WdgM_CheckpointDynType * const PtrToCheckpointDyn; }WdgM_CheckpointType;

                   

const WdgM_CheckpointType WdgM_Checkpoint

typedef struct                    {                        uint8 FailedAliveSupervisionRefCycleTol;                        WdgM_SupervisedEntityIdType SupervisedEntityId;                    }WdgM_LocalStatusParamsType;                    

const WdgM_LocalStatusParamsType WdgM_LocalStatusParams

2.7 BSW 总结

至此BSW 代码生成完毕

3. ASW

上面BSW 只是把机制本身实现了。但是我们还是需要在应用代码中使用WdgM 不然真的成点点点工程师了。好了。当我们有了系统需求之后,知道要对什么代码,进行什么样的监控,就可以来使用上面配置好的接口了。这里我们没有需求,就做一个UT 来调用一下前面生成的接口。

3.1 SWC 开发

从新建一个SWC 开始,这里没有花里胡哨的操作,只是新建了一个简单的SWC。名字叫做

WdgM_UUUUT

AR package 叫做Component. 为什么这么写呢。其实写的也不规范,需要有前缀空间。这里只是为了方面,就叫Component了。也为了后面如果需要新建port, 数据类型等,可以区分 AR package 。这样在后面移植 Component 就很方便。可以直接copy arxml 就可以了。    

万字来介绍一下Autosar WdgM

通过上面的操作我们得到了一个componet

万字来介绍一下Autosar WdgM

3.2 BSW 给ASW 提供的接口

在上一章 制作BSW 的时候。软件自动生成了Componet, 我们可以叫他为Service Component。

autosar 的 component 类型有如下几种

应用软件组件:主要用于实现应用层控制算法;

传感器/执行器软件组件:用于处理具体传感器/执行器的信号,可以直接与ECU抽象层交互;

标定参数软件组件:主要提供标定参数值;

ECU抽象软件组件:提供访问ECU具体I/O的能力,该软件组件一般提供引用C/S接口的供型端口,即Server端,由其他软件组件(如传感器/执行器软件组件)的需型端口(Client 端)调用。此外,ECU抽象软件组件也可以直接和一些基础软件进行交互;    

复杂设备驱动软件组件:推广了ECU抽象软件组件,它可以定义端口与其他软件组件通信,还可以与ECU硬件直接交互。所以,该类软件组件灵活性最强,但由于其和应用对象强相关,从而导致其可移植性较差;

服务软件组件:主要用于基础软件层,可通过标准接口或标准AUTOSAR接口与其他类型的软件组件进行交互。

上图的那个紫色的,就是服务软件组件。

好了。

前面的WdgM生成WdgM 的ASW 模块 包含如下接口。新生成的。也就是更新了文件

WdgM_Cfg_SWCD.arxml

具体生成的接口如下图

万字来介绍一下Autosar WdgM    

3.3 SWC 接口使用

这里没有我们自己新建的接口,所以不需要新建,也不需要动配置文件本身(我的意思是前面提到的AR Package 新增)

这里我们使用下面几个接口,直接点击R porting 进行添加即可。


RP_AliveCore0Bsw10ms

R Port

WdgM_LocalSupervision

                          

                          

                          

RP_DealineStartCore0Bsw10ms

R Port

WdgM_LocalSupervision

                          

                          

                          

RP_DealineStopCore0Bsw10ms

R Port

WdgM_LocalSupervision

                          

                          

                          

RP_PFM_Core0BSW10ms_CP0

R Port

WdgM_LocalSupervision

                          

                          

                          

RP_PFM_Core0BSW10ms_CP1

R Port

WdgM_LocalSupervision

                          

                          

                          

RP_PFM_Core0BSW10ms_CP2

R Port

WdgM_LocalSupervision

                          

                          

                          

RP_WdgM_LocalSupervisionStatus_se1

R Port

WdgM_LocalSupervisionStatus

RP_SE1GlobalSupervision

R Port

WdgM_GlobalSupervision

RP_SE1GlobalSupervision

R Port

WdgM_GlobalSupervision

RP_SE1GlobalSupervision

R Port

WdgM_GlobalSupervision

RP_SE1GlobalSupervision

R Port

WdgM_GlobalSupervision

RP_SE1GlobalSupervision

R Port

WdgM_GlobalSupervision

RP_SE1GlobalSupervision

R Port

WdgM_GlobalSupervision

如下图    

万字来介绍一下Autosar WdgM

3.4 SWC runnable

这里需要我们实现一些runnable, 也就是内部我们需要自己实现的代码。其实这里少了一步骤,就是前面需要新建一个IB, 因为runnable 是存在于IB 内部的。后面补上。这里我们添加这些runnables

Internal Behaviour

Runnable Entity

IB_WdgM_UUUUT

RE_WdgM_UUUUT_main_10ms

IB_WdgM_UUUUT

RE_WdgM_UUUUT_alive_10ms

IB_WdgM_UUUUT

RE_WdgM_UUUUT_deadStart_10ms

IB_WdgM_UUUUT

RE_WdgM_UUUUT_deadStop_10ms

IB_WdgM_UUUUT

RE_WdgM_UUUUT_PFM0_10ms

IB_WdgM_UUUUT

RE_WdgM_UUUUT_PFM1_10ms

IB_WdgM_UUUUT

RE_WdgM_UUUUT_PFM2_10ms

IB_WdgM_UUUUT

RE_WdgM_UUUUT_GlobalSupervision

IB_WdgM_UUUUT

RE_WdgM_UUUUT_LocalSupervisionStatus

如下图    

万字来介绍一下Autosar WdgM

注意这里的runnable 是需要调用前面引入的接口的。下面举个例子如何添加。如下图,找server call 即可。找到自己需要的。添加进来。根据自己的需求选择同步还是异步。

举个例子

万字来介绍一下Autosar WdgM

3.5 SWC runnable的触发方式

autosar 定义了很多种触发方式,    

万字来介绍一下Autosar WdgM

不过我们这里比较简单,只有周期触发。每一个runnable 都被放到了0.01 的周期里面去了。

万字来介绍一下Autosar WdgM

3.6 总览ASW 开发

前面提到的缺少IB, 在这里添加进来了。否在无法加入runnable.    

万字来介绍一下Autosar WdgM    

3.7 ASW 代码生成

万字来介绍一下Autosar WdgM

                  

FUNC (void, WdgM_UUUUT_CODE) RE_WdgM_UUUUT_GlobalSupervision_func/* return value & FctID */                   (                                         void                   )                   {                                                 WdgM_SupervisedEntityIdType SEID1;                              Std_ReturnType syncCall1;                              WdgM_GlobalStatusType Status2;                              Std_ReturnType syncCall2;                              WdgM_ModeType Mode3;                              Std_ReturnType syncCall3;                              Std_ReturnType syncCall4;                              WdgM_ModeType Mode4;                              Std_ReturnType syncCall5;                                                 /* Local Data Declaration */                                                 /*PROTECTED REGION ID(UserVariables :RE_WdgM_UUUUT_GlobalSupervision_func) ENABLED START */                              /* Start of user variable defintions - Do not remove this comment  */                              /* End of user variable defintions - Do not remove this comment  */                              /*PROTECTED REGION END */                              Std_ReturnType retValue = RTE_E_OK;                              /*  -------------------------------------- Data Read -----------------------------------------  */                                                 /*  -------------------------------------- Server Call Point  --------------------------------  */                                                 syncCall1 = Rte_Call_RP_SE1GlobalSupervision_GetFirstExpiredSEID(&SEID1);                                                 syncCall2 = Rte_Call_RP_SE1GlobalSupervision_GetGlobalStatus(&Status2);                                                 syncCall3 = Rte_Call_RP_SE1GlobalSupervision_GetMode(&Mode3);                                                 syncCall4 = Rte_Call_RP_SE1GlobalSupervision_PerformReset();                                                 syncCall5 = Rte_Call_RP_SE1GlobalSupervision_SetMode(Mode4);                                                 /*  -------------------------------------- CDATA ---------------------------------------------  */                                                 /*  -------------------------------------- Data Write ----------------------------------------  */                                                 /*  -------------------------------------- Trigger Interface ---------------------------------  */                                                 /*  -------------------------------------- Mode Management -----------------------------------  */                                                 /*  -------------------------------------- Port Handling -------------------------------------  */                                                 /*  -------------------------------------- Exclusive Area ------------------------------------  */                                                 /*  -------------------------------------- Multiple Instantiation ----------------------------  */                                                 /*PROTECTED REGION ID(User Logic :RE_WdgM_UUUUT_GlobalSupervision_func) ENABLED START */                              /* Start of user code - Do not remove this comment */                              /* End of user code - Do not remove this comment */                              /*PROTECTED REGION END */                                      }                   #define WdgM_UUUUT_STOP_SEC_CODE                     #include "WdgM_UUUUT_MemMap.h"                    #define WdgM_UUUUT_START_SEC_CODE                                      #include "WdgM_UUUUT_MemMap.h"                   FUNC (void, WdgM_UUUUT_CODE) RE_WdgM_UUUUT_LocalSupervisionStatus_func/* return value & FctID */                   (                                         void                   )                   {                                                 WdgM_LocalStatusType Status5;                              Std_ReturnType syncCall1;                                                 /* Local Data Declaration */                                                 /*PROTECTED REGION ID(UserVariables :RE_WdgM_UUUUT_LocalSupervisionStatus_func) ENABLED START */                              /* Start of user variable defintions - Do not remove this comment  */                              /* End of user variable defintions - Do not remove this comment  */                              /*PROTECTED REGION END */                              Std_ReturnType retValue = RTE_E_OK;                              /*  -------------------------------------- Data Read -----------------------------------------  */                                                 /*  -------------------------------------- Server Call Point  --------------------------------  */                                                 syncCall1 = Rte_Call_RP_WdgM_LocalSupervisionStatus_se1_GetLocalStatus(&Status5);                                                 /*  -------------------------------------- CDATA ---------------------------------------------  */                                                 /*  -------------------------------------- Data Write ----------------------------------------  */                                                 /*  -------------------------------------- Trigger Interface ---------------------------------  */                                                 /*  -------------------------------------- Mode Management -----------------------------------  */                                                 /*  -------------------------------------- Port Handling -------------------------------------  */                                                 /*  -------------------------------------- Exclusive Area ------------------------------------  */                                                 /*  -------------------------------------- Multiple Instantiation ----------------------------  */                                                 /*PROTECTED REGION ID(User Logic :RE_WdgM_UUUUT_LocalSupervisionStatus_func) ENABLED START */                              /* Start of user code - Do not remove this comment */                              /* End of user code - Do not remove this comment */                              /*PROTECTED REGION END */                                      }                   #define WdgM_UUUUT_STOP_SEC_CODE                     #include "WdgM_UUUUT_MemMap.h"                    #define WdgM_UUUUT_START_SEC_CODE                                      #include "WdgM_UUUUT_MemMap.h"                   FUNC (void, WdgM_UUUUT_CODE) RE_WdgM_UUUUT_PFM0_10ms_func/* return value & FctID */                   (                                         void                   )                   {                                                 Std_ReturnType syncCall1;                                                 /* Local Data Declaration */                                                 /*PROTECTED REGION ID(UserVariables :RE_WdgM_UUUUT_PFM0_10ms_func) ENABLED START */                              /* Start of user variable defintions - Do not remove this comment  */                              /* End of user variable defintions - Do not remove this comment  */                              /*PROTECTED REGION END */                              Std_ReturnType retValue = RTE_E_OK;                              /*  -------------------------------------- Data Read -----------------------------------------  */                                                 /*  -------------------------------------- Server Call Point  --------------------------------  */                                                 syncCall1 = Rte_Call_RP_PFM_Core0BSW10ms_CP0_CheckpointReached();                                                 /*  -------------------------------------- CDATA ---------------------------------------------  */                                                 /*  -------------------------------------- Data Write ----------------------------------------  */                                                 /*  -------------------------------------- Trigger Interface ---------------------------------  */                                                 /*  -------------------------------------- Mode Management -----------------------------------  */                                                 /*  -------------------------------------- Port Handling -------------------------------------  */                                                 /*  -------------------------------------- Exclusive Area ------------------------------------  */                                                 /*  -------------------------------------- Multiple Instantiation ----------------------------  */                                                 /*PROTECTED REGION ID(User Logic :RE_WdgM_UUUUT_PFM0_10ms_func) ENABLED START */                              /* Start of user code - Do not remove this comment */                              /* End of user code - Do not remove this comment */                              /*PROTECTED REGION END */                                      }                   #define WdgM_UUUUT_STOP_SEC_CODE                     #include "WdgM_UUUUT_MemMap.h"                    #define WdgM_UUUUT_START_SEC_CODE                                      #include "WdgM_UUUUT_MemMap.h"                   FUNC (void, WdgM_UUUUT_CODE) RE_WdgM_UUUUT_PFM1_10ms_func/* return value & FctID */                   (                                         void                   )                   {                                                 Std_ReturnType syncCall1;                                                 /* Local Data Declaration */                                                 /*PROTECTED REGION ID(UserVariables :RE_WdgM_UUUUT_PFM1_10ms_func) ENABLED START */                              /* Start of user variable defintions - Do not remove this comment  */                              /* End of user variable defintions - Do not remove this comment  */                              /*PROTECTED REGION END */                              Std_ReturnType retValue = RTE_E_OK;                              /*  -------------------------------------- Data Read -----------------------------------------  */                                                 /*  -------------------------------------- Server Call Point  --------------------------------  */                                                 syncCall1 = Rte_Call_RP_PFM_Core0BSW10ms_CP1_CheckpointReached();                                                 /*  -------------------------------------- CDATA ---------------------------------------------  */                                                 /*  -------------------------------------- Data Write ----------------------------------------  */                                                 /*  -------------------------------------- Trigger Interface ---------------------------------  */                                                 /*  -------------------------------------- Mode Management -----------------------------------  */                                                 /*  -------------------------------------- Port Handling -------------------------------------  */                                                 /*  -------------------------------------- Exclusive Area ------------------------------------  */                                                 /*  -------------------------------------- Multiple Instantiation ----------------------------  */                                                 /*PROTECTED REGION ID(User Logic :RE_WdgM_UUUUT_PFM1_10ms_func) ENABLED START */                              /* Start of user code - Do not remove this comment */                              /* End of user code - Do not remove this comment */                              /*PROTECTED REGION END */                                      }                   #define WdgM_UUUUT_STOP_SEC_CODE                     #include "WdgM_UUUUT_MemMap.h"                    #define WdgM_UUUUT_START_SEC_CODE                                      #include "WdgM_UUUUT_MemMap.h"                   FUNC (void, WdgM_UUUUT_CODE) RE_WdgM_UUUUT_PFM2_10ms_func/* return value & FctID */                   (                                         void                   )                   {                                                 Std_ReturnType syncCall1;                                                 /* Local Data Declaration */                                                 /*PROTECTED REGION ID(UserVariables :RE_WdgM_UUUUT_PFM2_10ms_func) ENABLED START */                              /* Start of user variable defintions - Do not remove this comment  */                              /* End of user variable defintions - Do not remove this comment  */                              /*PROTECTED REGION END */                              Std_ReturnType retValue = RTE_E_OK;                              /*  -------------------------------------- Data Read -----------------------------------------  */                                                 /*  -------------------------------------- Server Call Point  --------------------------------  */                                                 syncCall1 = Rte_Call_RP_PFM_Core0BSW10ms_CP2_CheckpointReached();                                                 /*  -------------------------------------- CDATA ---------------------------------------------  */                                                 /*  -------------------------------------- Data Write ----------------------------------------  */                                                 /*  -------------------------------------- Trigger Interface ---------------------------------  */                                                 /*  -------------------------------------- Mode Management -----------------------------------  */                                                 /*  -------------------------------------- Port Handling -------------------------------------  */                                                 /*  -------------------------------------- Exclusive Area ------------------------------------  */                                                 /*  -------------------------------------- Multiple Instantiation ----------------------------  */                                                 /*PROTECTED REGION ID(User Logic :RE_WdgM_UUUUT_PFM2_10ms_func) ENABLED START */                              /* Start of user code - Do not remove this comment */                              /* End of user code - Do not remove this comment */                              /*PROTECTED REGION END */                                      }                   #define WdgM_UUUUT_STOP_SEC_CODE                     #include "WdgM_UUUUT_MemMap.h"                    #define WdgM_UUUUT_START_SEC_CODE                                      #include "WdgM_UUUUT_MemMap.h"                   FUNC (void, WdgM_UUUUT_CODE) RE_WdgM_UUUUT_alive_10ms_func/* return value & FctID */                   (                                         void                   )                   {                                                 Std_ReturnType syncCall1;                                                 /* Local Data Declaration */                                                 /*PROTECTED REGION ID(UserVariables :RE_WdgM_UUUUT_alive_10ms_func) ENABLED START */                              /* Start of user variable defintions - Do not remove this comment  */                              /* End of user variable defintions - Do not remove this comment  */                              /*PROTECTED REGION END */                              Std_ReturnType retValue = RTE_E_OK;                              /*  -------------------------------------- Data Read -----------------------------------------  */                                                 /*  -------------------------------------- Server Call Point  --------------------------------  */                                                 syncCall1 = Rte_Call_RP_AliveCore0Bsw10ms_CheckpointReached();                                                 /*  -------------------------------------- CDATA ---------------------------------------------  */                                                 /*  -------------------------------------- Data Write ----------------------------------------  */                                                 /*  -------------------------------------- Trigger Interface ---------------------------------  */                                                 /*  -------------------------------------- Mode Management -----------------------------------  */                                                 /*  -------------------------------------- Port Handling -------------------------------------  */                                                 /*  -------------------------------------- Exclusive Area ------------------------------------  */                                                 /*  -------------------------------------- Multiple Instantiation ----------------------------  */                                                 /*PROTECTED REGION ID(User Logic :RE_WdgM_UUUUT_alive_10ms_func) ENABLED START */                              /* Start of user code - Do not remove this comment */                              /* End of user code - Do not remove this comment */                              /*PROTECTED REGION END */                                      }                   #define WdgM_UUUUT_STOP_SEC_CODE                     #include "WdgM_UUUUT_MemMap.h"                    #define WdgM_UUUUT_START_SEC_CODE                                      #include "WdgM_UUUUT_MemMap.h"                   FUNC (void, WdgM_UUUUT_CODE) RE_WdgM_UUUUT_deadStart_10ms_func/* return value & FctID */                   (                                         void                   )                   {                                                 Std_ReturnType syncCall1;                                                 /* Local Data Declaration */                                                 /*PROTECTED REGION ID(UserVariables :RE_WdgM_UUUUT_deadStart_10ms_func) ENABLED START */                              /* Start of user variable defintions - Do not remove this comment  */                              /* End of user variable defintions - Do not remove this comment  */                              /*PROTECTED REGION END */                              Std_ReturnType retValue = RTE_E_OK;                              /*  -------------------------------------- Data Read -----------------------------------------  */                                                 /*  -------------------------------------- Server Call Point  --------------------------------  */                                                 syncCall1 = Rte_Call_RP_DealineStartCore0Bsw10ms_CheckpointReached();                                                 /*  -------------------------------------- CDATA ---------------------------------------------  */                                                 /*  -------------------------------------- Data Write ----------------------------------------  */                                                 /*  -------------------------------------- Trigger Interface ---------------------------------  */                                                 /*  -------------------------------------- Mode Management -----------------------------------  */                                                 /*  -------------------------------------- Port Handling -------------------------------------  */                                                 /*  -------------------------------------- Exclusive Area ------------------------------------  */                                                 /*  -------------------------------------- Multiple Instantiation ----------------------------  */                                                 /*PROTECTED REGION ID(User Logic :RE_WdgM_UUUUT_deadStart_10ms_func) ENABLED START */                              /* Start of user code - Do not remove this comment */                              /* End of user code - Do not remove this comment */                              /*PROTECTED REGION END */                                      }                   #define WdgM_UUUUT_STOP_SEC_CODE                     #include "WdgM_UUUUT_MemMap.h"                    #define WdgM_UUUUT_START_SEC_CODE                                      #include "WdgM_UUUUT_MemMap.h"                   FUNC (void, WdgM_UUUUT_CODE) RE_WdgM_UUUUT_deadStop_10ms_func/* return value & FctID */                   (                                         void                   )                   {                                                 Std_ReturnType syncCall1;                                                 /* Local Data Declaration */                                                 /*PROTECTED REGION ID(UserVariables :RE_WdgM_UUUUT_deadStop_10ms_func) ENABLED START */                              /* Start of user variable defintions - Do not remove this comment  */                              /* End of user variable defintions - Do not remove this comment  */                              /*PROTECTED REGION END */                              Std_ReturnType retValue = RTE_E_OK;                              /*  -------------------------------------- Data Read -----------------------------------------  */                                                 /*  -------------------------------------- Server Call Point  --------------------------------  */                                                 syncCall1 = Rte_Call_RP_DealineStopCore0Bsw10ms_CheckpointReached();                                                 /*  -------------------------------------- CDATA ---------------------------------------------  */                                                 /*  -------------------------------------- Data Write ----------------------------------------  */                                                 /*  -------------------------------------- Trigger Interface ---------------------------------  */                                                 /*  -------------------------------------- Mode Management -----------------------------------  */                                                 /*  -------------------------------------- Port Handling -------------------------------------  */                                                 /*  -------------------------------------- Exclusive Area ------------------------------------  */                                                 /*  -------------------------------------- Multiple Instantiation ----------------------------  */                                                 /*PROTECTED REGION ID(User Logic :RE_WdgM_UUUUT_deadStop_10ms_func) ENABLED START */                              /* Start of user code - Do not remove this comment */                              /* End of user code - Do not remove this comment */                              /*PROTECTED REGION END */                                      }                   #define WdgM_UUUUT_STOP_SEC_CODE                     #include "WdgM_UUUUT_MemMap.h"                    #define WdgM_UUUUT_START_SEC_CODE                                      #include "WdgM_UUUUT_MemMap.h"                   FUNC (void, WdgM_UUUUT_CODE) RE_WdgM_UUUUT_main_10ms_func/* return value & FctID */                   (                                         void                   )                   {                                                 /* Local Data Declaration */                                                 /*PROTECTED REGION ID(UserVariables :RE_WdgM_UUUUT_main_10ms_func) ENABLED START */                              /* Start of user variable defintions - Do not remove this comment  */                              /* End of user variable defintions - Do not remove this comment  */                              /*PROTECTED REGION END */                              Std_ReturnType retValue = RTE_E_OK;                              /*  -------------------------------------- Data Read -----------------------------------------  */                                                 /*  -------------------------------------- Server Call Point  --------------------------------  */                                                 /*  -------------------------------------- CDATA ---------------------------------------------  */                                                 /*  -------------------------------------- Data Write ----------------------------------------  */                                                 /*  -------------------------------------- Trigger Interface ---------------------------------  */                                                 /*  -------------------------------------- Mode Management -----------------------------------  */                                                 /*  -------------------------------------- Port Handling -------------------------------------  */                                                 /*  -------------------------------------- Exclusive Area ------------------------------------  */                                                 /*  -------------------------------------- Multiple Instantiation ----------------------------  */                                                 /*PROTECTED REGION ID(User Logic :RE_WdgM_UUUUT_main_10ms_func) ENABLED START */                              /* Start of user code - Do not remove this comment */                              /* End of user code - Do not remove this comment */                              /*PROTECTED REGION END */                                      }

主要的贡献来自于 文件

WdgM_UUUUT.arxml

4. Componsition

在前面我们做好了Component的设计。为了整个架构的清晰,这里我们也把不同的component 安排进了不同的composition. 其实componsition 对于代码角度来说,没什么好说的。只是从设计的角度,从框架的角度来说的。这里我们把前面的 component 放到 需要的 composition 里面。如下操作。

万字来介绍一下Autosar WdgM

4.1 SWC 与 SWC 连接

在composition里面,由于刚才做的两个SWC 都属于同一个composition 所以这里不需要 跨 composition的 连接操作。这里属于比较简单的。我们把刚才设计的接口进行连接

万字来介绍一下Autosar WdgM

4.2 连接结果

连接完成之后在下面可以看一下连接的结果,检查一下是否正确。当然可以让软件自动给我们连接。只是自动连接通过的规则是名字,或者是文件等。我们这里手动连接了,也不多。而且是自己设计的,名字可以打错了,对不上。

万字来介绍一下Autosar WdgM

5. RTE

5.1 ECU 提取

如果动了系统描述文件,需要把我们的ECU 从系统中提取抽象出来

万字来介绍一下Autosar WdgM

5.2 RTE 配置

通过刚才生成的ECU 抽象。我们用RTE 打开。发现前面做time event 对应的runnbale 在这里出现了。

也就是说,现在可以把ASW 里面设计的 runnable 进行 mapping.

这个mapping的意思就是往不同的task 里面去放置。我们把这些runnable 放在 不同的任务中。

如下图

万字来介绍一下Autosar WdgM

5.2 RTE 生成

生成RTE

万字来介绍一下Autosar WdgM

                  

好了RTE 生成 成功了

万字来介绍一下Autosar WdgM

                  

5.3 RTE 代码生成

简单的来说,把前面制作的runnable 这里都生成了一些 extern 和 相对应的宏。大概如下

FUNC(void, WdgM_UUUUT_CODE) RE_WdgM_UUUUT_GlobalSupervision_func(void);                  FUNC(void, WdgM_UUUUT_CODE) RE_WdgM_UUUUT_LocalSupervisionStatus_func(void);                  FUNC(void, WdgM_UUUUT_CODE) RE_WdgM_UUUUT_PFM0_10ms_func(void);                  FUNC(void, WdgM_UUUUT_CODE) RE_WdgM_UUUUT_PFM1_10ms_func(void);                  FUNC(void, WdgM_UUUUT_CODE) RE_WdgM_UUUUT_PFM2_10ms_func(void);                  FUNC(void, WdgM_UUUUT_CODE) RE_WdgM_UUUUT_alive_10ms_func(void);                  FUNC(void, WdgM_UUUUT_CODE) RE_WdgM_UUUUT_deadStart_10ms_func(void);                  FUNC(void, WdgM_UUUUT_CODE) RE_WdgM_UUUUT_deadStop_10ms_func(void);                  FUNC(void, WdgM_UUUUT_CODE) RE_WdgM_UUUUT_main_10ms_func(void);


typedef P2FUNC(VAR(Std_ReturnType, AUTOMATIC), RTE_CODE, Rte_CallFP_WdgM_UUUUT_WdgM_GlobalSupervision_GetFirstExpiredSEID) (CONSTP2VAR(WdgM_SupervisedEntityIdType, AUTOMATIC, RTE_APPL_DATA) SEID);                  

typedef P2FUNC(VAR(Std_ReturnType, AUTOMATIC), RTE_CODE, Rte_CallFP_WdgM_UUUUT_WdgM_GlobalSupervision_GetGlobalStatus) (CONSTP2VAR(WdgM_GlobalStatusType, AUTOMATIC, RTE_APPL_DATA) Status);

typedef P2FUNC(VAR(Std_ReturnType, AUTOMATIC), RTE_CODE, Rte_CallFP_WdgM_UUUUT_WdgM_GlobalSupervision_GetMode) (CONSTP2VAR(WdgM_ModeType, AUTOMATIC, RTE_APPL_DATA) Mode);

typedef P2FUNC(VAR(Std_ReturnType, AUTOMATIC), RTE_CODE, Rte_CallFP_WdgM_UUUUT_WdgM_GlobalSupervision_PerformReset) (void);

typedef P2FUNC(VAR(Std_ReturnType, AUTOMATIC), RTE_CODE, Rte_CallFP_WdgM_UUUUT_WdgM_GlobalSupervision_SetMode) (VAR(WdgM_ModeType, AUTOMATIC) Mode);

typedef P2FUNC(VAR(Std_ReturnType, AUTOMATIC), RTE_CODE, Rte_CallFP_WdgM_UUUUT_WdgM_LocalSupervisionStatus_GetLocalStatus) (CONSTP2VAR(WdgM_LocalStatusType, AUTOMATIC, RTE_APPL_DATA) Status);

typedef P2FUNC(VAR(Std_ReturnType, AUTOMATIC), RTE_CODE, Rte_CallFP_WdgM_UUUUT_WdgM_LocalSupervision_CheckpointReached) (void);

对于配置文件,我看了一下,没有生成OS 相关的文件。这里说一下大概哪些会对OS 有影响。

如果是改变了Task 本身,中断本身,IOC 等就需要生成OS。前面有一篇文章说到了OS 的 object. 可以参考一下。这里我们为了文章统一,也生成OS 看一下。

6. OS

根据前面的配置,我么生成OS,看看是否有变化。

万字来介绍一下Autosar WdgM

生成了代码,和预想的一样没有变化。因为前面生成的RTE 没有改动os_needs.arxml 和 IOC.arxml

7. 编译调试

7.1编译链接

编译通过,刷写看一下

TricoreHightec.elf

我们读一下elf 也就是可执行文件里面是否有我们前面设计的东西。这里简单的读一下就行了,不全面。知道即可。

tricore-readelf.exe -a .D_ETAS_BIP_HAD_TricoreHightec.elf | grep UUUUT                      555: 00000000     0 FILE    LOCAL  DEFAULT   ABS WdgM_UUUUT.c                     3551: 8010aa52     4 FUNC    GLOBAL DEFAULT    90 Rte_Call_WdgM_UUUUT_RP_SE                     3660: 800738fc     8 FUNC    GLOBAL DEFAULT    63 RE_WdgM_UUUUT_PFM0_10ms_f                     4265: 8010aa20     8 FUNC    GLOBAL DEFAULT    90 Rte_Call_WdgM_UUUUT_RP_Al                     4645: 80073914     8 FUNC    GLOBAL DEFAULT    63 RE_WdgM_UUUUT_alive_10ms_                     4685: 8010aa3e     8 FUNC    GLOBAL DEFAULT    90 Rte_Call_WdgM_UUUUT_RP_PF                     4796: 8010aa62     4 FUNC    GLOBAL DEFAULT    90 Rte_Call_WdgM_UUUUT_RP_SE                     5140: 80073904     8 FUNC    GLOBAL DEFAULT    63 RE_WdgM_UUUUT_PFM1_10ms_f                     5414: 8010aa5a     8 FUNC    GLOBAL DEFAULT    90 Rte_Call_WdgM_UUUUT_RP_SE                     5436: 8010aa66     6 FUNC    GLOBAL DEFAULT    90 Rte_Call_WdgM_UUUUT_RP_Wd                     6344: 8010aa28     6 FUNC    GLOBAL DEFAULT    90 Rte_Call_WdgM_UUUUT_RP_De                     6496: 8010aa2e     8 FUNC    GLOBAL DEFAULT    90 Rte_Call_WdgM_UUUUT_RP_De                     6609: 8010aa46     8 FUNC    GLOBAL DEFAULT    90 Rte_Call_WdgM_UUUUT_RP_PF                     6666: 8010aa36     8 FUNC    GLOBAL DEFAULT    90 Rte_Call_WdgM_UUUUT_RP_PF                     6687: 8007391c     6 FUNC    GLOBAL DEFAULT    63 RE_WdgM_UUUUT_deadStart_1                     6783: 800738cc    36 FUNC    GLOBAL DEFAULT    63 RE_WdgM_UUUUT_GlobalSuper                     7014: 8007390c     8 FUNC    GLOBAL DEFAULT    63 RE_WdgM_UUUUT_PFM2_10ms_f                     7885: 800738f0    12 FUNC    GLOBAL DEFAULT    63 RE_WdgM_UUUUT_LocalSuperv                     7973: 8010aa4e     4 FUNC    GLOBAL DEFAULT    90 Rte_Call_WdgM_UUUUT_RP_SE                     8469: 80073922     8 FUNC    GLOBAL DEFAULT    63 RE_WdgM_UUUUT_deadStop_10                     9607: 80071b30     4 OBJECT  GLOBAL DEFAULT    62 Rte_Self_CPT_WdgM_UUUUT                     9804: 80071b34     1 OBJECT  GLOBAL DEFAULT    62 Rte_Inst_WdgM_UUUUT                    11518: 8007392a     2 FUNC    GLOBAL DEFAULT    63 RE_WdgM_UUUUT_main_10ms_f                    12525: 8010aa56     4 FUNC    GLOBAL DEFAULT    90 Rte_Call_WdgM_UUUUT_RP_SE

可以看出来 所有相关UUUUT 的内容都被链接到了8字开头的地址,也就是说我们的flash里面会有设计的内容了。下面就是需要调试验证。

7.2 刷写调试

没有具体的需求,我们这里只看一下各个函数是否被运行到了。后面会新开一篇文章来详细解释监控机制本身。

每一个都可以运行到。具体使用 下次一定….

原文始发于微信公众号(汽车与基础软件):万字来介绍一下Autosar WdgM

版权声明:admin 发表于 2023年12月29日 上午10:41。
转载请注明:万字来介绍一下Autosar WdgM | CTF导航

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...