当前位置: 首页 > article >正文

基于NXP例程学习CAN UDS刷写流程

文章目录

    • 前言
    • 1.概述
      • 1.1 诊断报文
    • 2.协议数据单元(N_PDU)
      • 2.1 寻址信息(N_AI)
        • 2.1.1 物理寻址
        • 2.1.2 功能寻址
        • 2.1.3 常规寻址(Normal addressing)
        • 2.1.4 常规固定寻址(Normal fixed addressing)
        • 2.1.5 扩展寻址(Extended addressing)
        • 2.1.6 混合寻址(Mixed addressing)
      • 2.2 协议控制信息(N_PCI)
        • 2.2.1 单帧(SF)
        • 2.2.2 多帧
    • 3.诊断服务
      • 3.1 请求和响应
        • 3.1.1 流程图
        • 3.1.2 消息流格式
        • 3.1.3 抑制肯定响应
        • 3.1.4 NRC
      • 3.2 常见服务
        • DiagnosticSessionControl(诊断会话控制)($10)服务
          • 服务描述
          • 请求/响应
        • ECUReset(ECU 复位)($11)服务
          • 服务描述
          • 请求消息
          • 响应消息
        • SecurityAccess(安全访问)($27)服务
          • 服务描述
          • 请求消息
          • 响应消息
        • CommunicationControl(通信控制)($28)服务
          • 服务描述
          • 请求消息
          • 响应消息
        • WriteDataByIdentifier(通过标识符写数据)($2E)服务
            • 服务描述
          • 请求消息
          • 响应消息
        • RoutineControl(例程控制)($31)服务
          • 服务描述
          • 请求消息
          • 响应消息
        • RequestDownload(请求下载)($34)服务
          • 服务描述
          • 请求消息
          • 响应消息
        • TransferData(传输数据)($36)服务
          • 服务描述
          • 请求消息
          • 响应消息
        • RequestTransferExit(请求传输终止)($37)服务
          • 服务描述
          • 请求消息
          • 响应消息
    • 4.刷写流程
      • 4.1 预编程阶段
      • 4.2 编程阶段
        • 4.2.1 $31服务
      • 4.3 后编程阶段

前言

基于EcuBus-Pro实现CAN UDS升级

上文介绍了如何使用EcuBus-Pro实现CAN UDS升级的上位机,本文基于EcuBus-Pro监控的数据,详细介绍下S32K144官方CAN UDS Bootloader的流程。

笔者没有UDS的实战经验,所以文章内容是参考《GB/T 40822-2021》和一些网络上的培训资料完成,如果有不对的地方,还请帮忙评论区指出。

1.概述

通常车厂提高的DBC文件中有三类报文,如下所示:

  • 应用报文,用于多个ECU之间交互功能,比如执行开转向灯功能。
  • 诊断报文,用于Tester读取ECU端存储的故障信息,程序升级等。
  • 网络管理报文,用于协调多个ECU进行有序的休眠唤醒。

下文要介绍的CAN UDS刷写,使用的就是诊断报文。

1.1 诊断报文

Tester端和ECU端使用诊断报文传输的流程图如下:

通信流程图(来源于网络)

可以看到诊断报文的使用也是按照OSI模型来的,如下图所示:

CAN UDS的OSI模型(来源于网络)

2.协议数据单元(N_PDU)

按上文描述,诊断报文需要经过网络层进行组包拆包,所以需要了解网络层的协议格式,即N_PDU的组成,如下图所示。

PDU格式

其中,N_AI,N_PCI,N_Data的说明如下图所示。

PDU组成参数说明(来源于网络)

2.1 寻址信息(N_AI)

寻址方式按通信对象分为功能寻址和物理寻址;按地址格式分为常规寻址、常规固定寻址、扩展寻址、混合寻址四种方式。

另外,下文提到的SATA的意义如下:

  • 源地址(SA):发送节点地址
  • 目标地址(TA):接收节点地址
2.1.1 物理寻址

物理寻址,即Tester和ECU一对一通信,示例图如下:

物理寻址(来源于网络)

2.1.2 功能寻址

