【工作生活】汽车ECU开发内容简介

目录

1. 目标

2. 要分享什么

3.1 行业知识

3.1.1车载行业知识:

3.1.2项目:

3.1.3开发测试工具:

3.2 硬件平台

3.3 基础知识

3.4 工作生活

3. 我们是谁


1. 目标

随着新能源汽车的快速崛起,汽车电子行业开始快速发展,而汽车软件对功能安全要求很高,对工程师的需求和要求也越来越大。且汽车ECU开发标准,规范众多,AUTOSAS这座大山更是望其项背,本人从0到1学习汽车ECU开发,深知其中的辛苦。基于这样的背景,想建立一个汽车电子软件知识系统分享的平台,从原理分析到代码分析最后再到实际项目应用,让初入行的汽车工程师少走弯路,同资深的工程师相互学习。作者也需要吃饭,部分内容付费,不喜勿喷!

2. 要分享什么

图片

如上图所示,分享的内容包括汽车电子软件工程师所需要掌握的基础知识,硬件平台,行业知识,以及职业软实力知识。希望形成一条主线,在这条主线上删繁就简逐步建立属于自己的知识体系框架。

3.1 行业知识

3.1.1车载行业知识:

AUTOSAR:这里先介绍Class Platform AUTOSAR,Adaptive Platform AUTOSAR还没接触过,暂不介绍。

图片

  对于车载或者电控MCU平台的项目,AUTSAR能够帮助我们快速开发和迭代项目。基于个人对AUTOSAR的学习经验,学习AUTOSAR不能只停留在文档阅读上面,一定要基于源码来阅读,然后付诸于实践,特别是在应用层使用AUTOSAR方法论(port,interface, composition,data type.....)的时候一定要基于实际项目来理解,这样才能真正掌握。

  在学习当中要总结一套自己的阅读技巧,比如我开始学习的时候就记录了一下我的学习步骤:

step1: 总体预览下这个模块实现的功能,看文档的功能概述

step2: 浏览下模块中的各种概念定义

step3: 看代码的模块配置定义文件,对照着配置实现代码,不懂的概念到文档中查找理解

step4: 看懂所有的配置后再去看函数实现,文档有函数的功能说明。

note1: 对于每个模块,看它实现了什么功能,调用下层什么模块,被哪个上层模块在什么场景下使用。

note2: 先抓主线,然后在整体框架上去看模块某个具体的功能是怎么是实现的!-- 以COM模块为例,主线就是Com的收发机制,底部收到CAN数据到COM层怎么更新数据;COM层怎么发送数据;COM和RTE的交互实现。搞清楚这个主线之后,在去分析COM模块中的Sequence Control或者Update-Bits是怎么实现的!

图片

以CAN协议栈为例。分析CAN TRANCEIVE-->CAN DRIVER-->CANIF-->PDUR / CANTP/CANNM/CANSM整个协议栈,形式上从文档出发,结合开源源码和工具分析CAN协议栈的具体实现和使用,然后最好能以Demo的形式给出示例。 

复杂驱动:

图片

  电控类项目(BMS, BCM, VCU)如BMS的单体采样控制、车身域/BCM的高低驱输出控制,动力域/VCU的刹车或上下电控制以及整个ECU的电源管理对采样的精度和电源的可靠性要求很高,都会使用特殊的芯片来实现。而对这些特殊芯片的操作AUTOSAR没有定义规范,就需要复杂驱动来实现。

  对于复杂驱动,正向功能的开发当然很重要,但是对于其诊断和自恢复功能的实现也特别重要(VCU要是突然异常掉电了,要是没有证据证明不是自己的问题,那你就完蛋了。。。)。而对于复杂驱动的学习,最重要的就是看Datasheet,然后多和硬件工程师讨论,最后疯狂的测试。

  对于这部分的学习,将结合具体的应用场景从Datasheet出发,一步一步的实现一个可用的复杂驱动,最后最好能总结出一个驱动框架。

网络管理:

图片

  网络管理最重要的功能就是保证整车上的所有ECU同睡同醒,最大程度上的节约用电(理想很丰满,现实很骨感,一旦一个ECU的网络管理出现问题,整车所有的ECU都不会休眠或掉电。。。)。而网络管理一般用OSEK网络管理和AUTOSAR网络管理,目的都是一样。对于这部分的学习,将从概念到源码再到实践,要在仿真器上实现OSEK网络管理建环,AUTOSAR网络管理睡眠。

