车载基础知识







车载技术基础
更偏向软件方面
- 自动驾驶:这个领域涉及到开发和集成自动驾驶技术,包括传感器融合、决策算法、控制策略等,以实现车辆的自主导航和操作。
- 智能座舱:智能座舱是指车辆内部的智能化系统,包括信息娱乐系统、驾驶员监控系统、乘客交互界面等,旨在提升驾驶体验和安全性。
- SOA和软总线:SOA(面向服务的架构)是一种软件设计模式,软总线则可能指的是软件定义的通信总线,这些技术有助于实现车辆内部不同系统之间的高效通信和集成。
- 网络产品:这可能涉及到车辆的网络连接解决方案,包括车联网(V2X)、车载信息娱乐系统的网络服务等,以实现车辆与外部世界的连接。
- 视觉产品:这个领域可能包括车载摄像头系统、图像处理算法等,用于车辆的环境感知、驾驶员监控、乘客识别等功能。
- 车身控制:车身控制涉及到车辆的各种电子控制单元(ECU),如车窗控制、车内照明、车门锁定等,以实现车辆的智能化管理。

汽车业务市场情况可以分为以下三个势力:
- 传统车企:
- 这些是基于原有的燃油车智能化以及转型生产电动车的车企。它们通常拥有悠久的历史和深厚的技术积累,正在逐步向智能化和电动化转型。图片中列举了包括通用汽车(GM)、奥迪(Audi)、宝马(BMW)、奔驰(Mercedes-Benz)、大众(Volkswagen)、丰田(Toyota)等在内的多家知名传统汽车制造商。
- 新兴造车企业:
- 这些是从特斯拉(Tesla)出现后,特别是国内近几年产生的全新造车企业。它们通常以电动车为主要产品,已经量产了多个车型并且拥有一定的技术积累。图片中提到的新兴造车企业包括特斯拉(Tesla)、Rivian、Lucid、蔚来(NIO)、理想(Li Auto)、小鹏汽车(XPeng Motors)、零跑汽车(Leapmotor)、威马汽车(WM Motor)等。
- 高技术企业:
- 这些是新进入局以及较大可能进入汽车行业的高技术企业。它们可能原本并非汽车制造商,但凭借在高科技领域的技术优势,有潜力进入汽车行业。图片中提到的可能进入汽车行业的高技术企业包括苹果(Apple)、索尼(Sony)、富士康(Foxconn)、小米(Xiaomi)、华为(Huawei)等。

- 主机厂,OEM,车厂:这些词都指的是那些生产和销售汽车的大公司。它们有完整的生产线,可以自己采购各种零部件,然后组装成一辆完整的汽车。就像是汽车界的“大厨”,负责把各种“食材”(零部件)做成一道“大餐”(整车)。比如北京奔驰、上汽乘用车厂、小米汽车这些。
- Tier1(一级供应商):这些公司是直接给主机厂提供零部件或服务的。就像是给“大厨”提供“食材”的供应商。比如安徽智途公司可能会把他们生产的电子控制单元(ECU)卖给江淮乘用车厂,智途就是Tier1供应商;中科创达为通用汽车(GM)开发软件,中科创达也是Tier1供应商。
- Tier2(二级供应商):这些公司是给Tier1供应商提供商品或服务的。就像是给“食材”供应商提供原材料的公司。比如创达南京分公司可能会为安徽智途开发软件,创达就是Tier2供应商。
- ECU(电子控制单元):ECU就像是汽车的“大脑”,负责控制汽车的各种功能。它通过接收各种传感器的数据,来判断汽车的状态,然后指挥汽车的各个部分工作。比如控制发动机的运转、刹车系统的工作等等。