功能寻址,即Tester向多个ECU发出同一功能的诊断请求,示例图如下:

功能寻址(来源于网络)

2.1.3 常规寻址(Normal addressing)

常规寻址,使用11位CAN ID,将N_AI映射到消息帧的CAN ID区域,但是没有规定N_AI与CAN ID的具体映射关系,如下图所示。

常规寻址(来源于网络)

常规寻址是最常见的寻址方式,对于常规寻址:

  • 如果使用物理地址,每个ECU需要分配两个CAN ID,一个用于请求,一个用于响应。

物理-常规寻址(来源于网络)

  • 如果使用功能地址,同一个组的ECU共用一个CAN ID用于请求。

功能-常规寻址(来源于网络)

2.1.4 常规固定寻址(Normal fixed addressing)

常规固定寻址,使用29位CAN ID,与混合寻址编排方式类似,完整定义了N_AI如何映射到29位CAN ID,格式如下图所示。

常规固定寻址(来源于网络)

下文介绍的S32K1 CAN UDS升级流程,就是使用的这种寻址方式。

2.1.5 扩展寻址(Extended addressing)

扩展寻址,使用11位CAN ID,N_AI中的N_TA映射到CAN数据帧的第一个字节,其它域映射到CAN ID,格式如下图所示。

扩展寻址(来源于网络)

2.1.6 混合寻址(Mixed addressing)

混合寻址,仅用于远程诊断,格式如下图所示。

混合寻址-11位ID(来源于网络)

混合寻址-29位ID(来源于网络)

2.2 协议控制信息(N_PCI)

PCI的结构如下图所示,根据后续发送的N_Data长度分为单帧和多帧两种。

N_PCI结构(来源于网络)

2.2.1 单帧(SF)

当N_Data的长度在7个字节以内,选择单帧发送。

上图中的SF_DL代表N_Data的长度,<=7个字节,一个单帧的示例如下图:

单帧示例(来源于网络)

2.2.2 多帧

当N_Data的长度超过7个字节,需要选择多帧发送。一个多帧的示例如下图:

多帧示例(来源于网络)

多帧报文需要用到三种报文:

  • 第一帧FF,其中FF_DL代表N_Data的长度,>7个字节,<=4095个字节。单独的FF示例如下:

FF示例(来源于网络)

  • 连续帧CF,其中SN用于0-F循环计数。单独的CF示例如下:

CF示例(来源于网络)

  • 流控帧FC,相关的参数有FS、BS和STmin,参数说明和单独的FC示例如下:
参数含义
FS0继续发送。让发送方继续发送接下来的连续帧,表示接收方已经准备好了接收最大为BS数量的连续帧。
1等待。发送方等待下一帧流控帧并重置自己的计时。一般用于接收方没有处理完上一次接收到的连续帧。
2过载。发送方打算发送的数据长度超过了接收方的储存能力。
BS1~FF表示发送方在发送BS数值的连续帧之后,需要等待接收方的流控帧。
0表示不需要任何流控帧,直接发送全部数据。
STmin00~7F单位为ms
F1~F9表示0.1~0.9ms
0按照发送方最快的速度发送

FC示例(来源于网络)

3.诊断服务

N_Data和应用层的关系对应关系如下:

N_PDU映射到A_PDU

  • N_Data的第一个字节对应诊断服务ID
  • N_Data的第二个字节对应诊断服务的子功能或者数据参数(不具有子功能的诊断服务)

接下来介绍Tester和ECU基于诊断服务的交互方式,以及常见的诊断服务。

3.1 请求和响应

诊断服务的交互模式一般是是Tester发起服务请求,ECU端对服务进行响应。

3.1.1 流程图

诊断服务的请求和响应的流程图如下:

诊断服务流程图(来源于网络)

3.1.2 消息流格式

流程图中的消息流对应的格式如下图所示:

消息流格式

3.1.3 抑制肯定响应

有些时候为了提高传输效率,有些服务不回复肯定响应报文,即抑制肯定响应,通过设置请求消息流的子功能参数的bit7,如下图所示:

3.1.4 NRC

常见的NRC如下图所示,更多NRC的描述,查阅《GB/T 40822-2021》。

NRC

3.2 常见服务

下图是常见的服务以及支持的会话模式。

常见服务

下面详细介绍下S32K1官方CAN UDS升级例程使用到的几种服务。

DiagnosticSessionControl(诊断会话控制)($10)服务
服务描述

DiagnosticSessionControl(诊断会话控制)服务用于在服务端中启用不同的诊断会话。

请求/响应

请求/响应消息格式如下:

$10服务格式(来源于网络)

数据参数定义如下:

$10服务数据参数

该服务支持的NRC如下:
$10服务支持的NRC

ECUReset(ECU 复位)($11)服务
服务描述

客户端使用ECUReset(ECU 复位)服务来请求服务端复位。

该服务请求服务端根据嵌入在ECU 复位请求消息中的复位类型参数值的内容有效地执行服务端复位。可以在服务端中执行复位之前或之后发送ECU 复位肯定响应消息(如果需要)。建议在执行ECU 复位之前发送ECU 复位肯定响应消息。

请求消息

请求消息的定义如下:

请求消息定义

请求消息子功能的定义如下:

请求消息子功能定义

响应消息

肯定响应消息的定义如下:

肯定响应消息定义

支持的NRC如下:

支持的NRC

SecurityAccess(安全访问)($27)服务
服务描述

该服务的目的是提供访问数据和/或诊断服务的手段,这些服务由于保密、排放或安全的原因而受到限制。

该用于将例程或数据下载或上传到服务端和从服务端读取指定的内存位置的诊断服务,可能需要在SecurityAccess(安全访问)的情况下进行。

下载到服务端的非正常例程或数据可能会损坏电子设备或其他车辆部件,或者影响车辆排放、保密或安全标准的符合性。保密概念利用了种子和密钥之间的关系。

使用该服务的典型示例如下所示

  • 客户端请求“种子”;
  • 服务端发送“种子”;
  • 客户端发送“密钥”(与接收的种子配对);
  • 服务端响应“密钥”有效,并且它将自行解锁。

$27服务流程图

主机厂一般会设置不同的安全等级,用于执行后续不同的功能。安全级别切换的常见方式如下:

安全级别切换

请求消息

请求消息的定义如下:

请求消息的定义

子功能参数的定义如下:

子功能参数的定义

requestSeed(请求种子)值与sendKey(发送密钥)值具有固定关系:

  • “requestSeed=01”确定了“requestSeed=01”和“sendKey=02”之间的固定关系;
  • “requestSeed=03”确定了“requestSeed=03”和“sendKey=04”之间的固定关系。

数据参数的定义如下:

数据参数的定义

响应消息

肯定响应消息的定义如下:

肯定响应消息的定义

支持的NRC如下:

支持的NRC

CommunicationControl(通信控制)($28)服务
服务描述

该服务的目的是开启/关闭服务端(例如应用程序通信消息)某些消息的发送和/或接收。

请求消息

请求消息的定义如下:

请求消息的定义

子功能参数的定义如下:

子功能参数的定义

数据参数的定义如下:

数据参数的定义

响应消息

肯定响应消息的定义如下:

肯定响应消息的定义

支持的NRC如下:

支持的NRC

WriteDataByIdentifier(通过标识符写数据)($2E)服务
服务描述

通过标识符写数据服务允许客户端向服务端中给定数据标识符指定的内部位置写入信息。

请求消息

请求消息的定义如下:

请求消息的定义

数据参数包含的值定义太多,文章篇幅有限,有兴趣的建议查看《GB/T 40822-2021》的附录C.1。

响应消息

肯定响应消息的定义如下:

肯定响应消息的定义

支持的NRC如下:

支持的NRC

RoutineControl(例程控制)($31)服务
服务描述

客户端使用RoutineControl(例程控制)服务执行指定的步骤的序列并且获得任何相关结果。

该服务具有较大灵活性,但一般用途包括擦除内存、重置或学习自适应数据、运行自测试、覆盖正常服务端控制策略、控制服务端值随时间变化以及预定义序列(比如关闭敞篷车顶)等。