诊断UDS:

  诊断部分最重要的两个协议就是传输层ISO-15765协议和应用层ISO-14229协议,协议实现的载体一般是CAN通信服务。传输层实现数据的类型校验和数据的上传下达、流控的实现、各种定时器的实现。应用层则实现具体的服务,比如DTC的读写,IO的诊断控制,诊断刷写升级ECU等。

将从CAN邮箱中断收到物理寻址或功能寻址报文开始,一步一步分析整个UDS协议栈的具体实现。

BootLoader:

  BootLoader最重要的功能就是实现ECU的升级。一般独立的ECU(BMS,VCU...)使用CAN诊断的0x27协议实现刷写更新程序,而MCU和SOC共存的ECU会通过串口UART使用X/YModel协议实现ECU的升级。而其中最主要的指标就是刷写的成功率,以及失败后的应急方案。

  ECU升级一般要求得99.99%以上的成功率,不然一旦ECU刷写失败会导致很多的异常问题。通过双分区的办法来保证刷写失败后ECU能回退到刷写前的版本。其中的具体实现还有很多的细节考虑,比如刷写数据的校验机制,异常断电导致失败的重新刷写机制,以及防异常的写Flash代码拷贝机制等等。

EOL:

  EOL也就是End Of Line下线检测,对于汽车ECU一般在单件工厂会有一次下线检测,在整车集成后的整车下线也会有一次下线检测。而下线检测的内容一般是常见的DTC清除,各种外设的正常输入输出等等。一般会制定一个详细的下线检测流程,也就是对已经实现的功能增加一个诊断Session的功能来接管控制操作一下,看是不是我们想要的输入输出。

  EOL看似简单,就是对已实现的功能的检测,但是涉及生产无小事,因为一旦生产出问题,整个产品线就会停滞,BOSS可不会管你的,劈头盖脸的质量人员就会招呼来了。。。

标定:

图片

  标定,顾名思义就是对一些我们不能确定的参数通过实际路试情况统计得出并写到ECU的ROM当中。一般采用XCP协议实现,协议载体一般还是CAN通信协议栈。对于标定协议和具体应用我们可以思考一下的几个问题:

-- 标定的数据具体怎么定义?如果不使用Matlab定义标定数据怎么样生产A2L文件?

-- 怎么样修改我们的链接文件给我们的标定数据开闭一块特定的标定数据域?

-- 使用什么样的上位机来实现数据标定?

-- 整个XCP协议在AUTOSAR工具中是怎么配置的?

这些都是我们应该学习和考虑清楚的。

功能安全:

  功能安全属于属于锦上添花的事情,和装修房子一样你想花多少钱(时间/精力/复杂度)都可以。通俗的来讲就是通过头脑风暴的方式得出各种工况下的异常场景,然后通过具体规则划分优先级和必要性,最后指定具体的异常处理措施,将软件的可靠性做到更优。

开发流程:

  小公司可能就是一个人在战斗,基本没有开发流程这回事。但是大公司,这个还是很重要的,一旦涉及到多人开发,没有一个成熟的开发流程,各种浑水摸鱼已经异常问题就出现。

  对于汽车电子产品,常见的开发流程关键词为:自上而下,自下而上,V字型,ASPICE等等。

  不管使用哪一种,有几个关键点都是一样的:

-- 各个阶段(ET阶段,PT阶段,SOP阶段)的详细开发计划(一级,二级,三级)

-- 开发计划下的每个功能的具体负责人,及dealine时间

-- 开发节点应该提交的输出物(需求文档,需求文档评审/修改记录,详细设计文档,详细设计文档评审/修改记录,代码,测试报告)

-- 功能增长表(风险分析控制表)

-- BUG管理和追踪

-- 项目代码管理和提交/修复追踪,版本管理 控制等

3.1.2项目:

项目很多,我们要学会以不变应万变,摸索一套能够套用的项目开发流程。以车身域控制器开发为例,我们首先从公司的第一级开发计划中筛选出二级部门计划,然后软硬件芯片选型,根据已有资源工具和人力制定详细的三级ECU开发计划。

