AUTOSAR-BswM模块配置介绍

0. 关于BswM模块初步了解

BswM即BSW Mode Manager,它是实现位于 BSW 中的车辆模式管理(Vehicle Mode Management )和应用程序模式管理概念(Application Mode Management )的一部分的模块.

它的职责是根据简单的规则对来自应用层 SW-C 或其他 BSW 模块的模式请求进行仲裁,并根据仲裁结果执行操作。

BswM在AUTOSAR上跟很多模块有关联的,例如EcuM、ComM、OS等等,我们从下图就可以看出来:

AUTOSAR-BswM模块配置介绍_第1张图片

BSWM的操作功能可以描述为两部分:Mode Arbitration 和Mode Control。

Mode Arbitration:启动模式切换,SW-C 或其他 BSW 模块接收的模式请求和模式指示基于规则的仲裁会触发模式切换。

Mode Control:通过执行包含其他 BSW 模块的模式切换操作的Action List来执行模式切换。

BswM 应该被视为一个模式管理框架模块,其中的行为完全由其配置定义。

对于Mode Arbitration 和Mode Control,我们可以简单粗暴地理解为前者是条件判断的,后者是动作执行的。


1. BSWM的两部分功能

1.1功能一:模式仲裁(Mode Arbitration)

BswM执行的模式仲裁是基于规则(rule-based)的,用于模式仲裁的规则在BSW 模式管理模块中的配置指定。这些规则由简单的布尔表达式组成。因此Mode Arbitration对运行时的影响很小。为了知道要执行哪些Action List,BswM需要检测来自先前规则评估的模式仲裁结果的变化。

  • Arbitration Rules

Rules是由一组模式请求条件组成的逻辑表达式。当输入模式请求和模式指示改变时,或在 BswM主函数执行期间,将评估Rule。评估结果(True or False)用于决定执行相应的模式控制Action List。

  • Mode Conditions and Logical Expressions

构成模式仲裁规则的Logical Expressions可以使用不同的运算符,例如 AND、OR、XOR 和 NAND。表达式中的每一项都对应一个模式请求条件。这些条件验证所请求或指示的模式对于特定模式是 EQUAL还是NOT_EQUAL。下图显示了具有两个条件的示例Rule。Rule和可用逻辑操作集被定义为ECU 配置的一部分。

AUTOSAR-BswM模块配置介绍_第2张图片

  • Requirements of Mode Arbitration

如上所述,BswM接受模式请求和模式指示作为模式仲裁的输入。模式请求通常源自应用程序SW-C,但也可能源自其他 BSW模块,例如 DCM。模式指示总是由其他BSW模块发出,例如不同的总线特定状态管理器、EcuM 和WdgM。

有各种不同方式来调度处理Mode Arbitration:

  • 在模式请求或模式指示上下文immediately处理;
  • 推迟到BswM MainFunction(周期轮询函数)处理。

“Immediate”请求在调用者的上下文中执行。系统集成商(如Vector)有责任确保操作列表的执行不会危及系统性能或一致性。特别是,如果调用者在中断上下文中运行(或可能运行),则有关在中断上下文中使用系统函数的限制仍然适用。

Immediate和Deferred操作之间的区别在下图:

AUTOSAR-BswM模块配置介绍_第3张图片

AUTOSAR-BswM模块配置介绍_第4张图片

  • Arbitration Behavior after Initialization

BswM初始化后的Mode Arbitration行为由Configurator Container BswMModeInitValue控制。该参数可以为配置中的每个BswMModeRequestPort配置一次。例如

AUTOSAR-BswM模块配置介绍_第5张图片

1.2功能二:模式控制(Mode control)

BswM的Mode Control部分根据Mode Arbitration的结果执行所有必需的操作。这是使用Action List完成的。Action List是由Mode Arbitration触发时BswM执行的动作的有序列表。

Action List中的Action可以分为三种类型:

  1. 调用其他BSW模块或 RTE。
  2. 链接到要包含在执行中的其他Action List。
  3. Mode Arbitration规则。当执行相应的Action List时,将评估这些规则。这样可获得规则的层次结构。

