EcuM主要负责Ecu的上下电流程管理,上电时负责各个模块功能开启;下电时负责按顺序关闭各个模块,保存数据;而在Ecu正常运行时,EcuM将不在负责管理Ecu,由BswM接手管理;EcuM还负责Ecu休眠时状态的处理(更多情况是Ecu在没有通信状态时直接下电处理)
本文主要介绍上下电两个流程。
1. StartUp阶段
1.1 StartPreOS Sequence
StartPreOS序列的目的是准备ECU初始化操作系统,应该尽可能短。如果可能的话,驱动程序应该在UP阶段初始化,并且调用也应该保持简短。在这个序列中不应该使用中断。如果必须使用中断,在StartPreOS序列中只允许I类中断。
-
EcuM_AL_SetProgrammableInterrupts:主要负责关闭芯片的可编程中断,为初始化其他模块和启动操作系统做准备。如果系统启动代码已将中断关闭,则可通过配置参数将该步骤省略,否则需要在该函数中关闭中断。
-
EcuM_AL_DriverInitZero:初始化Init List 0容器里面的驱动。用于初始化一些公共基础模块,以及获取 PB 参数所需要的硬件模块的驱动。主要负责Det或者Dem的初始化,保证在后续的过程中,如果发生初始化的错误,开发集成人员可以确认
-
EcuM_DeterminePbConfiguration:调用将返回一个指向完全初始化的EcuM_ConfigType结构体的指针,该结构体包含ECU管理器模块和所有其他BSW模块的构建后配置数据
-
EcuM_Prv_PBPointerConsistencyCheck:检查配置数据的一致性,数据一致性检查失败后调用 EcuM_ErrorHook
-
EcuM_AL_DriverInitOne:初始化Init List 1容器里面的驱动。用于初始化一些具有多套配置,且不依赖于操作系统的模块。主要是MCU初始化、时钟初始化、内存的初始化、Port、 GPT、WDG、 ADC等初始化
-
EcuM_Prv_SetDefinedMcuWakeupSource:调用MCU模块提供的AUTOSAR标准接口Mcu_GetResetReason获取复位原因,同时调用EcuM_SetWakeupEvent设置唤醒事件
-
选择默认的shutdown目标
-
EcuM_LoopDetection:如果启用了循环检测,则每次启动时都会调用该调用。如果检测到复位回路,则返回true。否则返回false。
-
EcuM_Prv_StartOS:启动操作系统,入参为在 EcuM 模块配置的 OS 的 AppMode。该函数最终不会返回。
1.2 StartPostOS Sequence
需要配置一个自启动任务在该任务中,需要调用EcuM_StartupTwo(),StartPostOs存在于该函数执行过程中。
-
Start Scheduler Timing:启动BSW调度表,Start periodical events for BSW/SWCs
-
Init BSW Scheduler:初始化BswM模块,SchM_Init() 执行BswM、SchM 初始化后,EcuM控制权转交给BswM,直到SchM deinit或者睡眠后重新获取控制权
-
Init BSW Mode Manager:初始化BSW调度表,BswM_Init()
-
Start BSW Scheduler:开启调度表计时器,SchM_Start()
2. ShutDown阶段
2.1 OffPreOS Sequence
-
执行 EcuM_OnGoOffOne(),这是一个集成代码,主要负责处理一些关闭前的特殊操作。需要根据芯片特性填充功能。
-
执行 BswM_Deinit(),反初始化 BswM 模块。
-
执行 SchM_DeInit(),反初始化 SchM 模块。
-
检查唤醒事件,如果在关闭过程中发生挂起或确认的唤醒事件,则系统需要响应唤醒。所以若当前 Shutdown Target 为 OFF,EcuM 会将其更改为 RESET,即在执行完后续的关闭动作后将处理器复位,从而再次启动。若没有发生唤醒事件,则正常执行关闭流程。
-
执行 ShutdownOS(),关闭操作系统。该函数会清理操作系统中的一些资源,最终调用ShutdownHook()。
2.1 OffPostOS Sequence
-
调用EcuM_OnGoOffTwo()。用户可以在其中调用不依赖于操作系统的模块的反初始化或清理工作。
-
根据前面设置的 Shutdown Target , 分别调用EcuM_AL_Reset() 或EcuM_AL_SwitchOff()。用户需要在这两个函数中分别调用驱动来实现系统复位或关闭电源等工作,自此ECU完成Shutdown流程。