从功能上划分,第一层可分为ASW应用层功能需求和BSW基础软件功能需求。第二层ASW需求又可分为车身控制系统、无钥匙进入启动系统、智能配电系统、热管理控制系统。BSW需求又可分为MCALL需求、IOHWAB需求、CDD需求、NVM需求、UDS需求、COM需求、OS需求、WatchDog需求、ECUM需求等。第三层ASW需求就是具体的应用实现功能。

完成了具体的功能模块需求后,ASW需要根据具体的开发设计输入文档进行架构设计,输出ARXML文件,导入Matlab进行应用层需求开发。

BSW需求则使用BSW工具根据具体需求开始配置,CDD功能和IOHWAB功能需要根据实际情况调用MCAL接口手动实现。

3.1.3开发测试工具:

Davince:

  MCAL工具配置生成动态MCAL配置代码,不同芯片配置成统一的MCAL驱动程序接口。每一个MCAL接口,AUTOSAR文档已经明确定义,但每一个接口的具体实现不同的芯片又不一样,以MCU模块为例,要配置MCU模块就得对芯片的时钟十分清楚,因为MCU模块会调用统一的MCAL接口完成时钟的初始化。MCAL的配置会影响硬件的特性,这就需要我们对芯片特性和MCAL需求特别熟悉,不然就会产生很多奇怪的问题。

ISOLAR:

  ISOLAR包括四个部分的功能,BSW的配置,OS的配置,RTE的配置,ASW的配置。BSW主要配置通信协议栈,存储协议栈,诊断协议栈。OS配置任务调度表,优先级等。RTE配置SWC之间及SWC与BSW间的运行时环境。ASW配置各个SWC的接口。如果是自底向上的开发流程,需要在ISOLAR当中完成SWC的架构配置,生成ARXML文件导入到simulink进行应用层开发。

MATLAB:

  使用MATLAB/SIMULINK功能开发应用程序。使用AUTOSAR BLOKSET进行AUTOSAR架构的应用层软件开发。使用自定向下的开发模式的话,直接导入各个SWC的ARXML文件,生成模型进行应用层软件的开发。使用MBD的开发模式,模型配置,代码生成配置,模型验证配置也需要熟练掌握。

Vector系列工具:

  CANoe可以进行多ECU仿真分析,CAN报文纳秒级的分析,实车数据录制,在分析问题的时候,几乎无可替代。

  CANape完成标定功能。

  CANlalyzer是CANoe的简化版。

3.2 硬件平台

  现在行业内都在鼓吹软件定义汽车,其实某种程度上来看硬件才是定义汽车的基础。强大计算力的GPU才能支持复杂计算的自动驾驶,车载以太网的量产才能使SOA落地。而硬件中的核心就是MCU/CPU。每款芯片都会有自己IP核(ARM,PowerPc,X86)和指令集,围绕IP核各大厂商就会集成自己的外围设备生产特定功能用途的芯片(S32K, RH850等)。我们学习硬件平台需要了解从板子上电后从哪里运行第一条指令?在跑到main函数前我们的CPU到底做了哪些准备工作?这些准备工作是必须的吗?我们在项目开发过程中会去修改这些地方吗,如何修改?连接器脚本到底是怎么回事?这些都需要我们去探索实践发现。

3.3 基础知识

  《程序员的自我修养》中说到:CPU体系结构,汇编,C语言(包括C++)和操作系统,永远都是编程大师们的护身法宝,就如同少林寺的《易筋经》,是最为上乘的武功;学会了《易筋经》,你将无所不能。可见基础的重要性。

  基础不牢,地动山摇。没有遇到问题前,可能都用不到,但是一旦发生问题了,好的基础知识就能帮你快速的定位问题。

  基础牢固,学习新东西要快的多。如果你熟悉C++,学习Python基础简直就是砍瓜切菜一般。

  何谓基础,有的前辈说每个行业的基础不一样,我们不讨论这个问题。我们将讨论如何巩固学习基础知识并用于实际项目。

  C/C++,嵌入式行业的产品基本都是这C/C++写的,必须精通,这个精通包括语法知识的深入理解以及常用C/C++程序框架和技巧的熟练掌握。

  OS操作系统,一般包括实时操作系统(RTA_OS)和非实时操作系统(Linux)。对于实时操作系统如RTA_OS,我们需要深入理解实时操作系统的调度机制、优先级实时响应机制、多核多任务间数据一致性、RTA_OS的Autosar概念的具体实现。对于非实时系统如Linux,我们起码要深入理解几个常见驱动框架(IIC, Uart, Spi)的具体实现。

  计算机组成原理,汽车电子或者说嵌入式产品本身即是一个微型计算机,由存储单元,计算单元,传感器/执行器单元等物理器件构成。怎么理解这些物理器件间的功能区分又紧密合作就需要计算器组成原理来支撑。

  算法与数据结构,复杂的树或者图数据结构用的很少,但常用的栈和队列以及链表在工作中用的很多,设计到一些策略实现的时候机会用得上。如果要分享OS的源码,数据结构和面向对象的编程思想必须数量掌握。