BswM不需要在其执行的操作上存储或响应任何 BSW 模块特定的返回值。因此,BSW 中的不同状态管理器将它们的当前状态给BswM,以用作Mode Arbitration的输入。但是,如果返回错误 (E_NOT_OK),BswM 可以发出 DEM事件和/或取消当前正在执行的Action List。

AUTOSAR-BswM模块配置介绍_第6张图片

如上图所示,BswM可能包含多个Action List,一个Action List可以容纳多个Action。为了减少Action List的总数,应该可以将它们级联。Action List的元素可以是具体动作或对另一个Action List的引用,或者如上所述,Mode Arbitration要执行的规则,应该有一个标志连接到每个动作列表条目,说明其类型(动作/引用/规则)。带有具体动作的列表和带有引用或甚至是混合列表的列表的激活方式应该没有区别。

  • Mode Processing Cycle

通过下图来讲解Mode Request的处理周期

AUTOSAR-BswM模块配置介绍_第7张图片

  1. 模式请求者 SW-C 通过其发送者端口请求模式 A。 RTE 分发请求,BswM 通过其接收器端口接收它。
  2. BswM作为接收到的模式仲裁请求的结果或在 BswM 主函数执行期间循环评估其规则。
  3. 根据选择的执行方法执行相应的动作列表。
  4. 在执行动作列表时,BswM 可能会向 RTE Switch API发出一次或多次调用,作为通知受影响的 SW-C 仲裁结果的动作。任何 SW-C,尤其是模式请求者都可以注册接收模式切换指示。

注意模式请求者只能从本地BswM接收模式切换指示;这对于源自本地代理 SW-C 发出的不同 ECU 的请求也是如此。

  • Behavior of Mode Control after Initialization

BswM初始化后模式控制的行为由BswMRuleInitState 参数配置(在BswMRule Container内)。它定义了在初始化后第一次评估规则后决定执行哪个Action List时使用的“前一个评估结果”。配置参数BswMActionListExecution(在BswMActionList Container内)也会影响初始化后的动作列表执行。BswMRuleInitState是什么样的,可见下图的“Rule Init State”

AUTOSAR-BswM模块配置介绍_第8张图片

BswMActionListExecution可见下图的“Action List Execution”

AUTOSAR-BswM模块配置介绍_第9张图片


2.BSWM的配置界面初步了解

AUTOSAR-BswM模块配置介绍_第10张图片

BSW Management有四个配置块,手册对此的解释为:

AUTOSAR-BswM模块配置介绍_第11张图片

AUTOSAR-BswM模块配置介绍_第12张图片

前面三项Auto Configuration,是项目定制的,基本上是自动配置好了的。

  • Auto Configuration: Communication Control,是创建标准的通信Rules用的,包含I-PDUR、Com NM和J1939的状态等;
  • Auto Configuration: Ecu State Handling,创建状态机相关的配置

AUTOSAR-BswM模块配置介绍_第13张图片

  • Auto Configuration: Module Initialization,这个看名字就比较直观,配置模块初始化用的,这要基于当前工程用了哪些模块,然后勾选对应的模块让BSWM帮助初始化。

AUTOSAR-BswM模块配置介绍_第14张图片

.Miscellaneous(杂项)

AUTOSAR-BswM模块配置介绍_第15张图片

Mode Declaration Groups:

这个是模式声明组来的,在这里定义的Mode是给切换模式接口用的。对于此处配置的每个Mode Declaration Group,都会自动生成一个sender-receiver和一个模式切换接口。BswM通过sender-receiver接口通过软件组件请求模式切换。BswM通过模式开关接口通知软件组件有关模式开关的信息。

Mode Notification Ports:

通过模式通知端口,其他软件组件可以将模式切换通知BswM。这些通知触发相关规则的仲裁。

Expressions:

在规则仲裁中使用Expressions来确定是否执行规则的动作列表,以及该规则的哪个动作列表。

Actions:

Actions描述了BswM执行的具体管理活动。可以将它们添加到操作列表中。

Action Lists:

这个是Action的列表,就是那需要执行的Action添加到这个列表中。


3.BswM Interfaces and Ports

BSWM Service的 SW-C将定义RTE下的Port。每个使用Service的 AUTOSAR SW-C都必须在其自己的 SW-C中包含Service Port。这些Port使用相同的Interface接入,并且必须连接到BSWM的Port,以便 RTE可以生成适当的 ID和所需的符号。

