AUTOSAR EcuM(ECU状态管理器)
EcuM管理的ECU状态特指ECU的上下电状态。EcuM有两种EcuMFixed和EcuMFlex,其中EcuMFlex是在 AUTOSAR4.x 之后新增的规范文件,相应地原来的 EcuM 改称为 EcuMFixed。EcuMFlex主要是为了适应不同应用场景的各种不同需求,实现更加灵活的处理。所以在AUTOSAR官方文档中,《AUTOSAR_SWS_ECUStateManager.pdf》则对应的是EcuMFlex,《AUTOSAR_SWS_ECUStateManagerFixed.pdf》则对应的是EcuMFixed。
EcuMFixed中的模式和状态是固定的,而 EcuMFlex 中删除了许多模式和状态,这些模式和状态的定义根据不同需求由 BswM 模块加以定义。因此EcuMFlex也必须与BswM配合使用才能实现完整的模式和状态处理。
1.角色承担:
初始化包括初始化OS,SchM,BswM以及部分基础软件驱动模块;将ECU配置为Sleep与ShutDown状态;管理ECU的所有唤醒事件。
2.关联模块:
OS,SchM,BswM
3.多核支持:
支持多核ECU,启动、关机、睡眠以及唤醒,能在ECU的所有内核上进行协调。
4.相关术语:
唤醒源(Wakeup Source)是指处理唤醒事件的外围设备或ECU组件。
唤醒事件(Wakeup Event)是指导致唤醒的物理事件。例如:CAN消息或IO输入的跳变沿都可以是唤醒事件。
唤醒原因(Wakeup Reason)是指作为上次唤醒的实际原因的唤醒事件。
被动唤醒(Passive Wakeup)是指由连接的总线(Attached bus)引起的一种唤醒。它不属于由定时器或传感器活动等内部事件引起的唤醒。
Callout是指系统设计人员使用代码替换的一种Stub函数。通常在配置时,为ECU管理器模块提供一些附件功能。Callout分为两类。一类是作为硬件抽象层向ECU管理器模块提供强制性的功能或服务。另一个类是提供一些可选功能。
阶段(Phase)是指和ECU管理器的动作及事件相关的逻辑或时间组合,例如:STARTUP、UP、SHUTDOWN、SLEEP等。阶段可以由通常称为序列的子阶段组成。
状态(State)存在于它们各自的BSW组件内部,对Application是不可见。所以它们只被BSW的内部状态机使用。ECU管理器模块的状态,负责构建阶段(Phase)并处理相关模式(Mode)。
模式(Mode)是指在车辆中运行过程中各种状态机的某组特定的状态。它不只和ECU管理器模块相关。同时并与特定实体、应用程序或整个车辆相关。
ECU必须在进入睡眠状态、关闭电源或复位之前被关闭。因此SLEEP、OFF和RESET是有效的关机目标(Shutdown Target)。通过选择关机目标,应用程序可以在下次关闭后,将其对ECU行为的愿望传达给ECU管理器模块。
5.与BswM模块交互:
EcuM负责初始化BSW调度程序。BswM负责监控ECU中的变化,并酌情影响ECU状态机的相应变化。
EcuM在ECU启动后进行控制,初始化SchM和BswM后将ECU控制权交给BswM。需要锁定操作系统并处理唤醒事件时,或者OS关闭停止前,BswM将控制权交还给EcuM。
在验证唤醒源时,ECU管理器模块通过模式切换请求向BswM指示唤醒源状态更改。
6.接口函数:
6.1 EcuM_MainFunction,定期调度
检查唤醒源是否被唤醒,并在必要时启动唤醒验证。
更新闹钟定时器(Alarm Clock timer)
仲裁RUN和POST_RUN的请求和释放。
7.闹钟
EcuM可以提供可选的持久化地时钟服务。Sleep期间也保持active状态。因此,它能保证ECU在未来的某个时间被唤醒(假设硬件没有任何故障),并为长期活动提供时钟服务。
EcuM维护一个主闹钟,其值决定了ECU将被唤醒的时间。同时管理一个内部时钟,即EcuM时钟,用于与主闹钟进行比较。
闹钟唤醒机制仅与SLEEP阶段相关。SW-C和BSW模块可以在UP阶段(并且仅在UP阶段)设置和检索闹钟设定值,但是最终在SLEEP阶段被使用。系统应该有且只有一个唤醒源分配给了EcuM时钟。在StartPreOS序列、WakeupRestart序列和OffPreOS序列中,用户闹钟和主闹钟需被取消。
8.多核
当前独立单个内核的关闭是不支持的(即:ECU的部分继续运行时)。所有内核必须同时被关闭。当ECU需被关闭时,主ECU管理器模块调用ShutdownAllCores,而不是以某种方式在各个内核上调用ShutdownOS。ShutdownAllCores会停止所有内核上的操作系统,并且停止所有内核运行。由于主内核可以在所有从内核完成处理之前发出ShutdownAllCores,所以在进入SHUTDOWN之前必须对这些内核进行同步。
当请求的关机目标是睡眠(Sleep)时,所有内核需同时进入睡眠状态。MCU必须为每个内核发出停止(Halt)指令。但任务时序(Task Timing)和优先级属于本地局部的(local),所以调度程序(scheduler)和RTE在停止后都不必同步。因为主内核可以在所有从内核完成处理之前,发出MCU停止指令,所以在进入GoHalt之前,必须对所有从内核进行同步。
BswM需确定睡眠应该被启动,并将相应的ECU模式分配给每个内核。在从内核上的BSW、SW-C和CDD必须由其分区上本地的BswM负责通知,同时相应地去初始化,并向BswM发送相应的模式请求,以表明已准备就绪。
如果ECU进入睡眠状态,则停止(Halt)指令必须同步,以便在主内核计算校验和之前停止所有从内核。主内核上的EcuM使用与在Go Off时相同的同步内核信号机制。类似,主内核上的EcuM必须在释放从内核停止状态(Halt State)之前验证计算的校验和值。
ECU管理器模块需忽略初始化期间发生的所有类型的错误。例如:初始化函数返回的值。