3.4 工作生活

  梦想还是要有的,一直追求工作就是工作,生活就是生活,但随着生活角色的变化以及工作中承担的任务越来越重,二者完全解耦还是挺困难的。

我可以分享我们从初入职场的战战兢兢到面对问题后的宠辱不惊这一路成长的心路历程。

生活中角色的变化,怎么和工作达成最好的平衡?

何谓成长?跳入坑中叫挫折,爬出坑来叫成长。

新入公司,该怎么奠定江湖地位?

上面的每一句话都是亲身经历后思考的问题,后辈可以参考避坑,资深全当扯蛋瞎聊。

3. 我们是谁

  投身于新能源汽车软件行业的打工人,正在开发汽车域控制器。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/209724.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

NSDT场景编辑器实现真数字孪生

在线工具推荐: 三维数字孪生场景工具 - GLTF/GLB在线编辑器 - Three.js AI自动纹理化开发 - YOLO 虚幻合成数据生成器 - 3D模型在线转换 - 3D模型预览图生成服务 1、什么是数字孪生? 数字孪生是资产或系统的实时虚拟模型,它使用来自连…

用c语言自己实现qsort和冒泡排序

目录:1:冒泡排序 2:库函数qsort冒泡排序 3:库函数qsort排序结构体 4:自己实现qsort 1:冒泡排序 冒泡排序:的英文 Bubble Sort ,是一种最基础的 交换排序 。 之所以叫做冒泡排序,因为每一个元素都可以像小气泡一样,根…

MSSQL注入

目录 基本的UNION注入: 错误基于的注入: 时间基于的盲注入: 堆叠查询: 理解MSSQL注入是学习网络安全的一部分,前提是您在合法、授权的环境中进行,用于了解如何保护您的应用程序免受此类攻击。以下是有关…

Vue3中props传参(多种数据类型传参方式)

在Vue3中,props接收的type类型有以下几种: 1. String:字符串类型 2. Number:数字类型 3. Boolean:布尔类型 4. Array:数组类型 5. Object:对象类型 6. Date:日期类型 7. Func…

【数据结构】循环链表和双向链表

【循环链表】 (有头结点) pR1->next; R1->nextR2->next->next; free(R2->next); R2->nextp; 例&#xff1a;对于两个单循环链表a&#xff0c;b&#xff0c;将其连接起来&#xff0c;变成一个单循环链表 #include<stdio.h> #include<stdlib.h> …

深度学习早停机制(Early Stopping)与早退机制(Early exiting)

早停机制&#xff0c;一种机器学习模型调优策略&#xff0c;提升调优效率 下图损失值明显经过了欠拟合到过拟合 使用早停机制后&#xff0c;模型不再过拟合 模型早停是面向模型训练过程的。而在模型内部&#xff0c;也会出现类似的现象&#xff0c;这一现象被叫做过度思考(Ove…

Android 获取应用签名