AUTOSAR-BswM模块配置介绍_第16张图片

以下讲讲Mode Request Port、Mode Switch Port、Mode Notification Port,即下图这几个东西:

AUTOSAR-BswM模块配置介绍_第17张图片

  • Mode Request Ports

BSW Mode Manager必须声明一个接收器端口,其接口定义在 SW-C的上下文中:

RequirePort AppModeRequestInterface modeRequestPort_{ArbName}_{ReqName};

要读取当前请求的模式,BSW Mode Manager实现必须调用:

Rte_Read_modeRequestPort_{ArbName}_{ReqName}_requestedMode( & );

  • Mode Switch Ports

与Mode Request一样,BSW Mode Manager仅引用在其为模式切换提供端口的相应SW-C 描述上下文中定义的模式切换Port。对于上面的例子,Mode Switch的声明是:

ProvidePort AppModeInterface modeSwitchPort_{ModConName}_{SwitchName};

配置参数BswMModeSwitchInterfaceRef引用此模式切换接口。

要切换当前激活模式,BSW Mode Manager实现必须将以下调用之一插入其操作列表:

Rte_Switch_modeSwitchPort_{ModConName}_{SwitchName}_currentMode();

SchM_Switch_modeSwitchPort_{ModConName}_{SwitchName}_currentMode();

  • Mode Notification Port

除了Mode Request之外,当前激活的模式也可以用作Mode Arbitration的输入。对于应用程序和车辆模式,BSW Mode Manager需要注册为模式用户。然后它通过Mode Switch Port接收有关更改模式的通知。对于上面的例子,模式通知的声明是:

注意:为了更容易区分ModeSwitchPort类型的RequirePort和ProvidePort,下面示例中RequirePorts被命名为Mode Notification Port。

RequirePort AppModeInterface modeNotificationPort_{ArbName}_{ModeName};

要读取当前激活模式,BSW Mode Manager实现必须调用以下函数之一:

Rte_Mode_modeNotificationPort_{ArbName}_{ModeName}_currentMode( &);

SchM_Mode_modeNotificationPort_{ArbName}_{ModeName}_currentMode( & );

如果配置了增强型 Rte_Mode 或 SchM_Mode,BSW Mode Manager实现必须调用以下函数之一:

Rte_Mode_modeNotificationPort_{ArbName}_{ModeName}_currentMode( &, &, & );

SchM_Mode_modeNotificationPort_{ArbName}_{ModeName}_currentMode( &, &, & );


4. BswM shutdown 流程配置

配置BswM的DeepStop Shutdown相关内容,直接在Mode Management下的BSW Management菜单下配置Miscellaneous下的项目即可。下面一步一步讲解这些内容是如何配置的,同时要注意的一些事项。

AUTOSAR-BswM模块配置介绍_第18张图片

第一步,在BswM模式配置里面添加“Mode Declartion Groups”子项

AUTOSAR-BswM模块配置介绍_第19张图片

姑且命名为BswMRteModeDclGroup_DeepStop,并在其配置页面添加两个Mode,DEEPSTOP和RUNNING,然后将Initial Mode配置为RUNNING,如下图

AUTOSAR-BswM模块配置介绍_第20张图片

第二步,添加“Mode Notification Ports”子项 

AUTOSAR-BswM模块配置介绍_第21张图片

并选择第一步创建好的BswMRteModeDclGroup_DeepStop(如果找不到这选项,有可能是你的Configurator没同步好,可以尝试将工程再重新打开)

AUTOSAR-BswM模块配置介绍_第22张图片

然后将子项命名为SwcModeNotification_BswM_MDGP_BswMRteModeDclGroup_DeepStop(保留默认前缀,名字有点长了),接着做页面上的配置,Init Value选之前创建的RUNNING,Source下面的Reference实际上就是刚才弹出框选的BswMRteModeDclGroup_DeepStop

AUTOSAR-BswM模块配置介绍_第23张图片

第三步,做Service Mapping

首先打开Runtime System菜单下面的ECU Software Components,找到BswM下面的Service Ports

AUTOSAR-BswM模块配置介绍_第24张图片