客户端使用RoutineControl(例程控制)服务进行如下操作:

  • StartRoutine(启动例程);
  • StopRoutine(停止例程);
  • 请求例程结果。

使用2字节routineIdentifier(例程标识符)。

请求消息

请求消息的定义如下:

请求消息的定义

子功能参数的定义如下:

子功能参数的定义

数据参数的定义如下:

数据参数的定义

响应消息

肯定响应消息的定义如下:

肯定响应消息的定义

肯定响应消息的数据参数定义如下:

肯定响应消息的数据参数定义

支持的NRC如下:

支持的NRC

RequestDownload(请求下载)($34)服务
服务描述

客户端利用“requestDownload(请求下载)”服务启动客户端到服务端之间的数据传输(下载)。

服务端收到“requestDownload(请求下载)”请求消息后,应在其发送肯定响应消息之前采取必要行动接收数据。

请求消息

请求消息的定义如下:

请求消息的定义

数据参数的定义如下:

数据参数的定义

响应消息

肯定响应消息的定义如下:

肯定响应消息的定义

肯定响应消息的数据参数定义如下:

肯定响应消息的数据参数定义

支持的NRC如下:

支持的NRC

TransferData(传输数据)($36)服务
服务描述

客户端利用传输数据服务从客户端向服务端(下载)或从服务端向客户端(上传)传输数据。

请求消息

请求消息的定义如下:

请求消息的定义

数据参数的定义如下:

数据参数的定义

响应消息

肯定响应消息定义如下:

肯定响应消息定义

肯定响应消息的数据参数定义如下:

肯定响应消息的数据参数定义

支持的NRC如下:

支持的NRC

RequestTransferExit(请求传输终止)($37)服务
服务描述

客户端利用此服务终止客户端与服务端之间的数据传输(上传或下载)

请求消息

请求消息的定义如下:

请求消息的定义

数据参数的定义如下:

数据参数的定义

响应消息

肯定响应消息定义如下:

肯定响应消息定义

肯定响应消息的数据参数定义如下:

肯定响应消息的数据参数定义

支持的NRC如下:

支持的NRC

4.刷写流程

整个刷写流程分三步,分别是预编程阶段、编程阶段以及后编程阶段。

4.1 预编程阶段

预编程阶段主要做一些程序升级前的准备工作,包括禁用DTC设置以及非诊断通信等。

预编程阶段的流程图如下所示,左侧的标准步骤是必须要实现的。

预编程阶段流程图

从EcuBus-Pro抓取的该阶段的数据如下所示。

MCU例程没有DTC设置的功能,所以未使用$85服务关闭DTC设置。

预编程阶段数据log

4.2 编程阶段

编程阶段是对MCU程序进行升级的主要阶段。

编程阶段的流程图如下所示。

编程阶段流程图

从EcuBus-Pro抓取的该阶段的数据如下所示。

$36服务传输的数据量太大,下图隐藏了大量的传输数据。如果需要查看完整数据,可以去前文提供的gitee仓库查看log表格。

编程阶段数据log

4.2.1 $31服务

其它服务内容的实现细节,可以通过前文提到的EcuBus-Pro工程的脚本文件详细查看;关于例程控制($31)服务,下面简单描述下。

S32K1官方demo使用的$31服务包含了三种RoutineID,如下图所示。

$31服务RoutineID

三种RoutineID实现的功能如下图:

  • Routine=0xFF00,实现Flash擦除功能
  • Routine=0x0202,发送CRC校验码,用于确认传输数据的完整性,即传输过程中数据是否有丢包或被篡改。
  • Routine=0xFF01,编程依赖性检查,确认传输的固件是否合法有效,即上位机给过来的固件是否来源可靠,功能是否验证过。

$31服务-MCU端功能

4.3 后编程阶段

后编程阶段用于在MCU程序升级完成后进行硬件复位,以及将编程会话切换到默认会话。

后编程阶段的流程图如下所示。

后编程阶段流程图

从EcuBus-Pro抓取的该阶段的数据如下所示。

