聊聊汽车 ECU 中单片机开发
当今汽车的电子化程度越来越高,最明显的就是车载 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 中单片机开发的难点,受限本人经验不够丰富,观点难免有些片面,单片机开发的难点应该还有不少。文章内容是我个人项目经验总结的难点,希望能够给不熟悉的朋友带来一些参考。
文章首发于上汽零束开发者论坛。
作者:程序猿司晨
文章来源:上汽零束 SOA 开发者论坛
原文链接:https://bbs.z-onesoft.com/omp/community/front/api/page/mainTz?articleId=7502
评论