EE架构,全称是电子电气(Electrical/Electronic)架构,是汽车中所有电子和电气系统的框架设计。它定义了车辆内部各个电子控制单元(ECU)的布局、通信方式、功能分配以及它们如何相互作用。EE架构是汽车电子系统的核心,它直接影响到车辆的性能、安全性、舒适性和燃油效率。
随着汽车技术的发展,EE架构也在不断演进,以适应新的功能和需求,比如增加的电子设备、更复杂的传感器系统、车载信息娱乐系统、自动驾驶技术等。EE架构的演进大致可以分为以下几个阶段:
- 分布式架构:
- 在这个阶段,汽车的每个功能都有自己的电子控制单元(ECU)。这些ECU是独立的,通过CAN(控制器局域网)或LIN(局域互联网络)总线通信。
- 每个ECU都有自己的传感器和算法,它们之间的通信不多。
- 这种架构的缺点是布线复杂,需要大量的内部通信,导致成本增加。
- 域集中式架构:
- 这个阶段将汽车的电子部件功能划分为几个域,如动力域、底盘域、座舱域、驾驶域和车身控制域。
- 每个域都有自己的域控制器,域控制器通过CAN或以太网(Ethernet)网络将分散的ECU集中到一起。
- 这种架构的优点是更容易实现OTA(空中下载)升级,提高运算能力,支持更灵活的通信网络,同时对信息安全和功能安全的要求更高。
- 中央集中式架构:
- 在这个阶段,主控制器的运算能力进一步提高,出现了超级电脑的设计。
- 整个系统中复杂的运算功能都集中到一个设备上,这个设备配置有强大的CPU和运算加速器,可以更有效地利用硬件性能。
- 这种架构的优点是简化了布线设计,降低了成本,同时支持软件功能的迭代与扩展。


- SOP:Start of Production的缩写,指的是芯片开始量产的时间。

- 处理器:
- 包括CPU(中央处理器)、GPU(图形处理器)、NPU(神经网络加速器)等,就像是电脑的大脑,负责思考和处理各种信息。
- 处理视频、音频等,就像是电脑处理图片和声音一样。
- 有各种接口,可以连接摄像头、麦克风等设备,就像是电脑的USB接口可以连接鼠标、键盘。
- 存储器:
- RAM(随机访问存储器):就像是电脑的内存,用来临时存放正在处理的数据,断电后数据会消失。
- ROM(只读存储器):包括SSD、Flash、SD卡、硬盘等,用来长期存放数据,断电后数据不会消失。
- 安全和控制系统:
- 就像是电脑的安全软件,负责保护系统安全,防止未经授权的访问。
- 控制电源管理,就像是电脑的电源管理功能,控制电源的开关和分配。
- 通信部分:
- 板子内部通信接口:就像是电脑内部的连接线,用来连接不同的部件。
- 外部通信接口:包括LVDS、USB、CAN、以太网等,用来连接显示屏、摄像头和其他电子控制单元(ECU),就像是电脑连接显示器、打印机等设备。
- 座舱平台需要处理大量的音视频数据,所以接口的带宽(数据传输速度)很高。


音频系统
- 通过板载音频DSP和功放:
- 板载音频DSP(数字信号处理器)就像是音频系统的大脑,负责处理音频信号,比如调整音量、平衡、音效等。
- 功放(功率放大器)则负责将音频信号放大,以便能够驱动扬声器发出声音。
- 在这种连接方式中,音频DSP和功放都集成在同一个电路板上,通过I2S/TDM(一种音频数据传输协议)与SoC(系统级芯片)通信。
- 通过外部音频DSP和功放:
- 在这种方式中,音频DSP和功放是分开的,位于不同的电路板上。
- SoC通过I2S/TDM与外部DSP通信,DSP再通过I2C(一种简单的串行通信协议)与功放通信。
- 这种方式提供了更大的灵活性,因为DSP和功放可以独立选择和更换。
- 通过芯片内部的DSP处理音效:
- 在这种方式中,SoC内部集成了DSP,可以直接处理音频信号。
- 音频信号通过I2S/TDM传输到SoC内部的DSP进行处理,然后通过I2C与音频DAC/ADC(数字模拟转换器/模拟数字转换器)通信,最后通过内部功放输出到扬声器。
- 这种方式简化了系统设计,因为所有功能都集成在SoC内部。
自动驾驶

要认真对待


故障分析






