1. 从“会调配置”到“懂BSW”:这份开发笔记要解决什么问题
入行Autosar BSW开发这几年,我最深的感受是:资料并不少,但大多要么是标准文档那种“每个字都认识、连起来不知道说什么”的风格,要么是供应商工具的操作截图流水账。真正从工程师视角出发,把“为什么要这么配”“出了问题怎么查”讲清楚的实战笔记,太稀缺了。
这份开发笔记的定位,就是填补这个空缺。它不是标准规范的中文翻译,也不是某个配置工具的用户手册,而是一套围绕实际项目落地整理的开发手记。核心围绕的是BSW(Basic Software,基础软件层)——也就是Autosar分层架构里,位于RTE(运行时环境)之下、MCAL(微控制器抽象层)之上的那层软件。它直接和硬件打交道,承上启下,是整车电子系统里最“硬核”的部分之一。
如果你正处于这几个阶段,这份笔记应该能帮到你:
- 刚入行做Autosar配置开发,每天都在跟DaVinci Configurator、EB tresos之类的工具较劲,想知道这些配置项背后到底对应什么。
- 在做具体模块(比如CAN通信、网络管理、OS)时遇到问题,需要一份能定位问题、讲清原理的排查思路。
- 准备系统化梳理BSW知识体系,但面对AUTOSAR规范文档觉得无从下手,需要一条有逻辑的学习路径。
我整理这份笔记的时候,刻意避开了“像文档一样面面俱到”的写法,而是挑那些日常开发中真正绕不开的知识点,配合项目里踩过的坑来讲。下面就把这份笔记的核心架构和内容重点拆开,一篇篇说清楚。
2. 先建立全局认知:Autosar分层架构与BSW的边界感
2.1 三层架构里,BSW到底站在哪
很多人一开始学Autosar,容易一头扎进某个模块(比如CanIf)的细节里,结果越学越乱。我的建议是:先花时间把三层架构图刻进脑子里,再往下钻。
标准的分层是:最上层是Application Layer(应用层),中间是RTE,最下面是BSW。BSW本身又往下拆成四层:Services Layer(服务层)、ECU Abstraction Layer(ECU抽象层)、MCAL(微控制器抽象层),以及最底下的复杂驱动器(Complex Drivers)。另外还有个独立于分层之外的ECU Configuration部分,负责管理整个ECU的配置数据。
用生活里的事来类比:应用层是“点外卖的人”,RTE是“外卖平台”,BSW是“骑手和商家”,MCAL是“骑手手里的电动车”。你点外卖不需要关心电动车怎么充电,就像应用层不需要关心CAN控制器寄存器怎么操作。但电动车出毛病,外卖就送不到——这就是BSW的职责所在。
分层带来的最大好处是解耦。应用层的代码理论上可以不用关心硬件平台,换了个MCU,应用代码几乎不用动,只要重新配置和生成底层的BSW/MCAL就行。这也是OEM(整车厂)和Tier1(供应商)能分工协作的基础。
2.2 BSW内部四层各管什么事
这四层并不是随便分的,每一层的职责边界非常清楚:
- MCAL:直接操作寄存器的那一层。包括MCU、GPT(定时器)、PORT、DIO、ADC、PWM、SPI、CAN等驱动。它把硬件能力封装成标准接口。
- ECU抽象层:把“芯片相关”的东西变成“ECU相关”的东西。举个例子,同样的CAN收发器,不同硬件方案接的引脚可能不同,ECU抽象层把这些差异消化掉,向上提供统一的通道管理(CanIf、EthIf等)。
- 服务层:提供系统级、通信级、诊断级的基础服务。包括OS(操作系统)、EcuM(ECU管理)、BswM(BSW模式管理)、Com(通信)、Nm(网络管理)、Dem(诊断事件管理)、Dcm(诊断通信管理)等。
- 复杂驱动:处理那些标准模块覆盖不了的特殊功能,比如某些特定的Bootloader、非标通信协议等。
刚开始接触这些层的时候,我建议画一张自己项目的模块清单:用到的每个模块属于哪一层、上层是谁、下层是谁、依赖关系是什么。这张图比看十遍PPT都管用。
3. 工具链与配置流程:DaVinci之外的完整拼图
3.1 配置工具只是起点,不是全部
很多初学者会以为Autosar开发就是“用DaVinci把模块勾一勾,生成代码,然后交差”。这其实是个很大的误区。工具生成的代码确实是基础,但项目里真正花时间的往往是配置校验、集成、调试和问题定位。
一套典型的BSW开发工具链包括:
- 配置工具:比如Vector的DaVinci Configurator Pro、EB的tresos。它们负责图形化配置模块参数,生成配置描述文件(ARXML)和部分代码。
- 代码生成器:比如DaVinci Developer(主要针对RTE和SWC)、EB generate。有些和配置工具是一体的,有些是分开的。
- 编译器/调试器:比如Tasking、Green Hills、IAR,配合调试器(Lauterbach Trace32、PLS UDE等)。
- 验证工具:比如CANoe用于总线仿真和测试、UDE用于Flash调试、各种静态分析工具。
配置工具生成的代码一般是“框架代码”,真正业务相关的逻辑(比如COM回调里做什么、NM状态机里怎么处理网络请求)通常还是要手写。这也就是为什么“会配置”不等于“会开发”。
3.2 从ARXML到可运行代码:一条完整的配置流水线
如果你第一次从头开始配一个ECU的BSW,大致会走这么几步(以CAN通信为例):
- 收集需求:CAN通道数量、波特率、报文列表(PDU/Frame)、网络管理策略、诊断需求等。
- 配置MCAL:先配好MCU、PORT、DIO这些基础驱动,确保时钟和引脚没问题。
- 配置通信硬件抽象:配置Can控制器、Can收发器(CanTrcv),让底层通路调通。
- 配置CanIf:把上层和底层“绑定”起来,定义PDU到Frame的映射,设置回调函数。
- 配置Com:定义信号/PDU的收发属性、超时检测、信号更新机制。
- 配置Nm和BswM:定义网络状态机、睡眠/唤醒策略。
- 生成代码并集成:导入工程,把生成的代码和手写代码编译链接起来。
- 测试验证:用CANoe发送报文验证收发路径,检查超时、唤醒、诊断等功能。
每一步之间都有依赖。比如Com配置的时候,如果引用了CanIf里不存在的PDU,校验阶段就会报错。这类问题占了开发前期排查的大头。
3.3 关于ECUC模块,聊点内行才关心的事
ECUC(ECU Configuration)在整个配置体系里是个很特殊的模块。很多人忽略它的重要性,其实它是整个配置参数集的“根”。
ECUC负责管理所有模块的配置容器(Container)、参数定义(Parameter Definition)和配置结构。每个模块的ARXML配置数据,最终都要挂到ECUC的命名空间下。它更像是一个“元配置”,定义了其他模块可以被配置成什么样。
在工具里操作的时候,ECUC的很多参数看起来抽象,比如EcucConfigSet、EcucModuleConfiguration这些概念。它们其实对应的是ARXML文件里的数据结构。理解ECUC,对你解读ARXML文件、做配置对比和迁移会非常有帮助。
有一个实际经验:当你在不同版本的配置工具之间迁移项目时,ECUC版本的兼容性问题最让人头疼。旧工具生成的项目文件,新工具打开时可能会因为ECUC版本不匹配导致校验失败,要仔细看迁移日志,而不是盲目点“Generate”。
4. 核心模块深入拆解:CAN通信栈、OS与网络管理
4.1 CanIf:CAN通信的“交通警察”
CanIf(CAN Interface)是CAN通信栈里承上启下的模块。举个具体例子:应用层要发一条报文,数据流是这样的——应用层把信号写到Com,Com按PDU组织好数据,然后调用CanIf的发送接口,CanIf再调用CanDrv(Can驱动)的硬件发送接口。接收方向则正好反过来:CAN中断触发CanDrv接收,把数据交给CanIf,CanIf再通过RxIndication回调通知Com。
刚上手的时候最容易混淆的是PDU和Frame的关系。一辆车上,一个CAN Frame(帧)里经常打包多个PDU(协议数据单元),比如一个0x100的Frame里可能同时包含了车速信号和发动机转速信号。Com层关注的是PDU,CanIf关注的是PDU和Frame的映射关系,而CanDrv关注的是CAN ID和数据的收发。三层各干各的,不要混在一起理解。
配置CanIf时,有几个参数需要特别注意:
CanIfTxConfirmationPdu:发送确认回调。如果没配置好,发送报文后上层收不到确认,会导致Com层状态不对。CanIfRxIndicationPdu:接收指示回调。配置错了会导致收不到数据。CanIfPublicTxProcessing:发送处理机制,是立即发送还是队列发送,直接影响发送时序。
实际调试中,如果报文发不出去,我一般按这个顺序查:先看CanDrv能不能正常收发(这是最底层),再看CanIf的路由是否配好,最后看Com层的信号映射。从下往上查,比从上往下猜效率高得多。
4.2 CanTrcv与CanSM:通信的“电力系统”
CanTrcv(CAN收发器驱动)和CanSM(CAN状态管理器)经常被放在一起说,因为它们共同管理CAN总线的物理层状态。
收发器就像通信系统的“电力系统”。它负责把数字信号转换成总线上的差分信号,同时管理着总线的睡眠和唤醒。在低功耗场景下,收发器能不能被唤醒、能不能进睡眠,直接关系到整车的静态电流是否合格。
CanSM则负责管理CAN通信的模式状态机,包括:
- Full Communication:正常通信模式。
- Silent Communication:静默模式,能接收但不能发送。
- No Communication:停止通信。
一个非常典型的应用场景是网络管理:当整车进入休眠流程时,CanSM会按照BswM的请求,让CanIf停止发送报文,CanTrcv进入睡眠模式。如果这个状态机转换处理不好,就可能出现“总线一直沉睡不了”或者“该发报文的时候发不出去”的问题。
这里有个项目里遇到的经典故障:某个节点在收到网络管理Sleep命令后,总线电流还是偏高。排查发现CanTrcv虽然进了Sleep,但Can控制器还在正常运行,处于一种“假休眠”状态。后来通过在CanSM的状态转换回调里显式关闭Can控制器,才解决了问题。
4.3 AUTOSAR OS:任务的命脉和调度的规则
AUTOSAR OS是BSW里的“心脏”,它管着所有任务的调度和时间行为。它基于OSEK/VDX扩展而来,几个核心概念必须吃透:
- Task(任务):分基础任务(Basic Task)和扩展任务(Extended Task),扩展任务可以用
WaitEvent等待事件,基础任务不行。 - Schedule Table(调度表):用于周期性地触发任务,是很多周期性报文发送的时间基准。
- Alarm(闹钟):基于计数器产生时间中断,常用于延时、周期处理。
- Counting Event / Binary Event:任务间通信的简单机制。
- ISR(中断服务例程):在哪个Category(ISR类别)里处理,决定了能否使用OS服务。
配置OS最常遇到的问题就是“任务优先级和周期不当,导致某个任务一直饿死”。AUTOSAR OS的调度默认是优先级抢占式:高优先级任务就绪了,低优先级任务必须让路。如果最高优先级的任务里做了一大堆耗时操作,低优先级任务就永远跑不了。
建议所有刚入门的工程师,配OS的时候先画任务表:优先级从高到低排清楚、周期标记清楚、占用时间估算清楚。尤其注意保护共享资源的场景,比如两个任务都要访问同一个全局变量,要用GetResource/ReleaseResource或者关中断来保护,否则就会出现莫名其妙的“偶发性数据错乱”。
调度表的设计也要小心。它有一个同步机制,如果要和外部时间源同步,需要配置同步帧和偏移量。之前有个项目,调度表启动后,总是差几个毫秒才发报文,客户的总线监控工具总是报“报文周期抖动”。后来发现是调度表偏移量没配,启动时没有对齐到网络时间基准。
4.4 Com与PduR:数据的“快递分拣中心”
Com模块是应用和通信栈之间的数据交换中心。它负责的事包括:
- 把应用层写入的信号打包成PDU,或者把收到的PDU拆成信号给应用层。
- 信号更新机制(如果信号没更新,发出去的是上次的值)。
- 发送时超时监控、接收超时监控。
- PDU组(PDU Group)的管理,用于通信模式的切换。
PduR(PDU Router)则是一个“路由器”,负责把PDU从一个模块路由到另一个模块,比如从Com到Dcm(诊断)、从CanIf到Nm。它管理着“路由路径”,配置里要定义好源和目标模块。
经常有朋友问:Com和PduR不就是一个中间层吗,怎么配置错了就是黑屏或者通信中断?举一个我遇到过的例子:Dcm要给一个ECU做Bootloader,需要走CAN诊断报文,但PduR路由路径里只配了Com到Dcm的路由,没配CanIf到Dcm的“诊断直连”路由,结果Bootloader刷写一直失败。排查到最后才发现是这个路由路径缺失。这类问题,光看工具里的配置界面很难发现,一定要对照“报文走向图”去检查路由配置是否闭环。
4.5 Nm与网络管理:车为什么会“睡不着”
AUTOSAR NM(Network Management)负责协调总线节点的睡眠与唤醒。这里说的不是某个报文某次收发,而是整车层面“大家都安静下来休息”的机制。
AUTOSAR NM的核心是NM报文。每个支持网络管理的节点都会周期性地发送NM报文(通常是特定的CAN ID),NM报文里带有状态位(Repeat Message Request、Sleep Indication等),用来协商网络状态。如果一个节点想睡觉,它会停止发送NM报文,并观察总线上其他节点是否也都沉默了。大家都沉默了,才一起进入睡眠。
理解NM状态机是这块的关键。典型状态包括:
Network Mode(正常通信模式):还细分为Repeat Message状态、Normal Operation状态、Ready Sleep状态。Prepare Bus-Sleep Mode(准备休眠模式):等待一小段延时,确认没被唤醒。Bus-Sleep Mode(总线休眠模式):节点进入低功耗。
实际项目里,网络管理出问题往往表现为:整车不会休眠或者休眠后被意外唤醒。排查思路一般是:抓一下NM报文,看看是不是有节点一直在发NM请求;检查应用层是不是在错误地调用Nm_NetworkRequest;检查Wait Bus-Sleep Time是否配得太短。
自动唤醒的问题比较复杂。常见原因是某个节点还把总线唤醒源开着,比如CanTrcv的中断唤醒功能配置不当,导致总线上一有噪声就认为有唤醒事件。这需要在CanTrcv配置里仔细设定唤醒源的极性、过滤时间等参数。
5. 诊断与功能安全:BSW开发绕不开的两座大山
5.1 Dcm与Dem:让ECU会“说话”和“记病”
现代车载ECU几乎都要支持UDS诊断协议(ISO 14229)。这套逻辑在BSW里主要由Dcm(诊断通信管理)和Dem(诊断事件管理)实现。
Dcm负责接收和处理诊断请求。比如外部诊断仪发来一条0x22(按ID读数据)的请求,Dcm会解析这条请求,转给应用层的相应服务ID回调函数,拿到数据后按协议格式返回。Dcm还支持会话管理(默认会话/扩展会话/编程会话)、安全访问(Security Access)、DTC控制(0x85)等功能。
配置Dcm时,有一个很容易踩的坑:服务ID的路由表和回调函数对应关系没配好。比如0x31(例程控制)配置了支持,但对应的服务ID范围没覆盖到实际用的例程ID,导致诊断仪发读写例程的请求,ECU直接返回NRC(Negative Response Code,否定响应码),也不说为什么。
Dem的角色更像是“病历本”,负责记录故障码事件。一个DTC的产生,需要三个条件:事件发生、测试失败、确认阈值达到。Dem会记录DTC的状态位(当前存在还是历史发生)、老化计数器、快照数据等。
开发和调试验证阶段,我最常用到的两个手段:一是通过诊断仪手动清DTC、读DTC状态,验证Dem的状态机是否正常;二是通过故意触发故障,比如拔掉某个传感器,看DTC能不能在预期的时间内被“确认”。
5.2 功能安全对BSW的影响,比想象中具体
ISO 26262(道路车辆功能安全)不是个“大而空的标准”,它对BSW开发有非常具体的要求。如果你的ECU要达到ASIL B或者ASIL D(比如制动相关的ECU往往是ASIL D),那BSW的关注点和普通ECU会有很大区别。
几个直接的影响体现出来就是:
- 内存保护:需要启动MPU(内存保护单元),防止任务间内存越界。
- 时间监控:OS的看门狗(WdgM)要监控任务的执行时间,超时就要做出反应。
- 分区(Partition):BSW和应用层可能需要分在不同信任域,它们之间的通信要经过特殊机制。
- 安全和释放机制:对OS的启动、关闭流程提出了更高要求,确保即使软件出错,也能进入安全状态。
做过一个线控制动相关的项目,要求满足ASIL D。那段时间,花在功能安全设计文档上的时间比写代码还多。FMEA(失效模式与影响分析)要覆盖到每一个关键模块,比如CanIf的故障会不会导致刹车信号丢失、会不会导致意外加速,都要分析清楚,并设计对应的安全机制。
所以不要觉得功能安全是“流程部门”的事。如果你是BSW工程师,迟早要面对“这个模块怎么证明是安全的”这个问题。提前了解WdgM、EcuM的安全关断路径、内存分区测试方法,对职业发展很有帮助。
6. 实战调试方法论:搞定那些“玄学”问题
6.1 BSW调试的七种武器
BSW开发调试和纯应用层调试差别很大,因为底层东西黑了就是黑了,日志输出不方便,有时候甚至连显示都没有。我调试的时候常用的工具组合:
- Trace32(Lauterbach):看寄存器和内存的利器,能实时追踪任务运行情况。
- CANoe:总线分析和仿真首选,抓报文、发报文、模拟节点状态。
- 逻辑分析仪/示波器:看物理层的电平是否正常,排查硬件问题。
- OS Trace:一些工具支持OS级的事件追踪,能看到任务切换的时间点。
- UDS诊断仪:很多问题通过诊断服务就能快速定位,比如0x22读取内部状态、0x19读取DTC。
- LED/串口打印:条件允许的话,预留几个调试输出口,关键判断点打出来,比什么都实用。
- 静态代码检查工具:比如Polyspace、Coverity,能发现一些潜在的运行时错误。
6.2 从现象到根因:一个典型问题的排查经历
之前在做一个PEPS(无钥匙进入/启动)项目时,遇到过一个折腾很久的课题:某个无钥匙进入功能偶发性失效,大概十次里头有两三次不响应,重启之后又好。这显然不是逻辑层面的“必现问题”,更像是时序、中断或资源冲突。
排查过程是这样的:
- 现象分解:失败发生在遥控钥匙按下到车辆解锁的流程里,但CAN报文是有发出去的,BCM也回了回应,可车身就是没解锁。
- 抓数据:用CANoe把PEPS到BCM的报文都抓到,对比成功和失败的帧时序。发现一个规律:失败的时候,某一条和BCM相关的周期报文刚好也正在发送。
- 初步怀疑:可能是应用层任务和BSW通信任务在访问共享数据时存在竞争,导致解锁信号被旧数据覆盖。
- 深入分析:调出OS任务的调度时间线,发现确实存在任务重叠窗口。应用层在写解锁命令的同时,COM模块正好在读取PDU,而两者之间没有加锁。
- 修复:在应用层写解锁命令的地方加上互斥保护(对应到OS里就是用Resource保护临界区),重新验证,问题不再复现。
这个案例告诉我们,BSW里很多“偶发性问题”,归根到底都是并发控制和资源保护的问题。看现象、抓数据、看时序、找到关键重叠点,这个思路比碰运气式地乱改配置要可靠得多。
6.3 调试阶段检查清单(直接拿去用)
结合之前的项目经验,我整理了一份调试检查清单,遇到问题先过一遍,往往能少走很多弯路:
- 时钟配置是否正确?CAN/SPI/OS定时器外设有没有跑在预期频率上?
- 中断优先级配置是否合理?有没有关键中断被低优先级事件阻塞?
- 任务的栈空间是否足够?有没有出现栈溢出?
- 共享资源是否都做了保护?有没有两个任务同时操作同一变量?
- 报文配置是否和总线矩阵一致?PDU映射是否完整?
- 网络管理状态机是否正确?NM超时时间、重复消息计数是否合理?
- 看门狗是否正常喂?没喂的话是代码死循环还是时序太长?
- 内存分区是否开启?有没有跨越信任域的违规访问?
7. 常见问题速查表:直接对号入座
整理几张速查表,遇到问题先对照一下,比自己瞎猜要快:
| 现象 | 可能原因 | 排查建议 |
|---|---|---|
| CAN报文完全发不出 | CanDrv未初始化、CanIf发送路径配置错误 | 先检查硬件层面能否正常发送,再逐步查上层配置 |
| 报文能发但不能收 | CanIf接收回调缺失、PDU映射错误 | 检查RxIndication配置,用CANoe发报文观察底层是否有数据 |
| 通信进不了正常模式 | Nm状态机未进入Network Mode | 检查NM报文是否正常发送,检查BswM模式请求条件 |
| 偶发报文周期抖动 | 调度表偏移量未配置、任务优先级不当 | 抓取时间线,确认调度表启动时刻和网络时间基准的关系 |
| 整车无法休眠 | 有节点持续请求网络、应用层错误调用NetworkRequest | 抓NM报文,统计所有节点的请求状态 |
| 偶发休眠后自动唤醒 | CanTrcv唤醒源配置不当、总线上有瞬态干扰 | 检查收发器唤醒阈值和过滤时间,必要时加硬件滤波 |
| 诊断请求返回NRC | Dcm服务使能未开启、路由未配置 | 用诊断仪确认具体服务ID和NRC码,对照路由配置表 |
| 某一个DTC一直不能恢复 | Dem确认阈值未达到、测试失败条件持续存在 | 检查DTC相关条件是否被外部因素(如供电)影响 |
再看一个配置常见问题的表:
| 配置问题 | 影响 | 调整建议 |
|---|---|---|
| 任务优先级全一样 | 低优先级任务饿死或高延迟 | 按实时性要求分层,中断类任务放最高级 |
| 信号更新周期过短 | 总线负载偏高、CPU占用异常 | 根据信号实际变化率调整周期 |
| 超时监控时间过短 | 偶发丢包被误判为故障 | 结合总线负载和传输抖动留足余量 |
| 诊断服务ID范围配得过大 | 安全风险、管理负担 | 按诊断需求规范定义服务内容 |
8. 学习路径与笔记之外的建议
8.1 从零开始学BSW,按什么顺序推进
如果你现在还是新手,我按自己的成长经历和带人经验,推荐一套学习路径:
- 建地基:先弄懂Autosar的整体分层架构,理解应用层、RTE、BSW、MCAL之间的关系。能画出框图,知道每个模块大概管什么事就行。
- 聚焦一路径:先选一条最常用的通信路径走通。比如CAN通信路径:信号是怎么从应用层写入、经过Com打包、CanIf路由、最后到CanDrv发出,接收方向又是怎么一路回调上来的。这条路理解了,很多概念就活了。
- 啃配置工具:用DaVinci或者EB,按上面的路径自己动手配一遍。命令行工具能上手就上手,实际效率比界面操作高很多。
- 做一个小项目:比如自己写一个简单的ECU应用,实现周期性发送一条报文,接收一条报文,加一个诊断服务。麻雀虽小,五脏俱全,做一遍比看书有用得多。
- 读完一部规范:不是让你从头读到尾,而是按需求去查。遇到问题去Autosar官网下载对应模块的SWS(Software Specification,软件规范),查具体的API行为、状态机描述。规范虽然是英文且枯燥,但它是唯一确定性的标准,比任何二手资料都可靠。
8.2 那些“没人告诉你但其实很重要”的事
最后分享几个项目经验和职业体会:
- 配置文件的版本管理一定要重视。ARXML的diff/merge是常见操作,但工具的版本差异可能造成不兼容。每次升级配置工具,都要做一次完整的回归测试。
- 保留生成的原始代码,不要随便改生成文件。工具重新生成后,改动会被覆盖。如果不得不在生成代码里改东西,必须做好标记和隔离,尽量通过配置参数实现。
- 多看芯片手册和Datasheet。BSW是贴着芯片的,很多难查的问题,最终都是芯片手册里的某个寄存器位或硬件特性决定了行为。
- 学会读Autosar官方规范和阅读SWS。这是英文阅读能力,也是工程师的核心竞争力。它能让你脱离“看视频、看博客”的依赖,直接从源头获取信息,哪怕是很老的模块,也能自己分析。
8.3 怎么用好这份笔记
回到这份开发笔记本身。我的建议是:不用一口气读完,把它的目录当索引,遇到具体问题了回来翻对应章节。比如你在配Com的时候遇到信号打包不对,就直接去读通信那一节;你要做Bootloader,可以去看看网络管理、诊断和通信栈协同那部分。
我整理笔记的时候,一直提醒自己:不写“正确的废话”,每一条都配上实际场景和操作。这样做的目的只有一个,就是让后来者少走一些我踩过的弯路。这个行业的知识密度确实大,但好在它足够结构化,只要路径清晰、动手充分,成长速度是可以很快的。
根据我个人经验,最好的学习方法是:拿一个真实项目(哪怕是实验室里的开发板)开始试。配置工具、生成代码、调通信、写诊断,完整走一遍。中间遇到的问题,才是你真的学到的东西。纸上得来终觉浅,Autosar这套东西,尤其如此。