汽车电子学习笔记 --- EcuM

  1. EcuM 作用:
    • 初始化和反初始化操作系统,SchM和BswM以及一些基本的软件驱动模块
    • 根据需求,配置ECU为SLEEP或者SHUTDOWN模式
    • 管理ECU上的所有唤醒事件
    • 提供了唤醒验证协议,验证确定唤醒事件是否是真的唤醒事件
    • 提供模式请求用户CallOut回调函数用作睡眠唤醒过程中的具体操作
  2. EcuM 阶段
    • 整体过程图
    • startup 阶段:
      1. 最小初始化( ECU启动时,从bootloader跳转到App的main中,进行堆栈初始化和基本模块初始化,再调用EcuM_Init, EcuM开始接管ECU启动过程 ),此阶段必须尽可能短, 驱动程序应该在UP阶段初始化。
      2. 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中没有配置的模块。
      3. EcuM_DriverInitOne: Init block 1,在此 不仅可以包含驱动程序初始化,还可以包含任何在os启动之前的底层初始化
      4. Get reset reson: Mcu_GetResetReason(),获取mcu reset原因
      5. Select default shutdown target: EcuM_CurrentShutdownTarget( off, reset, sleep
      6. The StartPreOS Sequence  shall initialize all basic software modules that are needed to start the OS
      7. EcuM_StartOS: start autosar os( EcuM_StartupTwo --- OS起来后需要第一时间调用
      8. StartPostOS阶段: 执行到EcuM_StartupTwo后,就进入了StartPostOS过程。此阶段需要启动BSW调度表,然后初始化BswM模块,初始化BSW调度表,最后开启调度表计时器,开始执行BSW或者SWC的周期事件。
        1. Start Scheduler Timing --- Start periodical events for BSW/SWCs
        2. Init BSW Scheduler  --- SchM_Init() 执行BswM、SchM 初始化后,EcuM控制权转交给BswM,直到SchM deinit或者睡眠后重新获取控制权
        3. Init BSW Mode Manager  --- BswM_Init()
        4. Start BSW Scheduler --- SchM_Start()
    • Up阶段:进入up阶段 时内存管理模块还没有初始化,也没有启动通信协议栈,RTE和SWC也仍未启动
      1. 由BswM模块 启动模式仲裁和所有进一步的BSW初始化
      2. 启动RTE和启动SWC
      3. 初始化NvM并调用NvM_Readall
      4. 通过调用函数ComM_CommunicationAllowed来使得相应的通信通道允许通信
      5. 周期执行 EcuM_MainFunction(),此函数主要功能:
        • 检查是否存在唤醒源,并启动唤醒验证
        • update the Alarm Clock timer
        • 仲裁RUN和POST_RUN请求和释放( 除非没有通信请求,否则ComM不会释放RUN Request,也就不会退出RUN 阶段
      6. 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验证唤醒源,回到唤醒验证流程
  3. 各阶段Callout调用时序
    • Startup to Run
    • Run to Sleep (Halt) and back to Run
    • Run to Reset
    • Run to Off
  4. 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
  • 5
    点赞
  • 86
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值