根本原因分析(RCA)是一种结构化的问题解决方法,旨在通过识别、分析和解决根本原因来防止问题再次发生。该方法具有三个主要优点:能够明确问题定义,清晰地识别和说明问题的因果关系,以及有效定位问题的真正根源。实施RCA的基本步骤包括:首先把握现状,识别和澄清问题;其次进行原因调查,探究为何问题未被及时发现;然后进行问题纠正,采取措施处理导致问题的根本原因;最后是再发防止,通过改进措施确保问题不会重复发生。此外,该方法还包括对问题发生的不同层面进行分析,从直接原因到根本原因,以及制定相应的对策来防止问题再次流出。
开发环境之——git与repo的使用<1>

版本控制系统是一种用于记录文件内容变化并帮助实现版本控制的系统,它可以让用户在未来查阅特定版本的修订情况。根据其架构和工作方式,版本控制系统可以分为三种类型:本地版本控制系统(RCS),集中式版本控制系统(如CVS、SVN、Perforce),以及分布式版本控制系统(如Git、Mercurial、Bazaar、Darcs、BitKeeper)。这些系统帮助团队有效地管理代码和文档的变更历史,确保项目的协作和版本追踪。

分布式版本控制系统是一种允许每个用户计算机上都保存有完整的版本历史记录的系统,它不依赖于中央服务器来存储所有的版本信息。在这种系统中,每个用户的计算机(如Computer A和Computer B)都可以独立地保存文件的所有版本,包括版本1、版本2和版本3。这样的设计提高了系统的灵活性和容错性,因为即使中央服务器出现问题,各个用户的计算机上仍然可以访问到完整的版本历史。此外,这种系统还支持用户在没有网络连接的情况下工作,并且可以在任何时候与其他用户的版本进行合并和同步,从而促进了协作和版本控制的效率。

Git是一个由Linus Torvalds在2005年开发的分布式版本控制系统,旨在支持Linux kernel项目。它允许用户在本地计算机上建立一个空目录,并从远程服务器同步一个或多个项目的内容,每个工作目录都是项目的完整拷贝,包含全部的版本历史信息。使用Git时,用户可以在不需要联网的情况下查看文件的变化和进行提交操作,这使得Git非常适合分布式协作和版本控制。
git不需要联网
Git 作为一个分布式版本控制系统,其设计允许用户在本地进行大部分的操作,这意味着在很多情况下,确实不需要联网。用户可以在本地仓库中进行文件的版本控制操作,如提交(commit)、查看历史记录(log)、分支(branch)和合并(merge)等,这些操作都不需要网络连接。
然而,Git 的强大之处也在于它支持远程仓库的管理。当你需要与他人协作或者将你的代码推送(push)到远程仓库(如GitHub、GitLab等),或者从远程仓库拉取(pull)最新的代码时,就需要联网。此外,一些Git命令,如克隆(clone)一个远程仓库,或者与远程仓库进行交互的命令(如fetch、pull、push),也需要网络连接。



为什么使用git
Git是一个高效且设计简单的分布式版本控制系统,它能够支持大规模项目如Linux内核的开发,允许上千个并行开发的分支。Git的一个显著特点是它直接快照文件系统的状态,而不是比较文件差异,这样可以更高效地管理版本。几乎所有的操作都可以在本地执行,不需要联网,这使得Git在本地磁盘上保存着所有有关当前项目的历史更新。Git还通过计算内容的校验和(checksum)来保持数据的完整性,确保数据的唯一标识和索引。此外,Git的多数操作仅涉及将数据添加到数据库,这进一步增强了其性能和可靠性。这些特性使得Git成为现代软件开发中不可或缺的工具。

git的三种状态、3个工作区域
Git通过三种状态和三个工作区域来管理文件和项目版本。三种状态包括:已提交(committed),表示文件已经被安全地保存在本地数据库中;已修改(modified),表示文件自上次提交后已经发生了变化,但还没有保存到数据库;已暂存(staged),表示文件的当前修改已被标记,准备在下一次提交时保存到数据库。
三个工作区域分别是:本地数据目录,即项目的完整历史记录;工作目录,即项目文件的当前工作副本;暂存区域,即索引文件,用于暂存下次提交要保存的文件列表。
Git的工作流程通常包括以下步骤:首先从本地数据目录检出项目到工作目录,然后在工作目录中对文件进行修改,接着将修改后的文件暂存,最后将暂存的文件提交到本地数据目录,完成一次版本更新。这个过程确保了文件的变更被有序地管理和记录,便于后续的版本控制和协作开发。

