[AutoSar]状态管理(一)单核 ECUM


关键词

嵌入式、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的启动和停止。

三、对其他模块的依赖

  1. BswM
    在EcuM_StartupTwo()中对BswM进行初始化,将唤醒事件和状态转换通知到BswM。

  2. MCU
    用于在ECUM_STATE_SLEEP and ECUM_STATE_OFF进入省电模式的配置和复位原因排查。

  3. DEM
    用于当production errors 被激活的时候向DEM报告错误。例如:wake_up时RAM 校验错误

  4. DET
    用于报告开发错误。

  5. ComM
    用于将通讯相关唤醒事件通知到ComM。

  6. Gpt
    用于定时唤醒事件。

  7. 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、EcuMDriverInitListOneEcuMDriverRestartList
在这里插入图片描述

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

  1. EcuM_SelectShutdownTarget(ECUM_STATE_RESET, resetMode)由BswM通知
  2. EcuM_GoDown()
  3. EcuM_OnGoOffOne()
  4. BswM_Deinit()
  5. SchM_Deinit()
  6. ShutdownOS(E_OK)
  7. EcuM_Shutdown()
  8. EcuM_OnGoOffTwo()
  9. EcuM_AL_Reset( EcuM_CurrentShutdownMode )

5.7 wakeup

(后续更新)

相关推荐

  1. 如何设置测试

    2023-12-11 06:54:07       19 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-11 06:54:07       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-11 06:54:07       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-11 06:54:07       82 阅读
  4. Python语言-面向对象

    2023-12-11 06:54:07       91 阅读

热门阅读

  1. MYSQL数据类型详解

    2023-12-11 06:54:07       61 阅读
  2. 数组 注意事项

    2023-12-11 06:54:07       49 阅读
  3. GraphSAGE

    GraphSAGE

    2023-12-11 06:54:07      51 阅读
  4. C/C++语言的安全编码规范

    2023-12-11 06:54:07       53 阅读
  5. 计算机视觉-机器学习-人工智能顶会 会议地址

    2023-12-11 06:54:07       49 阅读
  6. 【求职】外企德科-网易游戏测试面试记录

    2023-12-11 06:54:07       55 阅读
  7. git commit语义规范

    2023-12-11 06:54:07       54 阅读
  8. Docker安装教程

    2023-12-11 06:54:07       71 阅读
  9. Spark

    2023-12-11 06:54:07       38 阅读