K4-06 控制器非易失存储设计:学习值、诊断数据与累计量的持久化
课程代码 K4-06 · 板块 K 控制、软件与标定 / 嵌入式软件与开发 时长 约 3.5~4.0 小时(8 讲) 前置 K4-01 热管理嵌入式软件架构与 AUTOSAR 基础;K5-01 OBD/UDS 诊断与故障码(DTC)设计;体系外前置(需自备):嵌入式 C 基础,以及车规非易失存储器件(Flash/EEPROM)的读写与擦除基本概念 本讲义定位 讲师授课蓝本 / 学员自学讲义,是 K4-06 大纲的完整展开版
按任务导航
| 你手上的事 | 直接看 | 还要配 |
|---|---|---|
| 审一份别人写的非易失存储方案 | 第 8 讲:评审检查单与九份证据的对应表——每条结论都要指向产生它的那一份证据 | 第 3 讲(写序:数据先写、回读校验、有效标志最后落,这是评审第一个要看的地方) |
| 判某个学习值该不该持久化、换件后还能不能沿用 | 第 4 讲:「存/不存/存但只当趋势基线」三档表,每档两侧失效模式都写出来;换件按「这个值描述的是哪一件的属性」判 | 第 1 讲(先判它丢了之后车上能不能自己重建) |
| 给一台域控写一份 NVM 数据字典并定块类型 | 第 1 讲:要保全的六类对象与规格四问,八列不许留空 | 第 2 讲(块级设计表与字典逐行对齐)+ 第 6 讲(双副本容量翻倍,进配额账) |
| 核下电写窗口排不排得下 | 第 3 讲:由 t_hold ≥ N_shut × t_wr_max + t_ovh 反解下电写清单的块数上界 | 第 7 讲(把量挪到运行期写不是免费的,回头就吃第 2 讲的耐久预算) |
| 定售后换件与产线写入之后的复位路径 | 第 5 讲:复位对应表——哪个块、复位成什么值、走 0x2E 还是 0x31、复位要不要留痕 | 第 4 讲(校验链第 ⑤ 级:零件号绑定的交叉一致校验) |
⛔ 本课不覆盖:
【栏一 · 不讲哪些题目】基础软件分层与存储栈的 CPU/RAM/Flash 开销核算 → K4-01 热管理嵌入式软件架构与 AUTOSAR 基础;故障码语义、去抖与老化、冻结帧字段、诊断报文结构与会话权限 → K5-01 OBD/UDS 诊断与故障码(DTC)设计;下线工位清单与售后权限分级 → K6-09 产线下线与售后标定:工位项清单、配置写入与学习值管理;标定量规格与 default 那一格填什么值 → K6-10 标定量规格定义:轴点、插值/外插保护、上下限与不可标量(本课只管这个值在存储层的载体与回退路径);学习逻辑本身与写入频次判定准则 → K7-03 数据驱动的能效自学习控制;刷写事务、A/B 分区与失败回滚 → K7-02 软件定义热管理与 OTA 迭代;车队回流的信号表与抓帧规则 → K7-04 车队数据回流的车端实现:信号表定义、事件抓帧与带宽/存储预算;控制器电源与复位时序 → K2-01 热管理控制器(域控/ECU)硬件架构,整车电源模式与 run-on 编排 → K3-11 热管理域的上下电时序、run-on 编排与休眠期能耗预算;Secure Boot/HSM 意义上的安全存储 → K2-04 网络安全与 OTA 安全基础;离线标定参数集与发布件管理 → K6-05 标定数据管理与版本控制 / K4-04 软件版本、配置与变量管理;软件安全定级与流程 → K2-03 功能安全(ISO 26262)在热管理中的应用。
【栏二 · ⛔ 真正不给的数】① 未取得原文的标准条款限值与等级号:非易失存储器件擦写耐久与数据保持的试验方法标准族——本项目对该族标准禁止自动取用、本课未核过原文 ⇒ 一个标准号、一个试验条件(温度、循环定义、判定准则)、一个等级号都不写 → 去向是所选器件规格书及其引用的原文,版次以现行目录为准;诊断服务标准族、功能安全标准族、OBD 相关法规对故障码与就绪状态跨点火保存的要求 → 只写它们各管什么与去向,⛔ 不复述条款、⛔ 不钉死年份。② 本项目自己的验收阈值:各类数据保留期的具体月数(由整车诊断规范与法规适用范围共同定,⛔ 不由本课单值化)、各路客户的容量配额字节数、断电循环试验的循环次数 → 去向是整车诊断规范、本项目可靠性口径与你自己的台架。③ 教学假设之外的具体产品参数:某一颗器件的耐久次数、保持年限、写入时间 → 去向是器件规格书,连它的口径一起要(问卷在第 8 讲)。⚠ 平台相关量(t_hold、t_wr_max、f_write、T_life、SF、T_keep、S_i、n_rec、f_wake 等)不在本栏之列——正文逐个给反算路径、重算触发条件与取值时必须连带记录的口径;其中本课确实未取得可信的公开同口径区间的,逐处写明这一句并给去向,⛔ 不用「取决于平台」混过去。
引言:一份数据值不值得被保护,看的不是它有多重要,而是丢了以后谁能把它变回来
一台热管理域控断电之后,内存清空,下一次上电时它对这辆车的全部记忆,只剩下上一次写进非易失存储里的那几十个块。这几十个块不是一类东西:有产线逐件标定出来、车上再也测不出第二遍的传感器零点补偿,有攒了三年的故障码历史与冻结帧,有售后判执行器到没到寿的唯一客观依据——累计量,也有跑一次寻零就能重建的执行器学习值。它们抢同一块空间、共用同一条写入通路、在同一次掉电里一起冒险。
这门课不讲「怎么调用存储栈的接口」,它讲的是在那几十个块上要做的一串设计决策:谁进去、进哪种块、多久写一次、断电落在写的中间怎么办、上电发现不对怎么办、软件升级或换件之后它还算不算数、以及空间不够时先砍谁。
钉子①:一份数据的写入保护等级,由「丢了之后车上能不能自己重建」决定,⛔ 不由「重不重要」决定。这条判据一出来,排序结果和直觉是反的。执行器学习值天天在用,看起来最重要,可它丢了跑一次寻零就回来;而传感器零点补偿、故障码老化历史、冻结帧、累计量,车上没有任何在线手段能重建它们——丢了只能进服务厂,或者永远丢了。⚠ 这里的「能自恢复」有一个窄口径,全课统一:只看车端在无外部设备介入下能不能重建该值,⛔ 不看重建代价大小、⛔ 不看重建耗时。所以「寻零有撞止点的 NVH 代价」不影响它仍然算可自恢复;而「诊断仪能读出来」根本不是恢复——诊断仪读的正是那份已经丢了的数据。⇒ 顺着这条判据排下去,真正承重的是不可自恢复的那几类,最好的块类型、最稳的介质、最高的下电写位次要先给它们;按「重不重要」排,最好的资源会被送给唯一一类丢了也能自己长回来的数据。第 1 讲把这条判据落成一张可逐行走的表,第 2、6 讲照它排块类型与容量配额优先级。
钉子②:掉电一致性不是「加一个校验码」,而是一条写序不变量。校验码只能告诉你「这一块坏了」,它给不出一份可用的旧值——而车下一秒就要用那个值去开阀、去判故障。真正成立的最小方案是三件一起:A/B 两份交替写 + 校验码 + 有效标志(或写完成序号),而它全部的效力来自顺序:先写非活动那一份的数据 → 回读校验 → 最后一步才落有效标志;上电时取「有效且序号最新」的那一份。顺序一颠倒(先置标志再写数据),整套机制就退化成装饰品:断电落在中间时,系统会把一份写了一半的块当成有效的。⇒ 判据因此只有一句,它也是本课的验收口径:任何时刻断电,上电后都能找到一份完整可信的新值或旧值,⛔ 绝不允许出现半新半旧却被当成有效。第 3 讲把它展开成三个失效窗口、下电写窗口的反解式与断电循环试验的判据,第 4 讲把它接成上电的五级校验链。
最容易被读反的一条,先在这里点破:「值不落非易失存储就是缺陷,上电重学是将就。」⛔ 方向恰好反了。本课程体系里 C2-03 风门驱动电机与执行器(步进/有刷/PWM)选型 与 G4-01 电子膨胀阀(EXV)结构、控制与选型 都把上电自学习列为推荐做法,G4-01 电子膨胀阀(EXV)结构、控制与选型 逐字写明持久化只能降低归零频次、不能免除归零。持久化真正的作用,是把寻零从「每次上电必做」降级为条件触发(长时下电、丢步嫌疑、合法性校验不过、累计行程或换向超阈),外加提供一条老化趋势基线;它换来的是省掉顶止点撞击的 NVH(机构根因与治法见 C2-11 空调箱 NVH:风噪/风门异响/鼓风机噪声/再生噪声)与上电行程时间,代价是凭空多出两类新失效:写坏了没发现,以及换件之后沿用了旧件的补偿量。
读反之后你会做的错误动作非常具体:把一切学习量都塞进非易失存储。三个后果按顺序找上门——写入频次吃光轮转池,第 2 讲那条寿命预算算不过;下电写清单排不进电源保持时间,第 3 讲的不等式超时,集成末期以「关机超时」的形态爆掉;换件后沿用旧阀补偿量,把全开度区间的流量标定整体偏置(G4-01 电子膨胀阀(EXV)结构、控制与选型 已点名此失效),而且它不报码,只以「换了件反而更差」的形态出现。⇒ 正确的交付物是一张逐量判「存/不存/存但只当趋势基线」的表,两侧失效模式各写一栏,⛔ 不是一条通用结论。第三档最常被漏掉,而它恰恰是很多学习量的正确答案。
★ 第二条同样常被读反的:「校验失败就整块清零最安全。」清零看起来干净,可清掉的正是那几类无法重建的诊断历史与累计量——等于把证据抹了,而故障还在。读反之后的错误动作是把「整块清零」写进校验失败分支,于是每一次随机掉电写中断,都静默带走一代诊断历史;写中断概率低,但它按点火次数累积,成批车辆一起变成售后眼里「干净的车」。正确处置是第 4 讲的三件套:装载安全默认值(⛔ 不是零)+ 置一个能分辨「数据损坏」与「从未写过」的故障码 + 给出触发重学或重标定的条件。
本课的射程:只管车上自己产生、且必须活过下一次上电的那些数据。判据是自产还是库发,⛔ 与它存在哪块存储器里无关——可执行代码、离线标定参数集、变型编码、发布件校验和都是库里发下来的受控件,归 K4-04 软件版本、配置与变量管理 与 K6-05 标定数据管理与版本控制,哪怕它们和车端自产数据落在同一颗器件、甚至同一片 Flash 上。本课交的是十项东西:数据分类与保护等级、介质与块类型选型、写入寿命预算、掉电写一致性与下电写窗口、上电校验链与回退、布局版本与迁移、换件复位对应表、容量配额与保留期结构、休眠期留存预算、器件参数的索取与验证方法。⛔ 不交的那些以及它们各自的去向,已经列在上面「本课不覆盖」里,全课口径一致,同一件事不会在两处给不同去向。
⚠ 还有一件要先说清楚,免得读到一半误会:本课几乎不给具体数值。耐久次数、保持年限、写入时间、保持时间、频次、容量——它们要么由所选器件的规格书给出(且必须连同它的试验条件一起记录,否则两个厂家的数根本不能比),要么由本平台的电路与配置决定、只能实测。本课交的是怎么问、怎么核、拿到之后怎么反算:五条反算链、三条结构性判据、一份索取问卷、一份必测项清单。⛔ 把这件事读成「这门课回避了问题」是另一种误读——一个没有口径的裸数抄进设计说明,比没有数更危险。全课凡出现的演算数值,一律当场标注「教学假设,不对应任何平台」。
八讲的路线:第 1 讲划管辖边界、列出要保全的六类对象并按可自恢复性排出保护等级;第 2 讲选介质与块类型,用写入寿命预算式 N_req = f_write × T_life ≤ N_end × n_rot / SF 核到整车寿命,算不过给四条改法;第 3 讲处理掉电那一刻——三个失效窗口、写序不变量、下电写窗口的反解与无预警断电的兜底;第 4 讲处理上电那一刻——五级校验链、失败三件套、以及「该不该存」和「换件能不能沿用」两张权衡表;第 5 讲把视角拉到整个生命周期:布局版本号与迁移规则、售后换件的复位路径、产线写入、以及必须暴露成可读 DID 的那些状态;第 6 讲算两本谁都不认领的账——五路客户抢同一块空间的容量配额,以及保留期、条目上限与计数溢出语义;第 7 讲把数据按形态落到三种写入时机(运行期节流写、下电序列写、休眠期唤醒写)并定丢失窗口;第 8 讲收口到可移交的三件产物:器件参数索取问卷、必测项清单、评审检查单。⇒ 从第 1 讲那张数据字典开始,后面每一讲都在往它上面加列——它是全课唯一的行索引,任何一张表里出现了字典里没有的块,或者字典里有一行在某张表里找不到,都是这门课要你在交稿前自己关上的门。
第 1 讲 车端运行期数据分类与保全需求:先划清「谁的数据」
这一讲只做一件事:把本课的管辖对象划出来,并把它排出保护等级。后面七讲选介质、选块类型、算写入寿命、设计写序、定校验链、分容量配额,输入全部来自这一讲交出的那张表——这一讲少填一列,后面每一步都要回头补问。
本讲的符号与口径约定:本讲不引入任何符号,所有量都用中文名指称;涉及次数、时间、频次、容量的符号从第 2 讲起逐个给出定义与单位。本讲凡说「更新频次」,一律指对同一个逻辑块的写请求节奏,⛔ 不指物理扇区被擦除的节奏——两者的换算关系在第 2 讲给出,混用会把磨损均衡的收益重复算一次。
1.1 管辖判据一句话,且与存储器位置无关
判据:这份值是库里发下来的(随发布件、随标定包进车),还是车上运行时自己算出来的?
前者——可执行代码、离线标定参数集、变型编码、发布件校验和——归 K4-04 软件版本、配置与变量管理 与 K6-05 标定数据管理与版本控制,本课一字不讲。后者——车端运行期自己产生、且必须活过下一次上电的数据——才是本课的对象。
为什么判据只能是来源:两类数据的责任人、变更路径与版本控制方式完全不同。标定量是受控件:有发布流程、有版本号、可回滚,改它要走变更评审;车端自产数据没有发布流程,它不是被「发布」出来的,而是车自己长出来的,因此它只有两种命运——迁移或清除,没有第三种。把这两类混为一谈,最典型的后果是给自产数据配上了发布件的版本号语义,于是软件改版而数据结构没改时,触发一次没有必要的全量迁移;反过来结构改了而版本号没动时,「结构变了而数据还在」这一整类失效完全不可检出(第 5 讲展开)。
为什么不能按存放位置划:在一台热管理域控上,两类数据往往落在同一颗器件、甚至同一片 Flash 上——代码区、标定区、数据区常常紧挨着;一颗外挂 EEPROM 里可能既放产线写入的变型配置字,又放车端自产的运行累计量。⇒ 按「在哪块芯片上」划界,必然划错。
⚠ 另一个同样常见的错法是按改动大不大划(「反正这个值很少变,就当标定量管」)。变不变是频次,不是来源;一生只写一次的产线标定基准仍然是车端写进去的东西,它的清除权限、校验失败处置、布局版本归属全部按本课的规矩走。
⇒ 今天就能用的一个动作:打开你们控制器现有的非易失数据配置表,逐行只问这一句「这个值是谁产生的」。凡答案是「车上自己算的」的行,都要在这一讲收尾时具备完整的八列规格(见 1.5)。
1.2 六类清单,每类三列
一台热管理域控(管压缩机、电子膨胀阀、多通阀、若干电子水泵、若干风门执行器、一批温度与压力传感器)上,要非易失保全的东西分六类。每类必填更新频次、丢失后果、恢复手段三列——这三列是后面选介质、选块类型、定保护等级、分容量配额的全部输入。
| # | 类别 | 典型条目 | 更新频次 | 丢失后果 | 恢复手段 |
|---|---|---|---|---|---|
| ① | 执行器学习值 | 电子膨胀阀归零步数、风门止点、多通阀端点 | 每次寻零后/每次下电 | 下次上电须重做寻零,付出 NVH 与上电行程时间 | 车上可自恢复:跑一次寻零 |
| ② | 传感器零点补偿与在线校零结果 | 压力传感器零点偏差、阀零点偏差补偿量 | 产线一生一次 + 条件满足时在线校零 | 全量程测量整体偏置,控制精度整体劣化 | 不可自恢复:须进服务厂重标定 |
| ③ | DTC 老化计数与 pending/confirmed/history 状态 | 状态位、老化与自愈计数 | 每次判据翻转(事件) | 诊断历史永久丢失,售后读到一台「干净的车」 | 不可恢复 |
| ④ | 冻结帧与扩展数据记录 | 故障瞬间的工况快照、发生次数、里程 | 每次首次置码(事件) | 现场证据丢失,只能等下次复现 | 不可恢复 |
| ⑤ | 累计量 | 运行小时、执行器动作与换向次数、能量累计 | 事件驱动,节流后落到较低节奏 | 售后失去判执行器是否到寿的客观量,索赔失据 | 不可恢复:计数不能倒推 |
| ⑥ | 用户记忆项与 EOL 写入项 | 用户记忆:上次设定温度/风量;EOL 写入项:变型配置字 · 零件号 · 标定基准 · 首次学习值 | 用户操作时/产线一生一次 | 体验降级;配置字或零件号丢失则整车功能配置与后续校验全部失据 | 用户项可由用户重设;EOL 项须产线或授权售后重写 |
⛔ 第 ⑥ 类里的 EOL 写入项必须逐项写全四项:变型配置字、零件号、标定基准、首次学习值。这不是凑数——K6-09 产线下线与售后标定:工位项清单、配置写入与学习值管理 的下线工位清单是按这四项接本课的,漏掉第四项,产线就少了一件该在下线时写进去的东西,而这个缺口要到售后才以「新车某个学习量从未被初始化」的形态冒出来。
⚠ 第 ⑥ 类内部还必须再拆一次:用户记忆项与 EOL 写入项不是同一种东西。前者用户随时可重设、丢了只是体验问题;后者只有产线或授权售后能写,丢了要走服务流程补。把两者当成同一类处理,最省事的实现会给它们同一套清除权限——于是要么用户动作能改到配置字,要么用户自己的偏好也需要授权才能改。
工程量级:六类在一台热管理域控上通常落成十几到几十个逻辑块(典型量级,⛔ 不是验收依据;本项目的真实行数由你自己的数据字典逐条列出来定)。更新频次的跨度从「一生一次」到「每个控制循环」,跨了好几个量级;具体频次属平台相关量,本课不给数、给的是拿到它的路——在台架上用总线工具记一轮完整驾驶循环的写请求数折算,或从各块的写触发条件反推(第 7 讲给写入时机表)。
1.3 第 ⑦ 类:本课增补,以及承重的到底是哪几类
先说增补。沿上面六类逐条数,有三样东西整类不会出现,而它们实实在在占非易失容量、实实在在有写入频次:
- 事件留痕记录——补液、换液、维修、刷写这类事件的时间戳与标识。K5-06 冷却液流量的在线估计与流量/内漏类故障诊断 要求「事件必须留痕」才能把观测到的偏差与事件对齐,没有留痕,一次维修之后的基线跳变就分不清是衰减还是人动过。
- 车队数据回流的环形抓帧缓存——K7-04 车队数据回流的车端实现:信号表定义、事件抓帧与带宽/存储预算 的信号表与事件抓帧落在车端的那一份。
- 休眠期按节拍采到的低频长时样本——K5-06 冷却液流量的在线估计与流量/内漏类故障诊断 的停机温漂类观测;它既不在下电写窗口里、也不在运行期写里,是第三种写入时机(第 7 讲展开)。
⇒ 本课把这三样合并为第 ⑦ 类:事件留痕与车队回流缓存(含休眠期低频采样),本课增补。⛔ 六类骨架不动,本课不把标题改成「七类」——下游 K6-09 产线下线与售后标定:工位项清单、配置写入与学习值管理 是按「六类车端自产数据」引用这一讲的,改骨架会让它的引用落空。
⚠ 最常见的误处置是把第 ⑦ 类并进第 ④ 类冻结帧。两者长得像(都是一段工况快照),但:冻结帧是诊断语义下的故障快照、由 DTC 置位触发、字段由 K5-01 OBD/UDS 诊断与故障码(DTC)设计 定;回流缓存是数据业务的样本、由采样与事件规则触发、字段由 K7-04 车队数据回流的车端实现:信号表定义、事件抓帧与带宽/存储预算 定。两者的清除权限与保留期都不一样——并进去之后,一次「清除故障码」会把数据业务的样本一起抹掉。
再说排序。保护等级按一条判据排,只有一条:
丢了之后,车上在无外部设备介入的条件下,能不能把它重建出来?
⚠ 这条判据只看能不能,⛔ 不看重建代价大小、⛔ 不看重建耗时。跑一次寻零要撞顶止点、有「咔」的一声、要花上电的那几秒——但它算可自恢复。必须进服务厂才能重做的,才算不可自恢复。
按这条判据排下来,结果和直觉相反:承重的是第 ②③④⑤ 四类(以及增补的第 ⑦ 类),⛔ 不是第 ① 类学习值。
- ② 传感器零点补偿由装配公差与批次散差决定,只能产线逐件标定测出,车上没有任何在线手段能重建;
- ③ 老化历史与 ④ 冻结帧一旦清零即永久丢失,它们是历史,不是状态;
- ⑤ 累计量是售后判执行器是否到寿的唯一客观量,计数不能倒推;
- 而 ① 执行器学习值,跑一次寻零就回来了。
为什么非要把这条判据摆在前面:直觉会把学习值排在最前——因为它天天在用、天天在变、出问题最直观。于是最稳的介质、最好的块类型、最靠前的下电写位次,全给了唯一那一类可以自恢复的数据;而真正不可重建的那几类,配了单副本、排在下电写清单末尾、掉电时第一个被丢。这个错不会在功能测试里暴露,它随点火次数累积,等到成批车辆的诊断历史为空才被发现。
⚠ 这条判据有两个方向的读错,两边都要点出来:
- 把「重建代价大」读成「不可自恢复」——寻零有 NVH 代价,但仍是可自恢复;照这个读法排,学习值又被排回最前,等于白排一次。
- 把「反正能读出来」读成「可恢复」——诊断仪读出来的正是那份已经丢了的数据;读取不是重建。
⇒ 今天就能用的一个动作:拿你手上的块清单,给每一行只填一个「是/否」——车上能不能无外部设备重建它。填完之后,所有「否」的行在第 2 讲一律配双副本块类型、在第 3 讲一律排进下电写清单的前列、在第 6 讲一律优先分配容量配额。这个「是/否」列就是全课的保护等级,后面不再另立一套。
1.4 更新频次决定载体,⛔ 不是反过来
把六类+增补类逐条按频次归档,只有四档:每控制循环 / 每次事件 / 每次下电 / 一生一次。
每个控制循环都在变的瞬时量根本不该进非易失存储。缓变量(自适应增益、设定点偏置、老化补偿)只在收敛之后或下电序列里写。理由在第 2 讲会变成一道算术题:载体是被频次选出来的,高频写必须先节流、再谈磨损均衡,否则一个块会独吞整个扇区轮转池,把同池邻居的均衡收益一起吃掉。
⚠ 两个方向的错法:
- 先选介质再想频次(「反正这颗器件耐久高,随便写」)——耐久是分母,频次是分子,先定分母不会让分子变小;而且耐久数值一律以所选器件规格书为准,本课不给(口径见 1.6)。
- 把「下电写」当成唯一路径——K7-03 数据驱动的能效自学习控制 已点名:无预警断电时下电序列根本不执行。把所有写都推到下电,等于把这些量在瞬断、保险丝跳、碰撞断电与看门狗复位这四条路径上全部放弃(第 3 讲给兜底)。
⚠ 写入频次的判定准则本身归 K7-03 数据驱动的能效自学习控制(它交出三个写入触发点:收敛后写、下电序列写、分层缓存节流写),本课只接它对存储层的需求,并反解出「这块允许多频」。
频次轴的另一端同样要处置:一生只写一次的 EOL 项,必须与高频块在物理布局上分区。⛔ 不许混在同一个轮转池里。
理由不在软件,在介质:Flash 上的 EEPROM 模拟层,它的扇区轮转与垃圾回收是按池子整体做的——高频块的擦除会把同池内的低频块数据一起搬来搬去。于是那份「一生写一次」的产线标定基准,实际经历了成千上万次搬移,它的保持与耐久账全部作废:你按「写一次」算出来的裕量,从一开始就不成立。
⚠ 最常见的想当然是「反正写的是别的块,不影响我」——垃圾回收搬移的单位是整个扇区,同扇区内的邻居一起被搬。分区的代价是占用额外扇区,这笔账进第 6 讲的容量配额逐笔算。
1.5 规格完整的四个问题
每一份要保全的数据,必须回答四个问题才算规格完整:
- 写入触发条件是什么?
- 丢失后果是什么?
- 上电校验失败时装什么默认值?
- 谁有权清除?(产线/授权售后/用户)
四问不是文档格式要求,每一问都有一个具体的下游接收者:触发条件给软件实现;丢失后果给保护等级排序(也就是 1.3 那一列);默认值给第 4 讲的回退分支;清除权限给 K6-09 产线下线与售后标定:工位项清单、配置写入与学习值管理 的工位清单与售后流程。
⇒ 留空的那一问,会在对应的下游以现场问题的形态出现:
| 留空的那一问 | 现场以什么形态出现 |
|---|---|
| ① 写入触发条件 | 实现者按最省事的方式填,通常是「每次变化就写」——直接吃穿第 2 讲的写入寿命预算 |
| ② 丢失后果 | 保护等级排不出来,块类型只能靠猜,于是又回到按「重不重要」排 |
| ③ 校验失败的默认值 | 校验失败时执行的是内存残留值——行为不可预期,且每台车不一样 |
| ④ 清除权限 | 售后现场变成「不知道该不该清」,而这类判断一旦交给现场随意做,历史数据会被成批抹掉 |
⚠ 第 ③ 问有一个几乎人人会踩的填法:填「0」。第 4 讲会逐条证明:零对一个开度量意味着全关、对一个转速量意味着停机、对一个阈值量意味着一直触发或永不触发——三种后果没有一种是中性的。正确的问法不是「零合不合适」,而是「如果这个量在整个生命周期里从来没有被写过,车该怎么表现」。
这一讲的交付物规格:一张 NVM 数据字典,行是逻辑块,八列——数据内容 · 所属类别(①~⑥ 或增补的 ⑦)· 更新频次档位 · 丢失后果 · 车上能否自恢复(是/否) · 写入触发条件 · 上电校验失败处置(默认值) · 清除权限。典型规模是十几到几十行(典型量级,⛔ 不是验收依据)。评审判据只有一条,且可逐行打勾:八列里有没有留空的格。这张字典是后面四张表(第 2 讲的块级设计表、第 5 讲的迁移规则表与复位对应表、第 6 讲的配额表)共同的行索引——⛔ 不许出现只在其中一张表里的块。
1.6 本课的数字口径:先立在前面
这门课最容易被当成「查表课」——读者翻到某一页,把讲义里的数抄进设计说明。而这门课涉及的数几乎全是器件手册值与平台标定值,抄错的代价要到耐久试验末期或售后才显形。⇒ 口径先立在这里,全课统一。
(a) 给准确值的,只有两组,且各自写明出处:
- 统一诊断服务的服务标识:0x22(读数据)、0x2E(写数据)、0x31(例程控制)。它们出自统一诊断服务标准族(ISO 14229-1)。版次一律以现行版本目录为准,引用前须核;⛔ 本课不复述任何条款内容与报文结构——报文结构、会话控制与权限分级归 K5-01 OBD/UDS 诊断与故障码(DTC)设计。本项目具体的数据标识符分配以整车诊断规范为准。
- 非易失数据管理层的三种块类型名称:Native / Redundant / Dataset。出自 AUTOSAR Classic Platform 基础软件存储栈规范中的 NVRAM Manager。⛔ 本课不复述配置项条款,具体配置项口径以项目所用平台版本为准。
(b) 只给相对序、⛔ 不给倍数与次数的,有一组:三条介质路线(外部串行 EEPROM > MCU 内部 Data Flash > 程序 Flash 上的 EEPROM 模拟)的耐久相对序。标「典型」,依据是写机制差异(可按字节改写/按扇区擦除且粒度大/与代码区共池且写延迟最长),⛔ 不来自任何厂家数据表。⚠ 换用某一颗具体器件后,这个序可能不成立,必须按各自规格书重排。
(c) 平台相关量,本课交反算路径与重算条件,⛔ 不交数:电源保持时间、单块最坏写入时间、各块写入频次、整车寿命折算的通电运行时长、可用非易失容量与各路配额、环形记录的条数与单条大小、各类数据的保留期、休眠期唤醒节拍。
⚠ 这些量本课未取得可信的公开同口径区间——这是判定,不是回避,理由逐条写在它出现的那一讲里:有的是各平台差异大到任何一个区间都会被当成验收线(保持时间、写时间),有的是它的主标准族本项目禁止自动取用且厂家数据表不可复述(耐久、保持年限),有的是由法规适用范围与整车诊断规范共同决定、由一门课单值化会让读者把教学数当法规结论用(保留期月数)。⇒ 对每一个这样的量,本课交三段:怎么反算它 · 为什么这里不给带 · 什么时候必须重算。
(d) 教学假设值:第 2、3 讲用于演示两条反算链的那组自洽数值,每一处出现时都当场逐字标注「教学假设,⛔ 不对应任何平台」。事后没有人分得出哪个数是假设,所以标注只能在写下它的那一刻做。
(e) 本课明写不做的一件事:⛔ 本课不复述任何非易失存储器擦写耐久与数据保持试验方法标准族的条款、限值、试验条件与等级号,一条都不复述。该标准族本项目禁止自动取用,本课未核过原文 ⇒ 按「未独立核对过原文的条款只写去向、不写内容」处理:写明「所选车规 Flash/EEPROM 器件规格书会引用一族这样的试验方法标准,本课所有耐久与保持数值一律以规格书为准,具体标准号与版本按现行目录核,引用前须自行核对原文」。同理,OBD 相关法规对故障码状态与就绪状态跨点火周期保存的要求、以及 ISO 26262-6 对安全相关数据完整性与失效处理的要求,本课只写去向:写明存在这样一类要求、它影响本课的哪一件事,⛔ 不给条款号、⛔ 不给条数与月数、⛔ 不单值化版次与日期。
⚠ 最后一条最容易被读成「这门课回避了问题」。正确读法是第 8 讲:既然数不能从这里抄,本课交的就是怎么问、怎么核、拿到之后怎么用——向谁要哪几个参数、每个参数必须连什么口径一起要、拿到之后怎么反算本平台的写入预算、哪几个数必须实测而不能抄手册。那是一份可交付、可评审的东西,⛔ 不是缺一块。
1.7 边界:本课交什么、不交什么、不交的去哪
这门课是被别的课前指最多的课之一。边界写不齐会出现两种坏结果:读者跑去别处要一件本课该给的东西,或者本课重讲了别人的内容。⇒ 一次说清,全课口径统一,同一件事⛔ 不在两处给不同去向。
本课交这些:
- 数据分类与保护等级(本讲);
- 介质与块类型选型、写入寿命预算(第 2 讲);
- 掉电写一致性的写序不变量与下电写窗口核算(第 3 讲);
- 上电校验链与失效回退,以及「该不该存」的逐量权衡(第 4 讲);
- 布局版本、迁移规则、售后换件的复位对应表、应暴露的可读状态清单(第 5 讲);
- 容量配额分账、保留期结构与计数溢出语义(第 6 讲);
- 数据形态、三种写入时机与写节流、休眠期留存预算(第 7 讲);
- 向器件供应商索取参数的方法与验证证据链(第 8 讲)。
本课不交这些,去这里拿:
| 不归本课的 | 去哪 |
|---|---|
| 基础软件分层与存储栈的资源开销核算 | K4-01 热管理嵌入式软件架构与 AUTOSAR 基础(本课只把数据侧需求量交过去:块数、块大小、校验方式、下电写清单长度) |
| DTC 语义、冻结帧字段定义、事件记录条数的诊断侧定义;诊断报文结构、会话与权限机制 | K5-01 OBD/UDS 诊断与故障码(DTC)设计(本课只接它的字段清单去算单条记录大小) |
| 下线工位清单与售后权限 | K6-09 产线下线与售后标定:工位项清单、配置写入与学习值管理(本课只出「哪个块、清成什么值、清完之后哪些量必须重新产生」) |
| 标定量规格,以及规格表里默认值那一格填什么值 | K6-10 标定量规格定义:轴点、插值/外插保护、上下限与不可标量(本课管这个值在存储层的载体实现与回退路径,两者同源但管的不是同一段) |
| 学习逻辑本身与写入频次判定准则 | K7-03 数据驱动的能效自学习控制(本课只接它对存储层的需求) |
| 刷写事务、A/B 分区与回滚流程 | K7-02 软件定义热管理与 OTA 迭代(本课只管它对数据侧的约束) |
| 车队回流的信号表与抓帧规则 | K7-04 车队数据回流的车端实现:信号表定义、事件抓帧与带宽/存储预算(本课只接字段清单去算容量) |
| 控制器电源与复位时序 | K2-01 热管理控制器(域控/ECU)硬件架构(本课只提需求) |
| 整车电源模式与下电保活编排 | K3-11 热管理域的上下电时序、run-on 编排与休眠期能耗预算(本课只提需求) |
| 安全启动与硬件安全模块意义上的「安全存储」 | K2-04 网络安全与 OTA 安全基础(与本课的「非易失存储」不是同一件事) |
| 离线标定参数集、发布件版本与校验和 | K6-05 标定数据管理与版本控制 与 K4-04 软件版本、配置与变量管理(见 1.1 的管辖判据) |
⚠ 写边界时最容易犯的错,是只写了一串「⛔ 不归本课」而没写「那么本课交什么」。负向边界必须配正向交付物——上面两张单子是成对的,删掉任何一张,这一节就变成了推诿。
后面还有 7 讲正文 · 关键公式 · 案例拆解 · 常见误区 · 动手做