ECU的启动首先肯定是从芯片的BootROM开始,之前也写过英飞凌Tricore系列的启动流程(感兴趣回戳—> )。当主芯片内核初始化完之后,软件初始化需要做什么呢? 在现在的汽车ECU开发中,大部分都慢慢引入AUTOSAR架构,所以在AUTOSAR架构中,软件的上下电流程是怎
ECU的启动首先肯定是从芯片的BootROM开始,之前也写过英飞凌Tricore系列的启动流程(感兴趣回戳—> )。当主芯片内核初始化完之后,软件初始化需要做什么呢?在现在的汽车ECU开发中,大部分都慢慢引入AUTOSAR架构,所以在AUTOSAR架构中,软件的上下电流程是怎么做的呢?在AUTOSAR架构中,软件的上下电流程主要由EcuM来管理,EcuM又分为两种,分别为:1、Fixed EcuM:用于管理ECU固定状态,例如OFF、RUN和SLEPP以及这些状态之间的切换,对于没有特殊需求(例如部分启动或快速启动)的ECU,这已足够了,另外,Fixed EcuM不支持多核ECU。
2、Flexible EcuM:Flexible EcuM功能更强大,灵活度更高,允许一下情况: 1、部分或快速启动,即ECU以一组有限的功能启动,然后在逐步启动。
2、交错启动,即ECU最低限度启动,然后启动BSW和SWCs,从而交错BSW和应用程序启动。 3、支持多核ECU,其中ECU的所有不同核上的不同状态(启动、关闭、休眠、唤醒)均能很好的协调。1、EcuM负责BswM,SchM和Autosar OS模块以及一些基本软件驱动程序模块的初始化和反初始化。2、负责处理不同的ECU状态,包括SLEEP和SHUTDOWN状态。3、 EcuM还处理ECU的所有唤醒事件,从而区分真实的唤醒事件和不稳定的唤醒事件。在实际应用中,大部分用的是Flexible EcuM,所以接下来主要针对Flexible EcuM进行介绍。如图1所示,展示了Flexible EcuM的状态机,STARTUP阶段分为两部分,如图2所示。一部分在OS启动之前,称之为StartPreOS,这部分为初始化OS做基础,如图3所示,这个阶段要尽可能的短,主要设计的接口包括:1、EcuM_AL_DriverInitZero:主要用于初始化DET模块,让其他模块可以报告任何开发错误,也可以保持为空函数。2、EcuM_AL_DriverInitOne:主要用于对主芯片的外设进行初始化,例如GPIO、ADC、PWM、ICU等等。STARTUP的第二部分,即为即StartPostOS序列,在调用EcuM_StartupTwo之后被激活。下图4显示了ECU初始化中PostOS启动后的顺序,主要包括:
1、启动BSW Scheduler(SchM)-SchM代表BSW Scheduler。用于加载BSW中TASK的配置信息。
2、初始化BSW调度程序-SchM_Init()是为初始化SchM模块而定义的函数。它用于分配和初始化BSW Scheduler模块要使用的资源。它可以调用OS服务来触发AUTOSAR OS的任务。3、BswM_Init(),用于初始化BswM模块,为了后续可以正常触发BswM中配置的规则和操作序列。
EcuM启动操作系统并完成SchM和BswM的初始化后,ECU进入UP Phase。当BSW Scheduler启动并调用BswM_Init时,UP Phase开始。此时,内存管理、通信堆栈、软件组件(SW-C)都尚未启动。此阶段由集成商定义,ECU按照集成商的指示从一种状态进入另一种状态,从一种模式进入另一种模式。集成商首先必须负责NVM的初始化,然后调用NvM_Readall。然后触发BswM中配置的规则,分别完成通信协议栈、诊断协议栈、网络管理等的初始化,这些初始化完后,启动RTE,然后在启动SWC。这样程序就可以正常运行了。当程序中下电标志位置位后,开始进入SHUNTDOWN阶段,首先是对将通信相关的进行关闭,以及关闭RTE终止任务的周期调度,然后对SHUNTDOWN一些模块,例如DEM、BswM等。 最后调用 EcuM_GoDown(),在此之中主要是将完成NvM的写入,已经操作SBC的下电。
在此阶段,不应执行任何代码,但是仍会向ECU提供电源。应该认为这是一种节能状态,以节省能源。ECU能响应有意或无意的唤醒事件。对于意外唤醒事件,EcuM模块提供的协议会忽略意外的唤醒事件。在常规的ECU中,通常不会这个状态。当ECU断电时,ECU将进入OFF状态。在此状态下可以通过SBC唤醒。