当今汽车的电子化程度越来越高,最明显的就是车载ECU越来越多,汽车绝大部分功能都需要ECU的参与。如果从功能来看,不同功能的ECU看似没有任何联系。那么,这是否意味着不同的ECU开发完全没有共性呢?
答案当然是否定的,今天从技术角度来聊聊汽车ECU开发。从个人观点出发, 我将ECU开发简单分为单片机开发和嵌入式开发。
单片机也就是常说的MCU,汽车行业多使用瑞萨的芯片进行开发,比如RH850芯片。MCU上一般运行RTOS,对于汽车行业来说,OSEK OS是最为常见的操作系统。
OSEK OS属于实时操作系统,,熟悉RTOS系统的都知道,RTOS内部没有进程、线程这类概念,而TASK才是其基本运行单位。MCU运行的TASK在初期设计阶段确定,且每个TASK运行的时间和运行顺序也是确定的。如果考虑到任务优先级,高优先级的任务在运行时会抢占低优先级的任务。
上面介绍了单片机开发的基本知识点,接下来说说我认为单片机开发中的难点:状态机设计和中断处理函数。
ECU在运行时可能会有多种状态,而每种状态则要求执行不同的处理,因此设计状态机时需要考虑到ECU所有可能的状态、每种状态需要执行的操作,以及状态迁移的条件等。
以电源管理为例,ECU有sleep,standby,wakeup三种状态。如果ECU从wakeup进入到sleep状态,那么此时要求必要数据保存到flash中,所有的task要停止运行,某些硬件需要下电,ECU不再接收CAN消息,电流需要降低到某个规定值等等。
一旦电源管理状态机设计有bug,那么ECU的行为就可能出现异常,比如无法睡眠、睡眠电流过高、严重的可能会导致损坏等等。上面只是举了一个简单的例子,电源管理的状态机也没有这么简单,由此可见状态机的设计难度之高。
单片机开发的另一个难点是中断处理函数。中断和芯片有关系,可以在芯片手册中查看到中断向量表,程序员可以编写对应的中断处理函数。如果中断被触发,则程序查询中断向量表,并跳转到对应中断处理函数。但中断处理有时候会导致程序卡死或行为异常。
如果中断处理函数中处理的变量被某个函数或者TASK使用,那么中断触发后,变量发生改变。如果这个变量被某个状态机使用,那么有可能会导致状态迁移,进而导致ECU行为异常。另外一点,中断处理函数内部循环等待某个信号的变化,但如果一直没等到,而开发人员没有添加定时器,此时程序就会在这个中断卡死,进而导致程序无法正常运行。因此,开发人员在实现中断处理函数时,一定要小心谨慎。
本文简单介绍了汽车ECU中单片机开发的难点,受限本人经验不够丰富,观点难免有些片面,单片机开发的难点应该还有不少。文章内容是我个人项目经验总结的难点,希望能够给不熟悉的朋友带来一些参考。
ps. 欢迎关注微信公众号【程序猿司晨】,汽车专业野生程序员一枚,分享汽车软件技术和个人成长经历。 技术栈:嵌入式Linux、车载网络通讯协议、Adaptive Autosar…