-
EcuM 作用:
-
初始化和反初始化操作系统,SchM和BswM以及一些基本的软件驱动模块
-
根据需求,配置ECU为SLEEP或者SHUTDOWN模式
-
管理ECU上的所有唤醒事件
-
提供了唤醒验证协议,验证确定唤醒事件是否是真的唤醒事件
-
提供模式请求用户CallOut回调函数用作睡眠唤醒过程中的具体操作
-
-
EcuM 阶段
-
整体过程图
-
startup 阶段:
-
最小初始化( ECU启动时,从bootloader跳转到App的main中,进行堆栈初始化和基本模块初始化,再调用EcuM_Init, EcuM开始接管ECU启动过程 ),此阶段必须尽可能短, 驱动程序应该在UP阶段初始化。
-
StartPreOS阶段:调用 EcuM_Init后开始进入此阶段
-
Interrupts should not be used during this sequence.If interrupts have to be used, only category I interrupts are allowed in the StartPreOS equence. OS初始化做准备的阶段,应当尽可能保证最短过程。 此阶段 不应该使用中断, 如果必须使用中断,在只允许使用一类中断 。( 二类中断需要运行OS,一类中断则不需要)
-
callout 回调函数: EcuM_AL_SetProgrammableInterrupts,在此设置必须是在os启动之前的中断。
-
EcuM_AL_DriverInitZero: Init block 0,可以在此初始化Bsw中没有配置的模块。
-
-
EcuM_DriverInitOne: Init block 1,在此 不仅可以包含驱动程序初始化,还可以包含任何在os启动之前的底层初始化
-
Get reset reson: Mcu_GetResetReason(),获取mcu reset原因
-
Select default shutdown target: EcuM_CurrentShutdownTarget( off, reset, sleep )
-
The StartPreOS Sequence shall initialize all basic software modules that are needed to start the OS
-
EcuM_StartOS: start autosar os( EcuM_StartupTwo --- OS起来后需要第一时间调用 )
-
StartPostOS阶段: 执行到EcuM_StartupTwo后,就进入了StartPostOS过程。此阶段需要启动BSW调度表,然后初始化BswM模块,初始化BSW调度表,最后开启调度表计时器,开始执行BSW或者SWC的周期事件。
-
Start Scheduler Timing --- Start periodical events for BSW/SWCs
-
Init BSW Scheduler --- SchM_Init() 执行BswM、SchM 初始化后,EcuM控制权转交给BswM,直到SchM deinit或者睡眠后重新获取控制权
-
Init BSW Mode Manager --- BswM_Init()
-
Start BSW Scheduler --- SchM_Start()
-
-
-
Up阶段:进入up阶段 时内存管理模块还没有初始化,也没有启动通信协议栈,RTE和SWC也仍未启动
-
由BswM模块 启动模式仲裁和所有进一步的BSW初始化
-
启动RTE和启动SWC
-
初始化NvM并调用NvM_Readall
-
通过调用函数ComM_CommunicationAllowed来使得相应的通信通道允许通信
-
周期执行 EcuM_MainFunction(),此函数主要功能:
-
检查是否存在唤醒源,并启动唤醒验证
-
update the Alarm Clock timer
-
仲裁RUN和POST_RUN请求和释放( 除非没有通信请求,否则ComM不会释放RUN Request,也就不会退出RUN 阶段 )
-
-
Wake-up Sources :
-
状态
-
NONE: 没有检测到唤醒事件或唤醒事件已被清除
-
PENDING: 检测到唤醒事件,但尚未验证
-
VALIDATED: 检测到唤醒事件并成功验证
-
EXPIRED: 检测到唤醒事件,但验证失败
-
-
唤醒源(支持32个唤醒源)
-
ECUM_WKSOURCE_POWER
-
ECUM_WKSOURCE_RESET
-
ECUM_WKSOURCE_INTERNAL_RESET
-
ECUM_WKSOURCE_INTERNAL_WDG
-
ECUM_WKSOURCE_EXTERNAL_WDG
-
ECUM_WKSOURCE_ECUM_WKSORCE_CAN00
-
ECUM_WKSOURCE_ECUM_WKSORCE_CAN01
-
ECUM_WKSOURCE_ECUM_WKSORCE_LIN00
-
ECUM_WKSOURCE_ECUM_WKSORCE_LIN01
-
ECUM_WKSOURCE_ECUM_WKSORCE_GPT
-
ECUM_WKSOURCE_ECUM_WKSORCE_RF
-
ECUM_WKSOURCE_ECUM_WKSORCE_LF
-
ECUM_WKSOURCE_ECUM_WKSORCE_XXX
-
-
唤醒源有效性校验红色标识的5个唤醒源不需要有效性校验,其他唤醒源都可以通过工具配置有效性校验时间(EcuMValidationTimeout)
- 如果唤醒源被检测到后,会调用一次EcuM_SetWakeupEvent函数进行唤醒,并在在EcuM_SetWakeupEvent 函数中启动验证超时timer,如果后续同一个唤醒源再次调用EcuM_SetWakeupEvent,不会reset 超时验证的timer.
- pending event 调用EcuM_ValidateWakeupEvent进行验证,如果验证通过,EcuM记录唤醒源,可以通过EcuM_GetValidatedWakeupEvents 获取唤醒源信息。
- 如果验证超时,EcuM_MainFunction会调用 BswM_EcuM_CurrentWakeup设置状态为 ECUM_WKSTATUS_EXPIRED
-
-
-
SHUTDOWN 阶段
-
Shutdown Targets:
-
ECUM_STATE_SLEEP
-
ECUM_STATE_RESET
-
ECUM_STATE_OFF
-
-
API接口:EcuM_SelectShutdownTarget(), 需要 在 EcuM的状态为ECUM_STATE_RUN 的时候调用, 在启动阶段或睡眠阶段,不允许改变 shutdown target . 在使用工具配置过程中必须设置默认 shutdown target。
-
当在shutdown阶段检测到有唤醒事件时, EcuM会依然进行shutdown流程,在完成关机后立即restart。
-
OffPreOS Sequence:
-
1) De-init BSW Mode Manager
-
2) De-init BSW Scheduler
-
3) Check for pending wakeup events ---在shutdown阶段检测 wakeup events
-
4)检测到wakeup event pending , Set shutdown target = RESET
-
5) 调用NvM_WriteAll函数完成写操作,并开启写超时计数器。
-
6) 等待NvM写成功或者NvM写超时,调用函数 ShutdownOS 关闭OS(callout ShutdownHook 调用 EcuM_ShutDown )
-
-
OffPostOS sequence:
-
1) Callout EcuM_OnGoOffTwo
-
2) Callout EcuM_AL_Reset ( shutdown target = RESET )or Callout EcuM_AL_SwitchOff ( shutdown target = off )
-
-
-
Sleep 阶段
-
shutdown target == sleep, 进入到Sleep阶段, BswM调用EcuM_GoHalt()或者EcuM_GoPoll()。
-
可以配置 进入到Sleep模式后的模式为 Halt模式或者 Polling模式
-
Halt模式:
-
等待Wakeup Event触发唤醒, 在该低功耗模式下不运行代码
-
睡眠前可以调用 EcuM_GenerateRamHash() 生成RAM中数据对应的Hash值, 接收到唤醒事件后,则调用 EcuM_CheckRamHash 来完成睡眠前后RAM一致性检查,确保数据的正确性。 若一致,则进入到Wakeup阶段,若不一致,则调用Dem模块的Event ID来上报故障并触发重启来保证安全。
-
DisableAllInterrupts -> EcuM_GenerateRamHash -> EcuM_McuSetMode(Halt)
-
-
Polling模式
-
降低系统时钟频率来运行代码, 周期查找当前有无唤醒事件触发唤醒。
-
callouts EcuM_SleepActivity() and EcuM_CheckWakeup()
-
DisableAllInterrupts -> EcuM_McuSetMode(Polling) -> EnableAllInterrupts -> EcuM_SleepActivity -> EcuM_CheckWakeup
-
-
-
相对于SHUTDOWN阶段,ECU Manager模块在进入SLEEP阶段时不会关闭OS。
-
GoSleep Sequence
-
进入睡眠后,程序会进入一个while死循环中, 执行需要在睡眠状态执行的其他动作,并不停地检测唤醒事件, 直到产生唤醒源时才继续往下执行。
-
WakeupRestart Sequence
-
1)重新 设置MCU模式为Normal Mode
-
2)获取所有pending唤醒源,调用 EcuM_DisableWakeupSources ,disable pending 唤醒源
-
3)调用 EcuM_AL_DriverRestart重新初始化需要初始化的驱动程序
-
4) Unlock Scheduler,至此,所有OS task重新run起来
-
5) 调用函数 EcuM_ValidateWakeupEvent验证唤醒源,回到唤醒验证流程
-
-
-
-
各阶段Callout调用时序
-
Startup to Run
-
Run to Sleep (Halt) and back to Run
-
Run to Reset
-
Run to Off
-
-
EcuM Mode Handling
-
EcuM 分为两种模式:Flex and Fixed, Flexible 的功能更强大,对比 Fixed, 它主要有以下 优势 :
-
部分或快速启动, 分步启动, 最小化启动系统,然后启动 RTE 并最快的在 SWC 中执行功能,随后在启动其它的 BSW 和 SWC 模块
-
不止一个 RUN 的操作状态,从 RUN 到 SLEEP 有连续的操作状态。
-
Flexible 模式EcuM 使用通用的模式管理设施 ( RTE 、 BSW Scheduler 结合的模块以及 BSWM )灵活的配置一些规则条件实现ECU的模式切换和执行必要的动作,Fixed ECUM使用固定的ECU状态和转换条件实现ECU的模式切换。
-
-
The State Diagram of the EcuM flex
-
-
State Diagram of the EcuM with fixed
-
EcuM Mode Handling
-
当BswM通过EcuM_SetState()设置EcuM的state时,EcuM会同时向RTE设置相应的模式。
-
Run Request Protocol
-
在Run to Post_Run 状态切换时,SWC 需要先request post_run,然后再release run request.
-
-
EcuM只请求模式RUN和POST_RUN,Sleep 模式由BswM设置完成
-
State Machine of the ECU State Handling
-
-
汽车电子学习笔记 --- EcuM
最新推荐文章于 2024-03-10 12:00:00 发布