在Git中,分支是指项目的不同开发版本,它们共享一个共同的历史记录,但每个分支可以独立地发展自己的历史。分支的创建总是从某个已有的提交(通常是主分支)开始,然后从那个点分叉出去,形成新的发展路径。这种机制允许开发者在不影响主分支的情况下进行实验性开发或修复bug。图中展示了项目的原始开发线(Original line of development),以及从这条线上分出的三个分支(1st branch、2nd branch、3rd branch),每个分支都代表了项目的一个不同发展方向。通过这种方式,Git支持并行开发和灵活的项目管理。


Git中的分支机制允许开发者从项目的任何提交点创建新的分支,每个分支都代表项目的一个独立开发路径。分支的创建和销毁成本非常低,这使得它们非常适合用于实验性开发、特性开发或修复bug等任务。
在Git中,每个提交(commit)都可以建立分支,这意味着开发者可以从项目的任何历史点分叉出新的开发线。分支的创建是通过指向提交的可变指针来实现的,这些指针可以移动到不同的提交,从而形成不同的开发路径。每个分支都有自己的历史,但它们可以共享共同的提交历史。
图中展示了Git分支的工作原理:
- 第一张图展示了一个项目的提交历史,其中包含了多个分支(如master、testing、1st branch、2nd branch、3rd branch)。每个分支都从某个提交点开始,然后发展自己的历史。
- 第二张图展示了从master分支创建新分支的过程。每个提交(如f30ab、34ac2、98ca9)都可以作为新分支的起点,新分支可以独立地进行开发,而不会影响其他分支。