鼠标点击BswM下面的Service Ports,然后在右边的菜单的SwcModeNotification_BswM_MDGP_BswMRteModeDclGroup_DeepStop上点击右键,在弹出菜单选“Connect to new port”

AUTOSAR-BswM模块配置介绍_第25张图片

然后在弹出的菜单勾选你要用这个DeepStop的SWC(例如PowerSWC,这取决于具体的项目所创建的SWC)即可。

第四步,SWC添加Port Client接口

上一步将Service Port Mapping到SWC(如PowerSWC)了,这里需要在这个SWC上添加这个Port Client端接口

首先,打开Davinci Developer,选择那个PowerSWC进入Software Design界面,然后点击对应的runnable(哪个runnable,得看你具体应用是在哪个runnable使用这个DeepStop接口)

接着,点击下图的Port Access菜单

AUTOSAR-BswM模块配置介绍_第26张图片

然后在这个界面上的右下角,找到“New”的按钮,点开弹出菜单,选“Send Mode Switches…”

AUTOSAR-BswM模块配置介绍_第27张图片

最后,选择那个DeepStop Port即可,

AUTOSAR-BswM模块配置介绍_第28张图片

如果你已经添加过这个port,那么会得到一些警告

AUTOSAR-BswM模块配置介绍_第29张图片

如果没有mapping过这个service port,其实这个“new”菜单里面弹出框是灰色的。

AUTOSAR-BswM模块配置介绍_第30张图片

第五步,创建Expressions

回到Configurator中的Bsw Mode中的Miscellaneous

AUTOSAR-BswM模块配置介绍_第31张图片

接着在弹出的对话框中,起个名字,如LE_DeepStop,然后将那个左边的Mode Notification Ports,拖到右边的LE_DeepStop下

AUTOSAR-BswM模块配置介绍_第32张图片

此时会有个弹出框,选上Operator: BSWM_EQUALS, Mode: DEEPSTOP

AUTOSAR-BswM模块配置介绍_第33张图片

最后,会得到配置后的Expression结果

AUTOSAR-BswM模块配置介绍_第34张图片

第六步,添加Action List

从RUNNING到DEEPSTOP是只是状态模式的变化,需要执行真正的action的,于是需要配置Actions和Action List。

在Action菜单里面添加主要有Action_ECUM_GO_DOWN和Action_SELECT_SHUTDOWN_TARGET_OFF,在添加的时候要注意选择其Action Type

例如,在Actions菜单上点击右键弹出来菜单,选Create Action…

AUTOSAR-BswM模块配置介绍_第35张图片

此时,会有这个对话框,这里就要选择对于的Action Type了

AUTOSAR-BswM模块配置介绍_第36张图片

例如这个Action_ECUM_GO_DOWN的Type对于的是EcuM Go Down

添加好后,最终得到的结果是

AUTOSAR-BswM模块配置介绍_第37张图片

此时,请注意,这里面有个Action_RTE_REQUEST_BswMRteModeRequestPort_REQUESTED,看看你是否需要,这个和Mode Request PPorts相关联的,如果实际项目不需要,就不需添加。

但是,在我这里,我没添加这个会出现自动Shutdown问题(没接CAN总线的时候)。

还有个地方要注意的,在配置Action_SELECT_SHUTDOWN_TARGET_OFF的时候,需要选择EcuM的SleepMode,这个需要在ECUM上配置。

AUTOSAR-BswM模块配置介绍_第38张图片

点击这个EcuM Sleep Mode Ref最右端的…可以选择(弹出下面对话框选择)

AUTOSAR-BswM模块配置介绍_第39张图片

最后,把Action List配置好

AUTOSAR-BswM模块配置介绍_第40张图片

但是,以上这个Action List是不行的。

这个list里面的内容是要有先后顺序的,首先要执行Action_SELECT_SHUTDOWN_TARGET_OFF,然后执行Action_ECUM_GO_DOWN。同时还有一点,这两个Action之间还需要EcuM_ClearValidatedWakeupEvent(ECUM_WKSOURCE_ALL_SOURCES),如果缺了这个EcuM_ClearValidatedWakeupEvent,最终会进入reset而不是switch off,因为EcuM_Init的时候给

      EcuM_CurrentShutdownTarget = EcuM_GetDefaultShutdownTarget();

这个是ECUM_STATE_RESET。

