目录
关键词
嵌入式、C语言、autosar、EcuM、wakeup、flex
平台说明
项目 | Value |
---|---|
OS | autosar OS |
autosar厂商 | vector |
芯片厂商 | TI |
编程语言 | C,C++ |
编译器 | HighTec (GCC) |
一、ECUM在整体架构中的位置
二 、ECUM主要功能
1. 负责整个ECU的初始化和反初始化,包括BSW,OS, ScheM以及自定义的CDD模块(DriverInitLists)。
2. 负责处理ECU的状态(sleep,shutdown,startup,wakeup)。
3. 负责处理所有唤醒事件和休眠事件(ComM,BswM)。
4. 负责reset配置。
5. 负责NvM部分读写操作。
6. 负责RTE的启动和停止。
三、对其他模块的依赖
BswM
在EcuM_StartupTwo()中对BswM进行初始化,将唤醒事件和状态转换通知到BswM。MCU
用于在ECUM_STATE_SLEEP and ECUM_STATE_OFF进入省电模式的配置和复位原因排查。DEM
用于当production errors 被激活的时候向DEM报告错误。例如:wake_up时RAM 校验错误DET
用于报告开发错误。ComM
用于将通讯相关唤醒事件通知到ComM。Gpt
用于定时唤醒事件。NvM
用于下电时候的NvM_WriteAll() 和NvM_CancelWriteAll().
四、状态机
4.1 flex 模式
4.2 fixed模式
4.3 fixed 与flex 区别
①flex模式兼容fixed模式
②fixed模式状态唯一,跳转目标状态也是固定的,而flex模式跳转状态不唯一,可自行设计。
③fixed模式只支持单核启动,flex模式兼容单核和多核启动。
④fixed模式不支持部分启动和快速启动,flex支持部分启动和快速启动。
由于Fixed模式在4.4中被移除,本文仅针对Flex模式。
五、各阶段介绍
5.1 Startup one
①EcuM_AL_SetProgrammableInterrupts(): 设置和关闭可编程中断,在start OS 前必须关闭否则会导致时序和堆栈错误。
②EcuM_AL_DriverInitZero() :初始化无需OS支持的底层驱动,各个驱动有优先级后面会讲。该初始化在获取post build配置之前。
③EcuM_DeterminePbConfiguration():获取post build 配置
④检查post build 配置有效性。
⑤EcuM_AL_DriverInitOne():初始化无需OS支持的底层驱动和其他低优先级部分,在post build 之后。
⑥获取Mcu上一次复位原因,读取复位寄存器获取。根据不同的复位原因来进行后续操作,例如为wake复位时需要智行唤醒步骤。
⑦设置默认 Shutdown target,Shutdown有三种情况,分别为 SLEEP、RESET 和 OFF。
⑧EcuM_LoopDetection该接口每次startup时都会被调用,例如可以用来记录启动次数;
⑨StartOS():启动OS,进入在 EcuM 模块配置的 OS 的 AppMode。
5.2 Startup Two
①SchM_Init():BSW调度初始化。
②BswM_Init():BswM模块初始化, BswM 模块成功初始化后,后续的初始化任务由 BswM 模块完成,例如Nvm操作。
③启动RTE。
5.3 Initialization Block
由于autosar要适配不同的芯片,不同的芯片对启动时序又有不同的需求,所以分为了EcuMDriverInitListZero、EcuMDriverInitListOne 和 EcuMDriverRestartList。
5.4 shutdown
OffPreOS阶段如下
① EcuM_OnGoOffOne() 用户自定义代码部分,用于根据芯片特性关闭一些特定功能。
② BswM_Deinit():反初始化BswM模块。
③ SchM_Deinit():反初始化SchM模块。
④ 检查唤醒时间,如果在下电阶段发生挂起或者确认唤醒时间,需要执行唤醒流程,ECUM会将 shutdown target 由OFF改为RESET。
⑤ ShutdownOS(),最后调用ShutdownHook()。
OffpostOS阶段如下
① EcuM_Shutdown()
② EcuM_OnGoOffTwo():用户自定义代码反初始化一些模块。
③ 根据前面设置的Shutdown Target选择EcuM_AL_Reset() 或EcuM_AL_SwitchOff()。
5.5 sleep(GoHalt)
①EcuM_SelectShutdownTarget(ECUM_STATE_SLEEP, resetSleepMode)由BSW触发。
②EcuM_ClearValidatedWakeupEvent(ECUM_WKSOURCE_ALL_SOURCES)清除唤醒通知。
③EcuM_GoHalt()。
④EcuM_EnableWakeupSources(wakeupSource)为即将休眠的状态使能唤醒源
⑤BswM_EcuM_CurrentWakeup(wakeupSource, ECUM_WKSTATUS_NONE)通知BwwM使能的唤醒源
⑥GetResource(ECUM_OS_RESOURCE)停止调度避免被其他task打断sleep流程,如果为多核则主核设置sleep等待从核通知。
⑦DisableAllInterrupts() 关闭中断。
⑧EcuM_InternalEnterHaltMode()生成Hash值以保存RAM等信息。
⑨Mcu_SetMode(ECUM_SLEEPMODELIST[ECUM_CURRENTSLEEPMODE].mcuMode)设置当前sleep阶段的MCUMODE。
⑩EnableAllInterrupts()使能中断。
11. EcuM_CheckRamHash()检查hash值错误则调用EcuM_ErrorHook(ECUM_E_HOOK_RAM_CHECK_FAILED)
5.5.1Halt模式和Poll模式
Sleep分为两种模式,分别是Halt模式和Poll模式
Poll模式:
Poll 模式下 CPU 仍然执行代码,但以较低主频运行。这时 EcuM 将循环调用 EcuM_SleepActivity()和调用 EcuM_CheckWakeup()。
其中EcuM_SleepActivity()为用户自定义代码,用户可以在其中执行低功耗状态下运行的工作。
EcuM_CheckWakeup()为用户自定义代码,用户在其中根据入参遍历唤醒源,调用唤醒源驱动接口检查是否发生唤醒事件。如果发生唤醒事件,唤醒源应当调用EcuM_SetWakeupEvent()通知 EcuM。EcuM 会在检查完成后发现唤醒事件,触发唤醒步骤。
Halt 模式
Halt 模式下 CPU 不再执行任何代码。在此模式下,为了防止可能出现的 RAM 内容破坏,EcuM 会调用EcuM_GenerateRamHash()计算 RAM 的校验值。在EcuM_GenerateRamHash()中用户需要自行对关键内容计算检验并保存。
5.6 run ->reset
- EcuM_SelectShutdownTarget(ECUM_STATE_RESET, resetMode)由BswM通知
- EcuM_GoDown()
- EcuM_OnGoOffOne()
- BswM_Deinit()
- SchM_Deinit()
- ShutdownOS(E_OK)
- EcuM_Shutdown()
- EcuM_OnGoOffTwo()
- EcuM_AL_Reset( EcuM_CurrentShutdownMode )
5.7 wakeup
(后续更新)