尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

从ASW到BSW:BMS工程师必懂的AUTOSAR分层架构

从ASW到BSW:BMS工程师必懂的AUTOSAR分层架构 1. 为什么BMS工程师绕不开AUTOSAR见过不少从MATLAB/Simulink模型起步的BMS工程师一开始接触AUTOSAR都有点抗拒。我自己也是。当时项目组拿到客户的新需求——软件架构必须按照AUTOSAR分层来ASW、RTE、BSW这些词突然铺天盖地地出现在评审会上。我脑子里第一反应是我只要能把SOC、SOH算准把均衡和继电器控制做好不就行了为什么非要套一层这么复杂的“壳”真正改变我看法的是一个下午的联调现场。BMS样件上电以后控制器一直报通信超时但用示波器看CAN波形完全正常报文也在发。最后查下来问题根本不在算法也不在硬件而是BSW层的通信栈配置和ASW侧的任务周期对不上——某个关键的控制信号没有按照预期时间被发送出去。那一刻我意识到如果不懂ASW与BSW的分层逻辑和工作边界你连排查问题的入手点都找不到。1.1 BMS的开发模式正在从“裸机”走向“平台化”传统BMS开发普遍是“一个单片机加一堆驱动库”底层ADC采样自己初始化CAN收发自己写寄存器故障存储直接操作EEPROM应用代码和硬件代码搅在一起。只要换一颗MCU整套软件都要动一遍移植成本极高。但今天OEM和Tier 1的交付要求已经变了很多新项目直接把“符合AUTOSAR架构”写进技术协议里供应商如果没有按标准分层交付验收那关就过不去。AUTOSAR解决的正是这个问题。它把汽车电子软件抽象成一组标准化的层次应用层只做控制逻辑底层驱动由标准化模块接管中间通过RTE通信。BMS作为整车安全件涉及高压采样、绝缘监测、继电器驱动、热管理、整车通信等一大堆功能恰恰是从这个平台化中受益最多的系统之一。因为BMS的硬件平台迭代很快——从分布式采集板到域控集成式方案从单MCU到多核MCU——没有AUTOSAR这种分层每一次硬件升级都是灾难。1.2 “会用”和“懂架构”是两回事很多BMS工程师会用工具比如用Vector的DaVinci或者EB tresos把配置刷一遍生成代码编译烧录能跑起来就觉得完事了。但这属于“会用”。真正遇到问题的时候——为什么这个信号没发出去为什么掉电后NvM里存的数据丢了为什么一个任务把另一个任务饿死了——你如果没有ASW和BSW的底层认知就只能靠猜。举个最常见的例子ASW里写了一个状态机某个状态下要把“允许充电”这个信号置1。但整车端一直收不到或者收到了但值不对。如果你不懂ASW信号是通过RTE映射到BSW的COM模块、再经过PDUR、CAN接口才能变成一帧CAN报文的你就很难判断问题出在RTE的端口映射、COM的信号打包还是PDUR的路由配置。这已经不是“把代码写对”的问题而是“把架构搞清楚”的问题。1.3 哪些人应该重点学习这部分内容我不建议所有人都一头扎进去啃全套规范。优先需要弄懂ASW与BSW的是这几类人第一做BMS应用层算法集成的工程师你需要知道自己的算法如何变成周期任务、如何和底层交互第二做BMS底层软件和MCAL集成的工程师你需要搞清楚BSW模块的依赖关系和配置参数第三做系统测试和整车联调的工程师你要能快速定位故障是出在应用逻辑还是基础软件层。这篇文章就围绕“ASW和BSW到底各自是什么、在BMS场景里怎么配合”来展开。我不会去抄规范文档而是按照实际工程中的理解和踩坑经验来讲。2. AUTOSAR的分层逻辑ASW、RTE、BSW的边界到底在哪AUTOSAR最核心的思想就是“分层”每一层只关心自己的事层与层之间通过标准接口对话。对于BMS工程师来说理解这三个层次就是理解整个架构的地图。2.1 一张图说清AUTOSAR的横向分层从上往下看AUTOSAR经典平台大致分四层应用层ASW、运行时环境RTE、基础软件层BSW、微控制器抽象层MCAL。另外还有复杂驱动CDD这个概念——但先不展开后面会提到。层次包含内容在BMS中的典型对应应用层ASW软件组件SWC、内部行为、可运行实体RunnableSOC/SOH算法、均衡策略、绝缘检测策略、继电器控制逻辑运行时环境RTE通信基础设施、任务实体生成、端口连接数据从电压采集SWC传递到SOC估算SWC服务层BSW上层OS、EcuM、BswM、NvM、Dcm、Dem、Com、PduR等任务调度、故障管理、诊断服务、非易失存储ECU抽象层BSW中层与具体外设无关的抽象驱动接口CAN接口、IO抽象、ADC抽象微控制器抽象层MCAL直接操作寄存器的驱动Port、Dio、Adc、Pwm、Spi、Can驱动ASW的主体是软件组件。你可以把一个SWC理解成一个“带清晰边界的功能模块”比如“SOC估算组件”“单体均衡组件”“绝缘监测组件”。每个SWC内部有若干个Runnable相当于C语言里的函数——但它们的触发方式不是谁调用谁而是由RTE按周期或事件来触发。BSW则是“功能提供方”和“资源管理方”。它不关心你SOC算得准不准它只负责保证每个任务在正确的时间被调度、把CAN报文发出去、把数据存进非易失存储器、对外提供诊断服务。RTE夹在中间角色很特殊。它不是一个常规意义上的“模块”而是为每个ECU自动生成的一段代码层。它的职责是把SWC需要的数据从生产者送达到消费者把Runnable的调用时机和OS任务绑定起来屏蔽应用对BSW的直接访问。换句话说如果ASW是员工BSW是公司的财务和行政那RTE就是OA系统——所有报销单都要通过它流转。2.2 为什么边界划分这么重要很多刚接触AUTOSAR的人会问一个问题既然BSW已经把ADC采样、CAN收发都封装好了那是不是ASW里可以直接调这些函数答案是不行。AUTOSAR架构强制的规则就是ASW不能直接调用BSW的接口必须通过RTE。原因很现实一旦允许ASW直接操作底层那么“应用软件可移植”就变成一句空话。你换了一颗MCU底层驱动变了应用代码里还留着对旧寄存器的直接调用那就又退回传统的嵌入式开发模式了。在BMS项目里这种分离还有一个额外的价值功能安全。BMS通常要求ASIL C甚至ASIL D等级的开发流程。分层架构天然把“安全算法逻辑”和“底层资源管理”隔离每条数据链路、每次任务触发都变得可追溯。审查员问起来“这个保护功能是从哪个Runnable触发的数据从哪里来走了哪条通信路径”——如果你能清晰回答这就是分层架构最大的回报。2.3 复杂驱动CDD的定位实际BMS里总会遇到一些AUTOSAR标准模块覆盖不了的功能比如某些厂家的专用IC温度采样协议、特定AFE芯片的菊花链采集时序。这类驱动如果硬塞进应用层会破坏可移植性如果硬套MCAL标准接口又很别扭。AUTOSAR允许用复杂驱动CDD来承载这部分非标准化的功能。CDD可以直接放在BSW里给上层提供相对标准的接口但内部实现可以保留硬件相关的逻辑。这块我只说一句经验不要轻易把所有不好归类的代码都塞进CDD。CDD用多了架构就退化成一堆“补丁”后续软件升级和维护会很痛苦。能用标准模块解决的尽量用标准模块。3. BSW里BMS工程师必须重点掌握的模块BSW涵盖的模块非常多但它内部的层次结构是清晰的服务层管调度、存储、诊断和通信ECU抽象层管接口统一MCAL管寄存器操作。这里我不打算把几十个模块都过一遍只挑BMS工程师在项目里打交道最多的五个方向。3.1 AUTOSAR OSBMS任务的抢占与调度AUTOSAR OS是BMS软件的“心脏”。BMS里任务天然分轻重缓急单体电压采样、绝缘检测这些涉及安全的计算必须严格按时完成而均衡策略、SOC滤波这类周期性任务可以稍微“让路”。实际项目中你可能需要配置这样几个任务10ms周期任务跑电压电流采样和短路保护判断50ms任务跑绝缘监测状态机100ms任务跑SOC估算500ms任务跑均衡策略。高优先级的任务抢占低优先级任务这是AUTOSAR OS的标准行为。配置OS时最核心的几个参数任务优先级、调度策略抢占或协作、激活次数、周期、以及任务体量。我的建议是在BMS项目中优先采用抢占式调度因为完全依靠协作式调度很难保证极端工况下的保护响应时间。另一个容易踩的坑是优先级反转——高优先级任务等待的共享资源被低优先级任务占着这时候需要配置优先级天花板协议或者立即继承协议。BMS是安全件这类问题必须在设计阶段就规避。3.2 NvM关键时刻的数据居然没存住NvM非易失存储器管理负责管理EEPROM或Flash类存储。BMS里哪些数据需要存SOC初值、SOH衰减因子、故障码和故障冻结帧、标定参数、生产下线信息、累计充放电安时数等。这些数据如果掉电丢了轻则SOC跳变重则影响售后诊断。NvM里有几个概念BMS工程师必须搞清楚NV Block数据块、Block状态、数据校验、以及读/写时机。最常见的错误是NvM写入时机和任务周期不匹配——某段逻辑在正常运行周期里反复触发NvM写操作导致Flash寿命迅速耗尽或者等到下电瞬间才开始写但硬件掉电时间根本不够写完。我建议的做法是分成“正常周期写”和“掉电保护写”两种策略。周期性的SOC初值等数据用比较低的频率比如每30秒一次或者每次值变化超过阈值时写入掉电瞬间的关键数据则由BSW的EcuM接管保证下电时序里预留出足够的时间完成最后一次写操作。不要依赖在应用代码里“最后时刻写NvM”竞争风险太大。3.3 COM与网络管理CAN报文不是你想发就能发COM模块负责信号Signal、PDU协议数据单元和报文Frame之间的映射。ASW里的SOC信号通过RTE传给COMCOM按PDU打包进CAN报文再由PduR、CanIf、CanDriver一层层送到总线。这个链路里任何一层都有可能导致报文发不出去。以BMS和整车控制器VCU的通信为例VCU需要一个10ms周期的“BMS状态报文”里面包含总压、总流、SOC、绝缘电阻等信号。这个信号可能分散在好几个SWC里。配置COM时你需要把这些信号映射到同一个PDU设置好发送周期和触发条件。如果你只把信号映射对了但PDU的传输模式配置成“事件触发”而该信号一直没有变化那整车就收不到报文——这个问题我用“周期性事件触发”的组合模式来解决。再说说网络管理。AUTOSAR网络管理NM负责协调ECU的睡眠和唤醒。BMS这个系统很特殊整车下电后BMS通常还要保持低压供电一段时间确保继电器断开、绝缘检测完成、高压安全监测还在工作。这个“延迟下电”的时序需要和整车网络管理策略对齐。我实际做项目时发现很多下电异常问题根本不是BMS算法逻辑问题而是网络管理状态机和整车的快照唤醒/睡眠时机没配合好。3.4 诊断模块BMS的“病历本”和“体检室”诊断栈在AUTOSAR里的核心模块是Dcm诊断通信管理和Dem诊断事件管理。Dcm负责处理UDS诊断服务比如0x10会话切换、0x22读取标识、0x2E写入数据、0x31例程控制Dem负责管理故障码DTC。BMS的项目中新增一个“过温故障”不是简单地在代码里置一个标志位而是要在Dem里定义好DTC、故障判定条件、降级处理策略和故障存储方式。这块我自己踩过坑早期项目直接在ASW里写了一句“故障标志1”然后就把这个标志变量发给整车。到了台架测试阶段诊断仪读不到任何有效历史故障码售后也查不到故障发生时的环境数据。后来改成按照AUTOSAR诊断事件管理的流程在Dem中注册DTC把故障发生时的电压、电流、温度等上下文数据写进“事件快照数据”。这样才能完整支撑售后诊断和生产下线检测。这里我多说一句BMS的诊断设计应该从项目需求阶段就开始定义而不是最后“补”。哪些故障是DTC哪些只是Debug日志哪些需要在故障消失后保持状态一段时间——这三类处理逻辑完全不一样。3.5 ECUC与工具链配置世界的入口ECUCECU Configuration是AUTOSAR配置参数的统称。无论你用Vector DaVinci Configurator Pro、EB tresos还是其他工具本质上做的都是同一件事描述这颗ECU使用哪些BSW模块每个模块的参数是什么模块之间的依赖关系怎么建立。在BMS项目里用到的最核心ECUC配置点包括MCU时钟树和内核分配、Adc通道与采集通道的映射、PWM通道与主动均衡控制引脚映射、CanController和CanChannel配置、以及OS任务和SWC Runnable之间的映射关系。在配置工具里改一个参数生成的代码行为就可能完全不同。我见过有同事把Adc采样通道顺序配置错了结果所有单体电压全部错位——这种问题如果只看ASW代码永远找不到根因。带着问题去理解ECUC效率会高很多。不要被工具界面里几百个选项吓到你只需要先搞清楚与自己负责模块相关的参数页就够了。4. ASW侧的设计逻辑SWC、端口与Runnable在BMS中的实践很多算法工程师第一次接触ASW时最不适应的就是“代码不再是自己直接写的一个main函数”而是被拆成了一个个带严格接口的软件组件。这需要转变思维。4.1 用SWC重新审视BMS功能架构一个典型的BMS应用层可以拆成这些SWC信号采集SWC负责把ADC采样值、温度通道、电流传感器信号转换成物理量SOC估算SWC包含安时积分、OCV查表、卡尔曼滤波等算法SOH估算SWC管理容量衰减、内阻增长等性能指标均衡控制SWC根据单体电压差异生成均衡策略绝缘检测SWC控制注入信号、读取绝缘电阻值保护逻辑SWC根据关键参数触发故障处理和继电器控制。每个SWC都有自己的独立内存和对外端口内部Runnable就是具体算法函数。你在Simulink里建的模型通过AUTOSAR Blockset或者Embedded Coder生成时可以直接映射成SWC和Runnable——这个流程现在工程师用得很多但前提是你先在工具里把接口定义清楚。4.2 端口与接口数据不是靠全局变量传递的传统嵌入式里模块之间传数据最直接的办法是全局变量。AUTOSAR ASW不允许这样做SWC之间必须通过端口Port和接口Interface通信。接口分成两类发送者-接收者接口Sender-Receiver和客户端-服务端接口Client-Server。前者适合周期性的数据流比如把电压采样结果发给SOC估算组件后者适合请求-响应式操作比如某个组件请求执行一次均衡。在配置工具里建立端口和接口时最需要关注的是“映射”这个动作。RTE会把发送端口的变量值和接收端口的变量值自动对接但这里有个隐藏问题发送方和接收方如果不在同一个任务周期数据可能会被跳变或延迟一拍。你需要在配置时把通信周期、数据接收缓冲策略最近一次值还是排队配置合理。4.3 Runnable的触发方式直接影响BMS时序每个Runnable必须绑定一个触发事件RTE才会在正确的时机调用它。常见的触发类型有周期触发Periodic、事件触发Event、数据接收触发DataReceived、模式切换触发ModeSwitch等。BMS里保护逻辑建议用事件触发而且要绑在高优先级任务上。举个例子绝缘采集SWC检测到绝缘电阻骤降这个事件必须立刻触发继电器保护操作而不是等下一个100ms周期才处理。SOC滤波算法这类低频且计算量大的Runnable放到低优先级周期任务里合适。这里有个我反复强调的观点架构阶段如果不设计好Runnable的触发方式和优先级后期优化只能靠“超频”来补救要么提高任务周期密度要么调整算法效率整个系统变得很难维护。5. 把ASW和BSW拼起来从配置到代码生成的完整流程理解了分层逻辑后最终还是要落实到工程实现。在BMS项目里把ASW和BSW“拼接”起来的工作流是固定的。5.1 使用图形化配置工具定义ECU整体结构拿Vector工具链举例DaVinci Developer用来定义SWC和端口DaVinci Configurator Pro用来配置BSW和生成RTE。EB tresos也是一套高效的BSW配置工具很多国内项目也在用。还有一些OEM会提供自己的流程和模板。配置的顺序我建议从硬件侧向软件侧推进第一步定义MCU时钟、内核、外设资源第二步做MCAL配置Port、Adc、Can、Pwm、Spi等第三步配置BSW服务层OS、NvM、Com、Dcm、Dem、EcuM第四步在ASW侧定义SWC并建立Runnable最后在RTE配置里把SWC的Runnable和OS任务绑定并完成端口的数据映射。实际操作中特别容易出问题的是“通信路径”的定义。AUTOSAR里从ASW信号到CAN报文要经过Signal→PDU→Frame→CanIf→CanDrv一连串映射光这些映射关系在工具里就有好几层树形页面。每个环节的命名规则如果没统一生成代码后调试起来就是一场灾难。我强烈建议项目一开始定义好命名规范和缩写表比如“Sig_SoC_Pct”“Pdu_Bms_Stat_10ms”“Frame_Bms_Stat_10ms”这种清晰的层级命名。5.2 生成RTE与BSW代码配置完成之后工具会生成一组C代码BSW模块代码、MCAL驱动代码、RTE代码。RTE是应用层和基础软件层的“胶水层”它内部包含了所有SWC Runable的调用逻辑、端口数据读写函数和通信接口。一个简单Runnable的生成代码大致长这样/* RTE生成的函数声明示例 */ void Runnable_SOC_Estimation(void) { float32 soc; /* 应用层代码逻辑 */ soc SoC_AlgorithmCore(); /* 通过RTE接口发送给其他SWC */ Rte_Write_SoCOutput_SOC_Value(soc); }你不用手写RTE内部实现工具会处理任务挂接、数据一致性保护、跨核通信这些底层细节。这也是AUTOSAR的价值——把重复性工作自动化让工程师专注在算法和策略上。5.3 最小可运行的BMS AUTOSAR工程如果你是第一次在BMS项目里做AUTOSAR集成我强烈建议别追求“一步到位”。先搭一个最小工程把最简单的链路跑通一个ADC采样SWC采集单体电压→一个RTE路由→一个CAN上报SWC把电压打包发给整车。整个工程只包含必要的MCAL、OS、COM和RTE其他模块先关闭。这样做的三个好处第一你能快速理解工具生成代码、编译、下载、运行的全流程第二可以在最小工程上验证MCU时钟和引脚配置是否正确第三后续每增加一个模块都有清晰的参考基线出了问题能够快速对比。我从实际经验说先跑通最小工程再扩展比直接搭一个Monolithic大工程再调试要省几倍时间。6. 典型BMS场景拆解从单体电压采集到整车报文理论讲了一大堆最终还是要在具体场景里把链路走通。我选三个BMS中最有代表性的场景来拆解。6.1 场景一单体电压采集、SOC估算与上报信号采集SWC里的一个Runnable以10ms周期运行从Adc接口读取AFE芯片经过调理后的单体电压值转换成物理量后通过发送端口发出。RTE把这个数据写入变量然后触发SOC估算SWC的数据接收事件。SOC估算SWC内部一个100ms周期的Runnable启动安时积分和OCV补偿运算把估算结果通过输出端口发送。这个结果经过RTE映射到COM模块COM又把这个信号打包进周期为100ms的CAN报文。整车控制器通过总线解析这个报文显示当前剩余电量。这个链路最常见的排查点就是数据流向。如果整车收到SOC但值一直是0先查SOC估算SWC的输入端口有没有值如果输入没问题再查RTE到COM的信号映射最后看CAN报文是否真实发送。沿着ASW→RTE→BSW这条路径去查比瞎改代码高效得多。6.2 场景二绝缘检测与继电器保护BMS运行时需要周期性检测高压回路对地绝缘电阻。绝缘检测SWC发送一个事件请求采样电路执行一次注入测量然后等待结果。这个场景适合用Client-Server接口——绝缘检测SWC作为客户端调用服务端驱动SWC的“执行绝缘检测并返回电阻值”的接口。如果检测到绝缘电阻低于安全阈值保护逻辑SWC需要立刻断开主继电器。此时我建议设计为两条路径同时触发一条是绝缘检测SWC内部根据电阻值直接置“故障”事件通过RTE同步触发保护Runnable另一条是把绝缘电阻值周期性上传到BSW的Dem记录故障码和当时的总压、温度等环境数据。这样既保证保护动作的时效又保留诊断信息。这里涉及一个重要的调度设计保护Runnable必须绑定在最高优先级的任务上且不能被长时间屏蔽。AUTOSAR OS里的关键路径要设置中断和调度保护防止一个长时间运行的低优先级任务把保护动作卡住。6.3 场景三故障存储与下电时序BMS发生故障后除了实时保护还要把故障信息保存下来。实际项目里故障存储往往不是实时写NvM而是先写到Dem的事件缓存等到合适的时机再进行NvM写操作。如果故障发生瞬间断电则靠EcuM的下电时序处理。我遇到过一个售后问题客户反馈车辆长时间停放后SOC记忆丢失每次重新上电都要重新估算。排查发现是NvM写操作放在正常运行周期里数据块频繁写后来触发写入保护机制有些写被丢弃了。改成在下电流程里集中写一次并在每次正常运行时保留最新数据到RAM缓存中问题才解决。这也是为何AUTOSAR的EcuM和NvM协作机制如此重要。7. 常见误区和实战心得那些“从入门到放弃”的坑最后说说学习这个技术体系最常见的几个坑。很多人都想一步到位搞懂AUTOSAR结果被规范和工具界面劝退这很自然。7.1 误区一把BSW当成普通驱动库来改有一些嵌入式底子不错的工程师看到BSW生成的代码后第一反应是“这代码写得太绕了我直接改一下驱动文件不就行了”。这是很危险的。BSW模块之间有严格的接口依赖你手动改了一处生成的代码下一次可能被覆盖或者导致其他模块接口不一致。正确的做法是所有配置都通过ECUC工具完成代码生成后不要手改生成文件。实在需要定制行为用模块提供的回调接口或者复杂的配置选项去实现。7.2 误区二算法跑得好不等于系统时序好很多算法在离线仿真里完美上车运行后偶发表现不佳。原因经常不是算法本身而是Runnable和任务之间的绑定关系错了。比如你把一个计算量庞大的SOH估算Runnable绑定在10ms任务上这就把系统拖垮了。经验是任务周期只放它该放的东西算不准和算不快是两回事。7.3 学习方法建议从一个小切入口打通全链路如果让我重新学一遍我会选择这样的路径选一个BMS里的最小场景比如单体电压采集并CAN上报先看RTE生成的代码搞懂应用函数是怎么被调用的再回到配置工具里看对应的配置项搞清楚改一个周期、一个端口名生成的代码会发生什么变化最后再逐步引入NvM、诊断、网络管理等模块。别忘了多利用Automotive行业里开源的示例以及工具厂商自带的例程。读规范原文很重要但不是从第一个字开始啃。我通常先看某个具体模块的Overview再看示例工程确定它怎么用起来的然后遇到细节问题再去规范里查精确描述这样“从放弃到入门”的距离会缩短很多。坦白说AUTOSAR这套体系不完美工具链庞杂、学习曲线陡峭但它确实是目前汽车电子软件走向平台化的主流答案。对BMS工程师而言主动去理解ASW与BSW的分层逻辑不是给自己的工作找麻烦而是给未来几年的职业发展换一条更宽的赛道。
返回列表