16.AUTOSAR 系统服务(三):BswM详解(1)

发布时间:2024年01月17日

目录

1.什么是模式管理

1.1 模式定义

?1.2 模式管理定义

2.BswM在AUTOSAR的角色

3.小结?


1.什么是模式管理

在AUSOSAR文档里,?模式管理(Mode Management)的所有关联模块有:EcuM、WdgM、ComM和BswM。他们分别承担着如下作用:

  • EcuM:控制AUTOSAR BSW模块、OS等的启动;
  • WdgM:根据控制流状态和Alive状态喂狗;
  • ComM:管理网络状态和资源
  • BswM:负责模式处理、仲裁等

这就有点奇怪,上述四个模块干着不同的事情,为什么会统一起来叫模式管理Cluster呢?

那么究竟什么叫做模式管理(Mode Management)?我们一步一步来看。

1.1 模式定义

根据Software Component Template描述,Mode表示的是一个全局变量的当前状态

这么说就很简单啦,我们之前讲的EcuM模块有一个状态机,在代码中有一个全局变量EcuM_ModuleState用于表示当前EcuM的状态,这个可以把它叫做模式。常见模式有:

#define ECUM_STATE_STARTUP                                  (0x10u)
#define ECUM_STATE_STARTUP_ONE                              (0x11u)
#define ECUM_STATE_STARTUP_TWO                              (0x12u)
#define ECUM_STATE_WAKEUP                                   (0x20u)
#define ECUM_STATE_RUN                                      (0x30u)
#define ECUM_STATE_GO_SLEEP                                 (0x49u)

这也就意味着,Mode在不同模块、不同场景下可以有不同作用

?例如做过通信栈的同学可能对ComM各个状态请求比较熟悉,如:

# define COMM_NO_COM_REQUEST_PENDING       (1u)
# define COMM_FULL_COM_NETWORK_REQUESTED   (2u)
# define COMM_FULL_COM_READY_SLEEP         (3u)
# define COMM_SILENT_COM                   (4u)

做过BswM的可能对BswM的Mode很熟悉,如:

#define BSWM_GENERICVALUE_ESH_State_ESH_INIT            0x0000u 
#define BSWM_GENERICVALUE_ESH_State_ESH_POST_RUN        0x0002u 
#define BSWM_GENERICVALUE_ESH_State_ESH_PREP_SHUTDOWN   0x0003u 
#define BSWM_GENERICVALUE_ESH_State_ESH_READ_NVM        0x0008u 
#define BSWM_GENERICVALUE_ESH_State_ESH_RUN             0x0001u 
#define BSWM_GENERICVALUE_ESH_State_ESH_SHUTDOWN        0x0005u 
#define BSWM_GENERICVALUE_ESH_State_ESH_SLEEP           0x0007u 
#define BSWM_GENERICVALUE_ESH_State_ESH_WAIT_FOR_NVM    0x0004u 

?1.2 模式管理定义

所谓模式管理,那就是管理某些模块的当前状态,并且当前状态的进入会影响到不同的模块的行为。举个例子,当BswM准备下电时,它会进入到PreShutdown,在这种模式下,通常会影响到通信:ECU不外发报文;会影响到NvM:准备下电前存储DTC、里程数据等。

从辩证角度就分为模式请求者、模式管理者和模式使用者,如下图:

模式请求者通过Sender或者Client向模式管理者发出模式请求,模式管理者进行条件仲裁后进入到请求的模式,同时通过S\R接口通知User,模式变了,准备做该模式下定义的动作吧。

2.BswM在AUTOSAR的角色

那么BswM这个模块在AUTOSAR中扮演了什么角色呢?

我们首先来看下,没有BswM的时候系统交互应该是怎么样的。

当系统进行上电后,EcuM首先运行,进行一系列外设初始化工作后,它想要从进行数据初始化,此时就要从NvM中读取数据;如果想要开启诊断的操作循环,此时就要调用DCM的相关接口;如果想要开启通信,就要调用ComM,ComM进而继续调用CanSM,那么上电时的拓扑结构就如下图:

那如果运行时,?Dem根据状态的不同要调用NvM实时存某些数据,DCM想要关闭某些通信总线,那么就会变成如下:

可以看到,随着模块的增加,代码接口、复杂程序和耦合性逐步上升,那么可不可以有一个模块来统一管理这些模式,当模式出现变化时通知关联模块做相应动作呢?BswM就站了出来,具体如下:

当EcuM完成启动后,将控制权交由BswM,BswM根据当前自己的状态、仲裁预置的条件和规则来通知不同的模块进行关联动作。

例如当BswM完成初始化,进入到BswM_RUN状态后,可以判断当前是否收到NM报文且ECU板级电压正常,那么就可以通知ComM准备开始发报文了,通知SWC电压正常,你可以正常干活啦。?

3.小结?

通过一系列复杂的语言描述,我发现最后还是图好使,基本上BswM就是干示例里面的活,只是我们在配置的时候要考虑的东西很多,例如DCM相关条件、BswM状态、NvM状态、BusSM状态、唤醒源等等,总的来说,这块很灵活,但是难度不大,做的时候画图基本上可以完成。下一篇我们就来画图

文章来源:https://blog.csdn.net/djkeyzx/article/details/135648964
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。