Android 获取应用签名 本文主要讲下在android中如何获取应用签名. 也方便平时用来区分一个应用是不是原包应用. 1: 通过PackageManager获取签名信息 首先,通过packageManager获取到指定应用的PackageInfo. 这里需要传入的flag是PackageManager.GET_SIGNATURES /*** {link P…

Linux破解用户密码【基于redhat9】

Linux破解用户密码【基于redhat9】 操作步骤&#xff1a; 重启虚拟机&#xff0c;选择第二行&#xff0c;按下e键在倒数第二行的末尾加入 rd.break,按下ctrlx键&#xff0c;进入终端界面重新挂载/sysroot为读写切换到bash修改用户密码创建 /.autorelabel 文件使SELinux安全策略…

仿真的整体框架和类图设计

之前的写的模拟代码没有模块&#xff0c;没有对象&#xff0c;写的逻辑结构也很混乱。我花了些时间进行整理&#xff0c;首先所有的类如下图 在管理类中有统一的管理类的接口 &#xff0c;提供所有管理类的虚拟初始化和关闭方法 然后事件的管理类 我希望在这个类中管理所有的脉…

canvas基础:渲染文本

canvas实例应用100 专栏提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。 canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重要的帮助。 文章目录 示例…

操作系统-文件管理

文件的属性 文件名&#xff1a;由创建文件的用户决定文件名&#xff0c;主要说为了方便用户找到文件&#xff0c;同一个目录下不允许有重名文件。 标识符&#xff1a;一个系统内的各文件标识符唯一&#xff0c;对用户来说毫无可读性&#xff0c;因此标识符只是操作系统用于区分…

解决dom4j新增xml节点自动加上xmlns=““的问题

文章目录 问题发生问题原因技术积累问题解决实战演示写在最后 问题发生 有pom.xml文件A&#xff0c;有符合pom.xm格式的l字符串B&#xff1b; 字符串B通过DocumentHelper.parseText(str)转成xml文件&#xff1b; pom.xml文件A通过add(node)方法添加第二步转换完后的pom.xml文件…

微信小程序 内置地图及打开外部地图导航

1. 微信小程序 内置地图及打开外部地图导航 1.1 说明 用户点击通过目的地经纬度打开地图展示坐标点&#xff0c;然后可以选择外部安装的地图app进行导航搜索。    scale“4” 缩放比例&#xff0c;缩放级别&#xff0c;取值范围为3-20。 1.2. wxml代码 <button type&qu…

C++利剑string类(详解)

前言&#xff1a;大家都知道在C语言里面的有 char 类型&#xff0c;我接下来要讲的 string 类功能是使用 char 类型写的类&#xff0c;当然这个是C官方写的&#xff0c;接下来我们将会学会使用它&#xff0c;我们会发现原来 char 这种类型是还能这么好用&#xff0c;授人以…

Flutter学习(七)GetX offAllNamed使用的问题

背景 使用GetX开发应用的时候&#xff0c;也可能有人调用过offAllNamed&#xff0c;会发现所有controller的都被销毁了 环境 win10 getx 4.6.5 as 4 现象 从A页面&#xff0c;跳转到B页面&#xff0c;然后调用offAllNamed进行回到A页面&#xff0c;观察controller声明周期…

Python程序员入门指南:学习时间和方法

文章目录 标题Python程序员入门指南&#xff1a;学习时间、方法和就业前景学习方法建议学习时间 标题 Python程序员入门指南&#xff1a;学习时间、方法和就业前景 Python是一种流行的编程语言&#xff0c;它具有简洁、易读和灵活的特点。Python可以用于多种领域&#xff0c;如…

CentOS或RHEL安装code-server(vscode-web)

下载rpm安装包 网络下载或者下载到本地再上传到服务器&#xff0c;点击访问国内下载地址&#xff0c;不需要积分curl -fOL https://github.com/coder/code-server/releases/download/v4.19.1/code-server-4.19.1-amd64.rpm安装 rpm -i code-server-4.19.1-amd64.rpm关闭和禁用…

IP地理定位技术的服务内容详解

IP地理定位技术是一种通过IP地址确定设备或用户地理位置的技术&#xff0c;广泛应用于广告定向、网络安全、位置服务等领域。本文将深入探讨IP地理定位技术的服务内容&#xff0c;解析其在不同场景中提供的多种服务。 1. 准确的地理位置信息提供&#xff1a; IP地理定位技术的…

CGAL中2D三角剖分的数据结构

1、定义 三角剖分数据结构是一种设计用于处理二维三角剖分表示的数据结构。三角剖分数据结构的概念主要是设计用作CGAL2D三角剖分类的数据结构&#xff0c;这些类是嵌入平面中的三角剖分。然而&#xff0c;这个概念似乎更一般&#xff0c;可以用于任何可定向的无边界三角剖分曲…

6.1810: Operating System Engineering <Lab2 syscall: System calls>

课程链接&#xff1a;6.1810 / Fall 2023 一、本节任务 二、要点 操作系统要满足三要素&#xff1a;并发、隔离、交互&#xff08;multiplexing, isolation, and interaction&#xff09;。 宏内核&#xff08;monolithic kernel&#xff09;&#xff1a;是操作系统核心架构…