后编程阶段数据log


如果觉得这篇文章对你有用,帮忙给个一键三连!!!

相关文章:

基于NXP例程学习CAN UDS刷写流程

文章目录 前言1.概述1.1 诊断报文 2.协议数据单元(N_PDU)2.1 寻址信息&#xff08;N_AI&#xff09;2.1.1 物理寻址2.1.2 功能寻址2.1.3 常规寻址&#xff08;Normal addressing&#xff09;2.1.4 常规固定寻址&#xff08;Normal fixed addressing&#xff09;2.1.5 扩展寻址&…...

RNN循环网络:给AI装上“记忆“(superior哥AI系列第5期)

&#x1f504; RNN循环网络&#xff1a;给AI装上"记忆"&#xff08;superior哥AI系列第5期&#xff09; 嘿&#xff01;小伙伴们&#xff0c;又见面啦&#xff01;&#x1f44b; 上期我们学会了让AI"看懂"图片&#xff0c;今天要给AI装上一个更酷的技能——…...

Python训练第四十三天

DAY 43 复习日 作业&#xff1a; kaggle找到一个图像数据集&#xff0c;用cnn网络进行训练并且用grad-cam做可视化 进阶&#xff1a;并拆分成多个文件 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms, models …...

基于有效集MPC控制算法的直线同步电机simulink建模与仿真,MPC使用S函数实现

目录 1.课题概述 2.系统仿真结果 3.核心程序 4.系统仿真参数 5.系统原理简介 6.参考文献 7.完整工程文件 1.课题概述 有效集算法通过迭代地选择一组 "有效" 约束&#xff0c;将约束优化问题转化为一系列无约束或等式约束优化问题。直线同步电机 (Linear Synch…...

让敏感数据在流转与存储中始终守护在安全范围

在企业数字化运营浪潮中&#xff0c;企业内部应用服务器面临着非法访问、数据泄露等风险&#xff0c;如何全面守护应用服务器文件安全&#xff0c;让敏感数据在流转与存储中始终守护在安全范围&#xff1f; 服务器白名单让数据流转安全又高效 天 锐 蓝盾的服务器白名单功能既…...

【Linux】find 命令详解及使用示例:递归查找文件和目录

【Linux】find 命令详解及使用示例&#xff1a;递归查找文件和目录 引言 find 是 Linux/Unix 系统中强大的文件搜索工具&#xff0c;用于在目录层次结构中递归查找文件和目录。它提供了丰富的搜索条件和灵活的操作选项&#xff0c;可以满足从简单到复杂的各种文件查找需求。 …...

Java转Go日记(五十九):参数验证

1. 结构体验证 用gin框架的数据验证&#xff0c;可以不用解析数据&#xff0c;减少if else&#xff0c;会简洁许多。 package mainimport ("fmt""time""github.com/gin-gonic/gin" )//Person .. type Person struct {//不能为空并且大于10Age …...

机器学习与深度学习14-集成学习

目录 前文回顾1.集成学习的定义2.集成学习中的多样性3.集成学习中的Bagging和Boosting4.集成学习中常见的基本算法5.什么是随机森林6.AdaBoost算法的工作原理7.如何选择集成学习中的基础学习器或弱分类器8.集成学习中常见的组合策略9.集成学习中袋外误差和交叉验证的作用10.集成…...

MySQL数据库表设计与索引优化终极指南

MySQL数据库表设计与索引优化终极指南 标签&#xff1a;MySQL 数据库设计 索引优化 性能调优 一、前言&#xff1a;为什么表设计和索引如此重要&#xff1f; 在数据库系统中&#xff0c;良好的表设计和高效的索引策略是保证系统性能的关键。据统计&#xff0c;约70%的数据库性…...

【论文阅读笔记】万花筒:用于异构多智能体强化学习的可学习掩码

摘要 在多智能体强化学习&#xff08;MARL&#xff09;中&#xff0c;通常采用参数共享来提高样本效率。然而&#xff0c;全参数共享的流行方法通常会导致智能体之间的策略同质&#xff0c;这可能会限制从策略多样性中获得的性能优势。为了解决这一关键限制&#xff0c;我们提出…...

