目录
在AUSOSAR文档里,?模式管理(Mode Management)的所有关联模块有:EcuM、WdgM、ComM和BswM。他们分别承担着如下作用:
- EcuM:控制AUTOSAR BSW模块、OS等的启动;
- WdgM:根据控制流状态和Alive状态喂狗;
- ComM:管理网络状态和资源
- BswM:负责模式处理、仲裁等
这就有点奇怪,上述四个模块干着不同的事情,为什么会统一起来叫模式管理Cluster呢?
那么究竟什么叫做模式管理(Mode Management)?我们一步一步来看。
根据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
所谓模式管理,那就是管理某些模块的当前状态,并且当前状态的进入会影响到不同的模块的行为。举个例子,当BswM准备下电时,它会进入到PreShutdown,在这种模式下,通常会影响到通信:ECU不外发报文;会影响到NvM:准备下电前存储DTC、里程数据等。
从辩证角度就分为模式请求者、模式管理者和模式使用者,如下图:
模式请求者通过Sender或者Client向模式管理者发出模式请求,模式管理者进行条件仲裁后进入到请求的模式,同时通过S\R接口通知User,模式变了,准备做该模式下定义的动作吧。
那么BswM这个模块在AUTOSAR中扮演了什么角色呢?
我们首先来看下,没有BswM的时候系统交互应该是怎么样的。
当系统进行上电后,EcuM首先运行,进行一系列外设初始化工作后,它想要从进行数据初始化,此时就要从NvM中读取数据;如果想要开启诊断的操作循环,此时就要调用DCM的相关接口;如果想要开启通信,就要调用ComM,ComM进而继续调用CanSM,那么上电时的拓扑结构就如下图:
那如果运行时,?Dem根据状态的不同要调用NvM实时存某些数据,DCM想要关闭某些通信总线,那么就会变成如下:
可以看到,随着模块的增加,代码接口、复杂程序和耦合性逐步上升,那么可不可以有一个模块来统一管理这些模式,当模式出现变化时通知关联模块做相应动作呢?BswM就站了出来,具体如下:
当EcuM完成启动后,将控制权交由BswM,BswM根据当前自己的状态、仲裁预置的条件和规则来通知不同的模块进行关联动作。
例如当BswM完成初始化,进入到BswM_RUN状态后,可以判断当前是否收到NM报文且ECU板级电压正常,那么就可以通知ComM准备开始发报文了,通知SWC电压正常,你可以正常干活啦。?
通过一系列复杂的语言描述,我发现最后还是图好使,基本上BswM就是干示例里面的活,只是我们在配置的时候要考虑的东西很多,例如DCM相关条件、BswM状态、NvM状态、BusSM状态、唤醒源等等,总的来说,这块很灵活,但是难度不大,做的时候画图基本上可以完成。下一篇我们就来画图