[AutoSar]状态管理(四)单核BswM(二)流程、配置、 代码
目录关键词平台说明一、BswM的模式处理流程图二、stand state handling三、配置、代码、状态转移3.1 initial - wakeup3.2 WakeUp - Run3.3 Run - PostRun first step3.4 Run - PostRun second step3.5 PostRun - PreShutdownfirst step3.6 PostRun - PreShutdownsecond step3.7 PostRun - PreShutdownthird step3.8 PREP_SHUTDOWN- WAIT_FOR_NVM3.9 WAIT_FOR_NVM - SHUTDOWN3.10 WakeUp - Run3.11 WakeUp - preshutdown关键词嵌入式、C语言、autosar、BswM平台说明项目ValueOSautosar OSautosar厂商vector芯片厂商TI编程语言CC编译器HighTec (GCC)回到总目录一、BswM的模式处理流程图蓝色箭头为SWC的上层交互红色箭头为Bsw内部模块间的交互。二、stand state handling三、配置、代码、状态转移3.1 initial - wakeupEcuM 初始化完毕后开始BswM初始化并调度mainfunction执行状态机。rulesESH_InitToWakeupExpressionESH_LE_InitToWakeupCode1.判定当前模式处于Initif(BswM_GetGenericState(3, 0u) BSWM_GENERICVALUE_ESH_State_ESH_INIT) { /* Return conditional action list BswM_ActionList_ESH_AL_InitToWakeup. */ retVal BSWM_ID_AL_ESH_AL_InitToWakeup; }Action listESH_AL_InitToWakeup{ESH_Action_OnEnterWakeupESH_Action_SwitchWakeupESH_Action_ESH_Wakeup}Code 1.请求模式切换到Wakeup。BSWM_LOCAL FUNC(Std_ReturnType, BSWM_CODE) BswM_ActionList_ESH_AL_InitToWakeup(BswM_PCPartitionConfigIdxOfPartitionIdentifiersType partitionIdx) { BswM_ESH_OnEnterWakeup(); BswM_Switch_ESH_ModeSwitch_BswM_MDGP_ESH_Mode RTE_MODE_ESH_Mode_WAKEUP; BswM_RequestMode(BSWM_GENERIC_ESH_State, BSWM_GENERICVALUE_ESH_State_ESH_WAKEUP); 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 */3.2 WakeUp - RunrulesESH_WakeupToRunExpressionESH_LE_WakeupToRunCode1.判定当前状态是否为wakeup2.判定是否有唤醒事件3.判定ComM request 是否为pending且上一次目标模式通知是否为wakeup。if((BswM_GetGenericState(3, 0u) BSWM_GENERICVALUE_ESH_State_ESH_WAKEUP) ((EcuM_GetValidatedWakeupEvents() ! 0u) || (BswM_GetGenericState(0, 0u) BSWM_GENERICVALUE_ESH_ComMPendingRequests_ESH_COMM_PENDING_REQUEST)) ((BswM_GetNvMJobState(0, 0u) ! NVM_REQ_PENDING) || (BswM_GetTimerState(0, 0u) ! BSWM_TIMER_STARTED)) (BswM_Mode_Notification_ESH_ModeNotification_BswM_MDGP_ESH_Mode RTE_MODE_ESH_Mode_WAKEUP)) { /* Return conditional action list BswM_ActionList_ESH_AL_WakeupToRun. */ retVal BSWM_ID_AL_ESH_AL_WakeupToRun; }Action list1.在 ComM request pending 状态下允许通信2.更新BswM 计时器3.request 到 RUN 状态ESH_AL_WakeupToRun{ESH_Action_ComMAllow_CN_xxxxxESH_Action_SelfRunRequestTimer_StartESH_Action_OnEnterRunESH_Action_SwitchRunESH_Action_ESH_Run}Code1.用户自定义实现代码ComM_CommunicationAllowed(ComMConf_ComMChannel_CN_, TRUE); BswM_UpdateTimer(partitionIdx, BSWM_TMR_ESH_SelfRunRequestTimer, 10u); BswM_ESH_OnEnterRun(); BswM_Switch_ESH_ModeSwitch_BswM_MDGP_ESH_Mode RTE_MODE_ESH_Mode_RUN; BswM_RequestMode(BSWM_GENERIC_ESH_State, BSWM_GENERICVALUE_ESH_State_ESH_RUN);3.3 Run - PostRun first steprulesESH_RunToPostRunExpressionESH_LE_RunToPostRunTransitionCode1.判定当前模式是否在RUN且上一次 request 为run2.判定ComM是否为NO_COMMUNICATION3.SWC没有模式请求4.判定BswM转换计时器超时在mainfunction中调用BswM_DecreaseTimer(partitionIdx)–和转状态转换时update;if(((BswM_GetGenericState(1, BswM_GetInternalPartitionIdx(SystemApplication_OsCore3)) BSWM_GENERICVALUE_ESH_State_ESH_RUN) (BswM_Mode_Notification_ESH_ModeNotification_BswM_MDGP_ESH_Mode RTE_MODE_ESH_Mode_RUN)) (((BswM_GetComMChannelState(0, BswM_GetInternalPartitionIdx(SystemApplication_OsCore3)) COMM_NO_COMMUNICATION) (BswM_GetComMChannelState(4, BswM_GetInternalPartitionIdx(SystemApplication_OsCore3)) COMM_NO_COMMUNICATION) (BswM_GetComMChannelState(1, BswM_GetInternalPartitionIdx(SystemApplication_OsCore3)) COMM_NO_COMMUNICATION) (BswM_GetComMChannelState(3, BswM_GetInternalPartitionIdx(SystemApplication_OsCore3)) COMM_NO_COMMUNICATION) (BswM_GetComMChannelState(2, BswM_GetInternalPartitionIdx(SystemApplication_OsCore3)) COMM_NO_COMMUNICATION)) ((Request_ESH_RunRequest_0_requestedMode RELEASED) (Request_ESH_RunRequest_1_requestedMode RELEASED)) (BswM_GetTimerState(0, BswM_GetInternalPartitionIdx(SystemApplication_OsCore3)) BSWM_TIMER_EXPIRED))) { /* Return conditional action list BswM_ActionList_ESH_AL_ExitRun. */ retVal BSWM_ID_AL_ESH_AL_ExitRun; }**Action list**1.进入ESH_RunToPostRunNested rulesESH_AL_ExitRun{ESH_Action_EnterExclusiveAreaESH_RunToPostRunNestedESH_Action_ComMCheckPendingRequestsESH_Action_ExitExclusiveArea}CodeSchM_Enter_BswM_BSWM_EXCLUSIVE_AREA_0(); /*lint -restore */ ESH_ComM_CheckPendingRequests(); (void)BswM_Action_RuleHandler(BSWM_ID_RULE_ESH_RunToPostRunNested, partitionIdx); /*lint -save -e534 *//* PRQA S 3109, 3200 1 */ /* MD_MSR_14.3, MD_BSWM_3200 */ SchM_Exit_BswM_BSWM_EXCLUSIVE_AREA_0(); /*lint -restore */ BSWM_DUMMY_STATEMENT(partitionIdx); /* PRQA S 1338, 2983, 3112 */ /* MD_MSR_DummyStmt */3.4 Run - PostRun second steprulesESH_RunToPostRunNestedExpressionESH_LE_ComMNoPendingRequestsCode1.判定当前ComM pending是否有请求。if(BswM_GetGenericState(0, BswM_GetInternalPartitionIdx(SystemApplication_OsCore3)) BSWM_GENERICVALUE_ESH_ComMPendingRequests_ESH_COMM_NO_REQUEST) { /* Return conditional action list BswM_ActionList_ESH_AL_RunToPostRun. */ retVal BSWM_ID_AL_ESH_AL_RunToPostRun; }Action listESH_AL_RunToPostRun{ESH_Action_ComMDisallow_CN_XXXESH_Action_EcuMClearValidatedWakeupEventsESH_Action_OnEnterPostRunESH_Action_SwitchPostRunESH_Action_ESH_PostRun}Code1.禁止ComM通信2.清除唤醒事件3.请求模式转换到POSTRUNComM_CommunicationAllowed(ComMConf_ComMChannel_CN_, FALSE); /*lint -save -e534 *//* PRQA S 3109, 3200 1 */ /* MD_MSR_14.3, MD_BSWM_3200 */ EcuM_ClearValidatedWakeupEvent(ECUM_WKSOURCE_ALL_SOURCES); /*lint -restore */ BswM_ESH_OnEnterPostRun(); BswM_Switch_ESH_ModeSwitch_BswM_MDGP_ESH_Mode RTE_MODE_ESH_Mode_POSTRUN; BswM_RequestMode(BSWM_GENERIC_ESH_State, BSWM_GENERICVALUE_ESH_State_ESH_POST_RUN);3.5 PostRun - PreShutdownfirst steprulesESH_PostRunExpressionESH_LE_PostRunCode1.判定当前模式是否为POSTRUN且上一次请求通知为POSTRUNif((Request_ESH_PostRunRequest_0_requestedMode RELEASED) (Request_ESH_PostRunRequest_1_requestedMode RELEASED)) { /* Return conditional action list BswM_ActionList_ESH_AL_PostRunToPrepShutdown. */ retVal BSWM_ID_AL_ESH_AL_PostRunToPrepShutdown; }Action listESH_AL_ExitPostRun{ESH_Action_EnterExclusiveAreaESH_Action_ComMCheckPendingRequestsESH_PostRunNestedESH_Action_ExitExclusiveArea}Code1.根据ComM状态是否为COMM_NO_COM_NO_PENDING_REQUEST 设置BSWM_GENERICVALUE_ESH_ComMPendingRequests_ESH_COMM_PENDING_REQUEST还是BSWM_GENERICVALUE_ESH_ComMPendingRequests_ESH_COMM_NO_REQUEST2.进入ruler ESH_PostRunNestedSchM_Enter_BswM_BSWM_EXCLUSIVE_AREA_0(); /*lint -restore */ ESH_ComM_CheckPendingRequests(); (void)BswM_Action_RuleHandler(BSWM_ID_RULE_ESH_PostRunNested, partitionIdx); /*lint -save -e534 *//* PRQA S 3109, 3200 1 */ /* MD_MSR_14.3, MD_BSWM_3200 */ SchM_Exit_BswM_BSWM_EXCLUSIVE_AREA_0();3.6 PostRun - PreShutdownsecond step这里为中间态判定是回到RUN还是到preShutdown。rulesESH_PostRunNestedExpressionESH_LE_PostRunToRunCode1.判定SWC是否有模式请求2.判定是否有唤醒事件3.判定ComM 请求是否为 pengding/* Evaluate logical expression ESH_LE_PostRunToRun. */ if(((Request_ESH_RunRequest_0_requestedMode REQUESTED) || (Request_ESH_RunRequest_1_requestedMode REQUESTED)) || ((EcuM_GetValidatedWakeupEvents() ! 0u) || (BswM_GetGenericState(0, BswM_GetInternalPartitionIdx(SystemApplication_OsCore3)) BSWM_GENERICVALUE_ESH_ComMPendingRequests_ESH_COMM_PENDING_REQUEST))) { /* Return conditional action list BswM_ActionList_ESH_AL_PostRunToRun. */ retVal BSWM_ID_AL_ESH_AL_PostRunToRun; } else { /* Return conditional action list BswM_ActionList_ESH_AL_ESH_PostRunToPrepCheck. */ retVal BSWM_ID_AL_ESH_AL_ESH_PostRunToPrepCheck; }Action list如果仲裁为TRUE执行actionlistESH_AL_PostRunToRun如果仲裁为FALSE执行rulesESH_AL_ESH_PostRunToPrepCheckESH_AL_PostRunToRun{ESH_Action_ComMAllow_CN_XXXXXESH_Action_SelfRunRequestTimer_StartESH_Action_OnEnterRunESH_Action_SwitchRun}Code1.允许Com通信2.更新BswM状态转换计时器3.请求转换到RUN ComM_CommunicationAllowed(ComMConf_ComMChannel_CN_xxx, TRUE); BswM_UpdateTimer(partitionIdx, BSWM_TMR_ESH_SelfRunRequestTimer, 10u); BswM_ESH_OnEnterRun(); BswM_Switch_ESH_ModeSwitch_BswM_MDGP_ESH_Mode RTE_MODE_ESH_Mode_RUN; BswM_RequestMode(BSWM_GENERIC_ESH_State, BSWM_GENERICVALUE_ESH_State_ESH_RUN);3.7 PostRun - PreShutdownthird steprulesESH_PostRunToPrepNestedExpressionESH_LE_Dem_PostRunRequestedCode1.判定当前是否有SWC模式请求/* Evaluate logical expression ESH_LE_Dem_PostRunRequested. */ if((Request_ESH_PostRunRequest_0_requestedMode RELEASED) (Request_ESH_PostRunRequest_1_requestedMode RELEASED)) { /* Return conditional action list BswM_ActionList_ESH_AL_PostRunToPrepShutdown. */ retVal BSWM_ID_AL_ESH_AL_PostRunToPrepShutdown; }Action listESH_AL_PostRunToPrepShutdown{ESH_Action_OnEnterPrepShutdownESH_Action_SwitchShutdownESH_Action_ESH_PrepShutdown}Code1.请求进入preShutDownBswM_ESH_OnEnterPrepShutdown(); BswM_Switch_ESH_ModeSwitch_BswM_MDGP_ESH_Mode RTE_MODE_ESH_Mode_SHUTDOWN; BswM_RequestMode(BSWM_GENERIC_ESH_State, BSWM_GENERICVALUE_ESH_State_ESH_PREP_SHUTDOWN);3.8 PREP_SHUTDOWN- WAIT_FOR_NVMrulesESH_PrepToWaitExpressionESH_LE_PrepShutdownToWaitForNvMCode1.判定当前模式处于PRE_SHUTDOWN且上一次请求通知为SHUTDOWNif((BswM_GetGenericState(1, BswM_GetInternalPartitionIdx(SystemApplication_OsCore3)) BSWM_GENERICVALUE_ESH_State_ESH_PREP_SHUTDOWN) (BswM_Mode_Notification_ESH_ModeNotification_BswM_MDGP_ESH_Mode RTE_MODE_ESH_Mode_SHUTDOWN)) { /* Return conditional action list BswM_ActionList_ESH_AL_PrepShutdownToWaitForNvM. */ retVal BSWM_ID_AL_ESH_AL_PrepShutdownToWaitForNvM; }Action listESH_AL_PrepShutdownToWaitForNvM{ESH_Action_WriteAllTimer_StartESH_Action_NvMWriteAllESH_Action_ComMCheckPendingRequestsESH_Action_OnEnterWaitForNvmESH_Action_ESH_WaitForNvm}Code1.设定NVM写超时计时器2.writeall3.根据ComM状态是否为COMM_NO_COM_NO_PENDING_REQUEST 设置BSWM_GENERICVALUE_ESH_ComMPendingRequests_ESH_COMM_PENDING_REQUEST还是BSWM_GENERICVALUE_ESH_ComMPendingRequests_ESH_COMM_NO_REQUEST4.NVM实现5.请求切换到ESH_WAIT_FOR_NVMBswM_UpdateTimer(partitionIdx, BSWM_TMR_ESH_NvM_WriteAllTimer, 6000u); /*lint -save -e534 *//* PRQA S 3109, 3200 1 */ /* MD_MSR_14.3, MD_BSWM_3200 */ NvM_WriteAll(); /*lint -restore */ ESH_ComM_CheckPendingRequests(); BswM_ESH_OnEnterWaitForNvm(); BswM_RequestMode(BSWM_GENERIC_ESH_State, BSWM_GENERICVALUE_ESH_State_ESH_WAIT_FOR_NVM);3.9 WAIT_FOR_NVM - SHUTDOWNrulesESH_WaitToShutdownExpressionESH_LE_WaitForNvMToShutdownCode1.判定当前状态是否为WAIT_FOR_NVM2.判定是否完成NVMwriteall3.判定是否有唤醒事件4.ComM是否有request/* Evaluate logical expression ESH_LE_WaitForNvMToShutdown. */ /* PRQA S 3415 1 */ /* MD_BSWM_3415 */ if((BswM_GetGenericState(3, 0u) BSWM_GENERICVALUE_ESH_State_ESH_WAIT_FOR_NVM) ((BswM_GetNvMJobState(0, 0u) ! NVM_REQ_PENDING) || (BswM_GetTimerState(1, 0u) ! BSWM_TIMER_STARTED)) ((EcuM_GetValidatedWakeupEvents() 0u) (BswM_GetGenericState(0, 0u) BSWM_GENERICVALUE_ESH_ComMPendingRequests_ESH_COMM_NO_REQUEST))) { /* Return conditional action list BswM_ActionList_ESH_AL_WaitForNvMToShutdown. */ retVal BSWM_ID_AL_ESH_AL_WaitForNvMToShutdown; }Action listESH_AL_WaitForNvMToShutdown{ESH_Action_WriteAllTimer_StopESH_Action_OnEnterShutdownESH_Action_EcuMGoToSelectedShutdownTarget}Code1.关闭NVM计时器2.请求到Shutdown状态3.用户自定义代码实现BswM_ESH_OnEnterShutdown(); /*lint -save -e534 *//* PRQA S 3109, 3200 1 */ /* MD_MSR_14.3, MD_BSWM_3200 */ (void)EcuM_GoToSelectedShutdownTarget();注意在EcuM_GoToSelectedShutdownTarget中会调用EcuM_GoDown进而讲控制权交由ECUM模块进入ECUM_shutdown 状态详情参考 [AutoSar]状态管理一单核 ECUM 第5.4 小结 shutdown.3.10 WakeUp - RunrulesESH_WaitToWakeupExpressionESH_LE_WaitForNvMToWakeupCode1.判定当前模式是否在WAIT_FOR_NVM2.是否有唤醒事件3.ComM是否为PENDINGif((BswM_GetGenericState(1, BswM_GetInternalPartitionIdx(SystemApplication_OsCore3)) BSWM_GENERICVALUE_ESH_State_ESH_WAIT_FOR_NVM) ((EcuM_GetValidatedWakeupEvents() ! 0u) || (BswM_GetGenericState(0, BswM_GetInternalPartitionIdx(SystemApplication_OsCore3)) BSWM_GENERICVALUE_ESH_ComMPendingRequests_ESH_COMM_PENDING_REQUEST))) { /* Return conditional action list BswM_ActionList_ESH_AL_WaitForNvMWakeup. */ retVal BSWM_ID_AL_ESH_AL_WaitForNvMWakeup; }Action listESH_AL_WaitForNvMWakeup{ESH_Action_WriteAllTimer_StopESH_Action_CancelWriteAllTimer_StartESH_Action_CancelNvMWriteAllESH_Action_OnEnterWakeupESH_Action_SwitchWakeupESH_Action_ESH_Wakeup.}Code1.更新NVM计时器防止超时2.取消writeall3.请求跳转到wakeupBswM_UpdateTimer(partitionIdx, BSWM_TMR_ESH_NvM_WriteAllTimer, 0u); BswM_UpdateTimer(partitionIdx, BSWM_TMR_ESH_NvM_CancelWriteAllTimer, 6000u); /*lint -save -e534 *//* PRQA S 3109, 3200 1 */ /* MD_MSR_14.3, MD_BSWM_3200 */ NvM_CancelWriteAll(); /*lint -restore */ BswM_ESH_OnEnterWakeup(); BswM_Switch_ESH_ModeSwitch_BswM_MDGP_ESH_Mode RTE_MODE_ESH_Mode_WAKEUP; BswM_RequestMode(BSWM_GENERIC_ESH_State, BSWM_GENERICVALUE_ESH_State_ESH_WAKEUP);3.11 WakeUp - preshutdownrulesESH_WakeupToPrepExpressionESH_LE_WakeupToPrepShutdownCode1.判定当前是否处于wankeup2.判定是否在执行writeAll3.判定cancel wariteAll是否超时4.是否有唤醒事件5.ComM是否为NO_REQUEST;6.上一次模式请求为wankeupif((BswM_GetGenericState(3, 0u) BSWM_GENERICVALUE_ESH_State_ESH_WAKEUP) ((BswM_GetNvMJobState(0, 0u) ! NVM_REQ_PENDING) || (BswM_GetTimerState(0, 0u) ! BSWM_TIMER_STARTED)) (EcuM_GetPendingWakeupEvents() 0u) ((EcuM_GetValidatedWakeupEvents() 0u) (BswM_GetGenericState(0, 0u) BSWM_GENERICVALUE_ESH_ComMPendingRequests_ESH_COMM_NO_REQUEST)) (BswM_Mode_Notification_ESH_ModeNotification_BswM_MDGP_ESH_Mode RTE_MODE_ESH_Mode_WAKEUP)) { /* Return conditional action list BswM_ActionList_ESH_AL_WakeupToPrep. */ retVal BSWM_ID_AL_ESH_AL_WakeupToPrep; }Action listESH_AL_WakeupToPrep{ESH_Action_OnEnterPrepShutdownESH_Action_SwitchShutdownESH_Action_ESH_PrepShutdown}Code1.切换模式到shutdown用户代码自定义实现下电的相关操作。BswM_ESH_OnEnterPrepShutdown(); BswM_Switch_ESH_ModeSwitch_BswM_MDGP_ESH_Mode RTE_MODE_ESH_Mode_SHUTDOWN; BswM_RequestMode(BSWM_GENERIC_ESH_State, BSWM_GENERICVALUE_ESH_State_ESH_PREP_SHUTDOWN);回到总目录