负载均衡LB》》HAproxy

Ubuntu 22.04 安装HA-proxy 官网 资料 # 更新系统包列表&#xff1a; sudo apt update # 安装 HAproxy sudo apt install haproxy -y # 验证安装 haproxy -v # 如下图配置 Haproxy 在这里插入代码片》》》配置完之后 重启 Haproxy sudo systemctl restart haproxy 补充几…...

Vue 中组件命名与引用

Vue 中组件命名与引用 前言 在 vue 项目中&#xff0c;我们会发现在代码中&#xff0c;import 组件 和 components 组件注册中得命名方式与组件引用时的命名方式不一样&#xff0c;这种现象是由组件名的大小写转换规则造成的。如下示例&#xff1a; 组件引入与注册&#xff…...

UE 5 和simulink联合仿真,如果先在UE5这一端结束Play,过一段时间以后**Unreal Engine 5** 中会出现显存不足错误

提问 UE5报错如图。解析原因 回答 你遇到的这个错误提示是&#xff1a; “Out of video memory trying to allocate a rendering resource. Make sure your video card has the minimum required memory, try lowering the resolution and/or closing other applications tha…...

在uni-app中如何从Options API迁移到Composition API?

uni-app 从 Options API 迁移到 Composition API 的详细指南 一、迁移前的准备 升级环境&#xff1a; 确保 HBuilderX 版本 ≥ 3.2.0项目 uni-app 版本 ≥ 3.0.0 了解 Composition API 基础&#xff1a; 响应式系统&#xff1a;ref、reactive生命周期钩子&#xff1a;onMount…...

Rust 控制流

文章目录 Rust 控制流if 表达式循环实现重复用 loop 重复代码从循环返回值循环标签用于区分多层循环while 条件循环用 for 循环遍历集合 Rust 控制流 在大多数编程语言中&#xff0c;根据条件是否为真来运行某些代码&#xff0c;以及在条件为真时重复运行某些代码&#xff0c;是…...

【Linux基础知识系列】第十三篇-Cron与定时任务管理

在Linux系统中&#xff0c;任务自动化是提高效率和确保服务连续性的关键。Cron是一个强大的定时任务管理工具&#xff0c;它允许用户设置定期执行的命令或脚本。通过Cron&#xff0c;用户可以自动化系统维护、备份、报告生成等多种任务。本文将详细介绍如何使用Cron工具创建和管…...

Visual Studio 中的 MD、MTD、MDD、MT 选项详解

在Visual Studio中开发C++项目时,正确选择运行时库(runtime library)对于确保应用程序的性能、稳定性和兼容性至关重要。本文将详细介绍/MD, /MT, /MDd, 和 /MTd这些编译器选项的意义、应用场景及其区别。 MSVCRT.dll MSVCRT.dll 是 Microsoft Visual C++ Runtime Library …...

Python 3.11.9 安装教程

前言 记录一下Windows环境下Python解释器的安装过程。 安装过程 1、安装程序下载 打开Python官网&#xff1a; 点击Downloads&#xff0c;选择Windows&#xff1a; 页面中找到需要的3.11.9版本&#xff0c;点击Download Windows installer (64-bit)下载&#xff1a; 2、…...

【各种主流消息队列(MQ)对比指南】

主流消息队列对比分析 一、核心指标对比 特性/消息队列RabbitMQKafkaRocketMQActiveMQPulsar协议支持AMQP, MQTT, STOMP自定义协议JMS/自定义协议JMS, AMQP, MQTT, STOMPMQTT, AMQP, STOMP单机吞吐量万级百万级十万级万级百万级延迟微秒级&#xff08;低吞吐&#xff09;毫秒…...

PySpark、Plotly全球重大地震数据挖掘交互式分析及动态可视化研究

全文链接&#xff1a;https://tecdat.cn/?p42455 分析师&#xff1a;Yapeng Zhao 在数字化防灾减灾的时代背景下&#xff0c;地震数据的深度解析成为公共安全领域的关键议题。作为数据科学工作者&#xff0c;我们始终致力于通过技术整合提升灾害数据的应用价值&#xff08;点击…...