使用例子
在Git中,分支的使用允许开发者在不影响主分支的情况下处理不同的开发任务。例如,在正常开发过程中,如果需要解决一个特定的问题(如问题#53),但又不能干扰主分支,可以创建一个新的分支专门用于这个问题的修复。在这个新分支上,开发者可以提交修复代码,而主分支则可以继续其正常的开发流程。
当紧急修复完成时,可以通过合并操作将这个分支的更改整合回主分支。这种策略不仅提高了开发效率,还确保了主分支的稳定性。通过这种方式,Git的分支机制支持并行开发和灵活的问题处理,使得项目管理更加高效和有序。
GIT分支合并及冲突解决
Git分支合并
分支合并是Git中一个非常常见的操作,它允许开发者将一个分支的更改整合到另一个分支中。这通常发生在开发新功能或修复问题时,开发者会在一个单独的分支上进行工作,然后将这些更改合并回主分支(如main或master)。
使用git merge命令
最直接的分支合并方式是使用git merge命令。假设你有两个分支:main和feature,你在feature分支上开发了一些新功能,现在想要将这些更改合并到main分支。首先,你需要切换到main分支,使用命令git checkout main。然后,执行git merge feature,Git会尝试将feature分支的更改合并到main分支。如果合并过程中没有冲突,Git会自动完成合并,并创建一个新的合并提交。这个合并提交会记录两个分支的合并历史,使得代码的变更过程更加清晰。
使用git rebase命令
除了git merge,git rebase也是一种常用的分支合并方式。git rebase的作用是将当前分支的更改重新应用到另一个分支的顶部。例如,如果你希望让feature分支的更改基于main分支的最新状态,可以执行git rebase main。这样,feature分支的提交会重新应用到main分支的最新提交之后。这种方式可以使feature分支的提交历史更加清晰,避免了复杂的合并提交。在完成rebase之后,你可以使用git merge将feature分支合并到main分支,或者直接将feature分支的更改推送到远程仓库(如果feature分支已经推送到远程仓库)。
Git冲突解决
尽管Git在合并分支时会尽量自动处理更改,但当多个分支对同一部分代码进行了不同的更改时,合并过程中可能会出现冲突。冲突需要手动解决,以下是解决冲突的详细步骤:
查看冲突
当合并分支时,如果出现冲突,Git会在冲突的文件中标记冲突的内容。冲突的文件中会包含如下标记:<<<<<<<表示当前分支的更改,=======是分隔符,表示冲突的分界点,>>>>>>>表示另一个分支的更改。例如,冲突的代码可能看起来像这样:
plaintext
复制
1 | <<<<<<< HEAD |
你可以使用git status命令查看哪些文件存在冲突。Git会明确指出哪些文件需要解决冲突。
手动解决冲突
解决冲突通常需要手动编辑冲突的文件。打开冲突的文件,根据实际情况选择保留、修改或删除冲突的内容。例如,如果决定保留当前分支的更改,则删除=======和>>>>>>>之间的内容,以及<<<<<<<和=======之间的标记。如果决定采用另一个分支的更改,则删除<<<<<<<和=======之间的内容,以及=======和>>>>>>>之间的标记。当然,也可以根据需要对代码进行修改,以整合两个分支的更改。
标记冲突解决
在解决冲突后,需要使用git add <file>命令将冲突的文件标记为已解决。这一步非常重要,因为Git需要知道冲突已经被处理。之后,执行git commit命令完成合并提交。如果你使用的是git rebase,在解决冲突后,还需要执行git rebase --continue继续rebase过程。
使用工具辅助解决冲突
Git支持使用图形化工具来解决冲突,这可以大大简化冲突解决的过程。例如,你可以使用git mergetool命令,Git会自动启动配置的合并工具(如meld、kdiff3等)。在工具中,你可以直观地比较和选择保留或修改冲突的内容。工具会自动将解决后的文件标记为已解决,从而避免了手动编辑文件和标记解决的繁琐过程。
通过以上方法,你可以有效地进行Git分支合并和冲突解决,从而更好地管理代码版本。分支合并和冲突解决是团队协作开发中不可或缺的部分,掌握这些技能可以帮助你更高效地进行代码管理和协作

Repo工具确实是专门为Android操作系统设计的,用于管理多个Git仓库。以下是Repo工具的一些关键信息和用途:
- 多仓库管理:Repo是一个基于Python的脚本工具,它封装了多条Git命令,帮助开发者管理Android源码中的多个Git仓库。这对于大型项目和团队协作尤为重要。
- 初始化和同步:使用
repo init命令初始化项目,该命令会读取一个叫做manifest的XML配置文件,定义了项目中需要的Git仓库和版本。repo sync命令用于同步代码,克隆或更新项目中所有Git仓库。 - 分支操作:
repo start <branch_name> --all命令用于在所有仓库中创建新的本地分支,便于跨模块开发。 - 代码审查:
repo upload命令将本地提交推送到代码审核平台(如Gerrit),自动关联多个子仓库的变更,确保依赖关系正确。 - 清单文件(Manifest):Repo使用清单文件定义所有子仓库的版本、分支和依赖关系,简化了开发者的代码同步、提交和代码审核流程。
- 与Gerrit集成:Repo与Gerrit代码审核系统集成,简化了代码审核和合并流程。
- 解决冲突:Repo工具提供了解决冲突的场景,如本地代码过期、跨仓库依赖冲突等。
- 下载和安装:Repo工具可以从官方的Git仓库下载,并且可以通过简单的命令添加到系统的PATH变量中,以便在终端中使用。
git常用命令

克隆远程现有仓库:
repository_ur是远程仓库地址
1 | git clone <repository_url> |

Jenkins、Opengrok、JIRA的使用
1. JIRA
- 功能:项目管理和问题跟踪工具。
- 嵌入式开发中的作用:
- 管理需求、任务和缺陷。
- 跟踪硬件和软件开发进度。
- 支持敏捷开发流程。
2. Jenkins
- 功能:持续集成(CI)和持续部署(CD)工具。
- 嵌入式开发中的作用:
- 自动化构建和测试嵌入式软件。
- 确保代码更新后符合质量标准。
- 提高开发效率和交付速度。
3. OpenGrok
- 功能:代码搜索和交叉引用工具。
- 嵌入式开发中的作用:
- 快速查找和理解复杂代码。
- 提供代码版本历史信息。
- 帮助开发人员定位问题。
总结
- JIRA 用于项目管理和问题跟踪。
- Jenkins 用于自动化构建和测试。
- OpenGrok 用于代码搜索和理解。 这三种工具在嵌入式开发中可以相互配合,提升开发效率和产品质量。