所以最终的顺序应该是:

AUTOSAR-BswM模块配置介绍_第41张图片

生成对应的代码为:

/**********************************************************************************************************************

 *  BswM_ActionList_AL_DeepStop

 *********************************************************************************************************************/

BSWM_LOCAL FUNC(Std_ReturnType, BSWM_CODE) BswM_ActionList_AL_DeepStop(BswM_PCPartitionConfigIdxOfPartitionIdentifiersType partitionIdx)

{

  (void)EcuM_SelectShutdownTarget(ECUM_STATE_OFF, 0);

  /*lint -save -e534 *//* PRQA S 3109, 3200 1 */ /* MD_MSR_14.3, MD_BSWM_3200 */

  EcuM_ClearValidatedWakeupEvent(ECUM_WKSOURCE_ALL_SOURCES);

  /*lint -restore */

  (void)EcuM_GoDown(BSWM_MODULE_ID);

  BSWM_DUMMY_STATEMENT(partitionIdx); /* PRQA S 1338, 2983, 3112 */ /* MD_MSR_DummyStmt */

  return E_OK;

}/* PRQA S 6010, 6030, 6050 */ /* MD_MSR_STPTH, MD_MSR_STCYC, MD_MSR_STCAL */

 第七步,配置Rules

在Rules菜单右键Add Rule,暂时取名为BswMRule_DeepStop

AUTOSAR-BswM模块配置介绍_第42张图片

然后做以下配置。主要有:Rule Init State、Expression Reference和Action List Reference

AUTOSAR-BswM模块配置介绍_第43张图片

最终,配置完后是这样的

AUTOSAR-BswM模块配置介绍_第44张图片

第八步,选上shutdown hook

进入DeepStop模式,需要经过OS进行关机,所以,还需要在Runtime System General界面上配置一个Shutdown Hook

AUTOSAR-BswM模块配置介绍_第45张图片

最后,需要在程序运行时候准备进入Sleep情况,就在对应的SWC调用那个service port,即在第三、四步mapping和创建的port,即Rte_Switch_Notification_SwcModeNotification_BswM_MDGP_BswMRteModeDclGroup_DeepStop_BswM_MDGP_BswMRteModeDclGroup_DeepStop。

 * Mode Interfaces:

 * ================

 *   Std_ReturnType Rte_Switch_Notification_SwcModeNotification_BswM_MDGP_BswMRteModeDclGroup_DeepStop_BswM_MDGP_BswMRteModeDclGroup_DeepStop(uint8 mode)

 *   Modes of Rte_ModeType_BswMRteModeDclGroup_DeepStop:

 *   - RTE_MODE_BswMRteModeDclGroup_DeepStop_DEEP_STOP

 *   - RTE_MODE_BswMRteModeDclGroup_DeepStop_RUNA

 *   - RTE_TRANSITION_BswMRteModeDclGroup_DeepStop

 *

在应用调用这个进入DeepStop请求后,是会进入BswM里面的Action的BswM_ActionList_AL_DeepStop函数的

AUTOSAR-BswM模块配置介绍_第46张图片

到这一步,实际上流程是没有问题的了,但是要实现真正的睡眠,还需要更改EcuM_AL_SwitchOff函数(这个是睡眠前执行ECUM的最后一个函数),例如关闭相关的IO口,准备好wakeup source,最后让MCU进入DeepStop Mode

FUNC(void, ECUM_CODE) EcuM_AL_SwitchOff(void)

{

/**********************************************************************************************************************

 * DO NOT CHANGE THIS COMMENT!                                 DO NOT CHANGE THIS COMMENT!

 *********************************************************************************************************************/

  /* Add implementation of EcuM_AL_SwitchOff() */

  

  Mcu_WakeUpFactor_Preparation(McuConf_McuModeSettingConf_McuModeSettingConf_DeepStop);

  Mcu_SetMode(McuConf_McuModeSettingConf_McuModeSettingConf_DeepStop);

  return;

/**********************************************************************************************************************

 * DO NOT CHANGE THIS COMMENT!                                                  DO NOT CHANGE THIS COMMENT!

 *********************************************************************************************************************/

} /* End of EcuM_AL_SwitchOff() */

你可能感兴趣的:(windows,java,服务器)