代码训练LeetCode(24)数组乘积

代码训练(24)LeetCode之数组乘积 Author: Once Day Date: 2025年6月5日 漫漫长路&#xff0c;才刚刚开始… 全系列文章可参考专栏: 十年代码训练_Once-Day的博客-CSDN博客 参考文章: 238. 除自身以外数组的乘积 - 力扣&#xff08;LeetCode&#xff09;力扣 (LeetCode) 全…...

如何让AI自己检查全文?使用OCR和LLM实现自动“全文校订”(可DIY校订规则)

详细流程及描述参见仓库&#xff08;如果有用的话&#xff0c;请给个收藏&#xff09;&#xff1a; GitHub - xurongtang/DocRevision_Proj: A simple project about how to revist docment (such as your academic paper) in a automatic way with the help of OCR and LLM.A…...

volka 25个短语动词

以下是分句分段后的内容&#xff1a; 3,000. Thats 95% of spoken English. And I am teaching you all of these words. First, Ill teach you todays words. And then youll hear them in real conversations. With my brother. Stick around until the end, because witho…...

Java观察者模式深度解析:构建松耦合事件驱动系统的艺术

目录 观察者模式基础解析核心结构与实现原理Java内置观察者实现Spring框架中的高级应用典型应用场景与实战案例观察者模式变体与优化常见问题与最佳实践总结与未来展望1. 观察者模式基础解析 1.1 模式定义与核心思想 观察者模式(Observer Pattern)是一种行为型设计模式,它…...

DFT测试之TAP/SIB/TDR

TAP的作用 tap全称是test access port&#xff0c;是将jtag接口转为reset、sel、ce、ue、se、si、tck和so这一系列测试组件接口的模块。 jtag的接口主要是下面几个信号&#xff1a; 信号名称信号方向信号描述TCK&#xff08;测试时钟&#xff09;输入测试时钟&#xff0c;同…...

【推荐算法】DeepFM:特征交叉建模的革命性架构

DeepFM&#xff1a;特征交叉建模的革命性架构 一、算法背景知识&#xff1a;特征交叉的演进困境1.1 特征交叉的核心价值1.2 传统方法的局限性 二、算法理论/结构&#xff1a;双路并行架构2.1 FM组件&#xff1a;显式特征交叉专家2.2 Deep组件&#xff1a;隐式高阶交叉挖掘机2.3…...

C#报错 iText.Kernel.Exceptions.PdfException: ‘Unknown PdfException

【问题】 直接new一个PdfWriter的对象直接会报错&#xff1a; iText.Kernel.Exceptions.PdfException: Unknown PdfException. NotSupportedException: Either com.itextpdf:bouncy-castle-adapter or com.itextpdf:bouncy-castle-fips-adapter dependency must be added in…...

数据库表中「不是 null」的含义

例图&#xff1a; 1.勾选了「不是 null」&#xff08;NOT NULL&#xff09;&#xff1a; 这个字段在数据库中必须有值&#xff0c;不能为空。也就是说&#xff0c;你插入数据的时候&#xff0c;必须给它赋值&#xff0c;否则插入会报错。 2.没有勾选「不是 null」&#xff…...

Elasticsearch的搜索流程描述

Elasticsearch 的搜索流程是一个结合 分布式查询、分片协同、结果聚合和排序 的复杂过程,其设计目标是在海量数据中实现快速检索和精准结果返回。以下是搜索流程的详细解析: 一、搜索流程总览 Elasticsearch 搜索流程示意图 (图源:Elastic 官方文档) 二、详细步骤解析 …...

Visual Studio问题记录

程序"xxx dotnet.exe"已退出&#xff0c;返回值为-2147450730 问deepseek&#xff1a;visual studio输出程序dotnet.exe已退出&#xff0c;返回值为-2147450730 dotnet.exe 编译时退出并返回错误代码 **-2147450730**&#xff08;十六进制 0x80008076&#xff09;&…...