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

汽车标定技术(一):XCP概述

目录

1.汽车标定概述

2.XCP协议由来及版本介绍

3.XCP技术通览

3.1 XCP上下机通信模型

3.2 XCP指令集

3.2.1 XCP帧结构定义

3.2.2 标准指令集

3.2.3 标定指令集

3.2.4 页切换指令集

3.2.5 数据采集指令集

3.2.6 刷写指令集

3.3 ECU描述文件(A2L)概述

3.3.1 标定上位机的标定、测量

3.3.2 A2L文件格式

4.小结 


1.汽车标定概述

       汽车的标定技术,最初是源自对发动机的特征值、曲线Map和图表参数的一个动态优化调整以适配不同发动机、不同车型对动力的需求。

       它的基本思路是将发动机各种控制算法固化在MCU的Flash中,但是这些算法所需要用的参数通过技术手段抽象出来并在ram中运行,标定人员可以通过修改这些参数来观察算法的输出是否满足要求。注意哈,虽然说我们知道这个参数是可以修改的,但对于CPU或者控制算法来说,这些参数其实是常量,只有控制算法的输出才是变量。

        下图是一个比较经典的标定测量流程示例图:

        标定(Calibration)就是调整和优化ECU中的对于发动机控制算法的各种特征变量;

        测量(Measurement)就是观察不同标定常量作为输入是如何影响控制算法的输出。

        再举个简单一点的例子,比说说现在油门踏板开度与喷油量之间存在这样的关系

y = ax+b

        y--喷油量,x--油门踏板开度,a和b分别为常量

        那么要做标定,我们应该修改的是什么值?

        首先,肯定不可能是x,因为这个开度是驾驶员用脚踩出来的,我们是没办法去要求别人;其次不可能是y,这是输出啊,根据x来的,那么只能是a或者b了;我们假设x此时为50%,表示油门踏板开度为50%,对应的a、b固定,那么喷油量y就是固定了;

        但对于某些动力车型,它想要50%的踏板就有很强动力(y很大),这时候我们就应该去修改常数a、b(此时是运行在ram中)。标定就是修改这些特征值来满足不同车型的要求,当我们根据车型的不同将上述a、b修改成不同值后,一旦标定工程师认为这些值达到效果了,就通过flash刷写的方式将这些数写进Flash中,再通过技术手段告诉ECU以后就到Flash去取a、b的值吧。这就完成了汽车量产前的标定工作。

        那么要完成标定这项工作,需要具备哪些条件呢?

        首先要有一个好的修改标定常量的工具,其次要有一个好的观测方式(要么肉眼,要么通过PC端),最后还要有一个好的人机交互界面。

        这时候,一个名叫ASAM的组织就冒了出来,它将刚才我谈到的这些内容进行一个标准化,即ASAM-MCD(Standardization of Automation and Measurement systems, with the work groups:
Measurement, Calibration and Diagnosis)。

        借用Vector对于一个完整标定系统的描述:

  • ASAM-MCD-1MC:ECU和标定测量系统接口
  • ASAM-MCD-2MC:即A2L文件,是控制器内部信息描述文件规范
  • ASAM-MCD-3MC:此接口用于将另一个系统连接到标定测量系统,例如用于试验台自动化

2.XCP协议由来及版本介绍

       有了上述基本概念,我们知道标定测量系统和ECU之间的桥梁就是ASAM-MCD-1MC,最初就是大家都比较熟的CCP(基于CAN的标定协议,于1995年提出,当前为2.01,1999定版),但是由于CAN的速率特性,对测量数据的时间戳不够精确;再加上目前ADAS等高测量速率要求,CCP逐渐不能满足要求;因此将该协议从CCP中抽象出来是非常有必要的,这时候就出现了XCP(Universal Measurement and Calibration Protocol),“X”表示的是可变的传输层协议,具体如下:

        截止到目前为止,XCP协议已经迭代到了1.5版本 ,每个版本更新如下:

版本发布时间变更点
1.02003

1.传输层支持CAN、ETH(UDP和TCP/IP、SPI、USB)

2.发布标定测量、

1.120081.增加传输层支持FlexRay
1.220131.增加A2L-IF_DATA描述,用于预估ECU资源消耗
1.320151.增加了feature:ECU状态,Bypassing错误处理和时间参数相关
1.420171.新增DAQ模式:减少时间戳数据传输的压缩DAQ等
1.520171.新增“Software Debugging over XCP”标准

3.XCP技术通览

        本质上,XCP协议是为使用者提供了对ECU内部memory的读写机制。读访问保证标定系统可以从RAM中读取观测量,即测量(measurement);写访问保证了标定系统可以对RAM中的标定量进行数值修改,即标定(calibration)。

        因此,XCP的实现就采用了经典的master-slave问答形式。

3.1 XCP上下机通信模型

         XCP基于Master-slave原则;标定系统作为Master,ECU通常作为Slave,Master与Slave之间通过标定工具(硬件例如ETAS的ES582、Vector的VX1000等)了解,使用XCP协议规定的指令进行交互;所以在Master和Slave的系统里均需集成XCP标准协议栈,就和诊断栈一样。

        Master与Slave的命令交互帧叫做CTO(Command Transfer Objects);

        Master与Slave的测量数据交互帧叫做DTO(Data Transfer Objects);

        其通信模型如下:

图片来源:Vector官网 

CTO缩写全称描述
CMDCommand PacketMaster给Slave发送的指令
RESCommand Response PacketSlave返回给Master的命令正响应
ERR Error Packet        Slave返回给Master的命令负响应
EVEvent PacketSlave发给Master的异步事件帧
SERVService Request PacketSlave发给Master的服务请求帧
DTO缩写全称描述
DAQData AcquisitionSalve周期给Master发送测量数据
STIMStimulationMaster周期发送Slave的激励数据(Bypass常见)

        XCP提供了如下几种数据传输方式:

  • 一问一答模式

  • Master块传输模式

         比如说使用download传输大数据给ECU,就会用到这种通讯模式

  • Slave块传输

         Upload指令,获取ECU内部的数据状态;一般标定download完之后,会紧跟着一个upload检查是否写进了目标ram地址。

  • 多问答模式

        这种比较少见,如有用到的可以在后面留言哦。 


3.2 XCP指令集

        有了上位机通信模型之后,我们接下来就要了解XCP协议具体定义了哪些指令。

        在这之前,要先来看XCP协议定义的帧结构。

3.2.1 XCP帧结构定义

            XCP帧包含三部分:Header+Packet+Tail

         其中,帧头(Header)、帧尾(Tail)依赖不同传输层,真正要讨论的深色部分,这部分内容与传输层无关了,即XCP协议栈真正要处理的数据内容,它主要包含三部分内容 ID 域、时间戳域和数据域。

  • ID域

        ID域中最重要的就是PID(Packet identifier),这个值实际上就是Master\Slave的命令ID。如下:

         DAQ主要是测量时根据DAQ list和ODT类型来定位数据的,以后有文章着重描述测量这块。

        CTR可选,也是用于DAQ。

  • 时间戳域

        时间戳通常时DTO帧使用,因为同一个DAQ list里的观测量是同一时间采集,所以一个DAQ周期只会传输一个时间戳

  • 数据域

        Master和Slave真正交互的实际数据,每个指令都有不同的Date参数放在这个域里。

  • 连接命令问答示例

        我们以FF连接命令为例,详细看下PID+DATA是如何交互的,如下:

        根据标准定义,我们来分析上述报文的具体含义。

        根据协议可以看到回复含义如下:

15:CAL/PAG、DAQ、STIM、PGM资源处于保护状态;

C0:  开启slave block mode,inter byte order,AG为1;

08:MAX CTO;

08:MAX DTO;

01 01 :XCP协议版本 1.1

        有了这个基本概念,我们来看看XCP协议到底提供了哪些指令。        

3.2.2 标准指令集

        所谓标准指令集,就是提供最基础的功能,包括Master和Slave的连接建立、断开,ECU身份识别,解锁受保护资源,获取当前会话状态等等。根据XCP1.5版本,标准指令集如下:

        其中前四条指令必选,我们常见的标定上位机的连接按钮,一点击就是这个四条指令的组合拳。 余下指令除了最后两条,基本也是要选的,UPLOAD可以与DOWNLOAD搭配使用,SEED\UNLOCK也是组合。

3.2.3 标定指令集

        标定指令集就是执行标定动作或者在开始标定之前将离线标定的数据批量写进calibration ram中。

        其通讯流程如下:

        首先是SET_MTA(0xF6) 设置即将要传输的memory地址等;

        然后调用DOWNLOAD(0xF0)通知Slave即将要使用的传输模式,结合DOWNLOAD_NEXT进行大数据传输,或者使用问答方式进行小数据标定。

3.2.4 页切换指令集

        页切换,可以用于所谓的工作页和参考页的切换,本质上就是memory地址的切换,WP和RP具体可参考之前关于标定的简单描述汽车ECU的标定

        页切换指令集包含如下内容:

        但在实际使用中,页切换不是所有ECU都支持的,通常是带overlay功能的CPU可以支持。因此要做页切换的目的就是想要CPU很快速滴访问WP或者RP去取算法所需的参数,但做这个切换没有overlay是比较难实现的,具体可参考overlay机制英飞凌TC3xx-Overlay-CSDN博客 。

3.2.5 数据采集指令集

        数采指令集,就是大家常见的DAQ指令集,如下:

        DAQ可以分为动态和静态DAQ;而根据ASAM_XCP_PART5的示例,DAQ的响应时序如下:

        1.获取从机DAQ列表信息

        由于首先就要获取DAQ列表信息,因此在XCP初始化时就要对DAQ进行初始化。

        该步骤所要用到的指令:DA、D9、D7、D5、D8,

        2.准备DAQ列表

                1)静态DAQ配置:常用指令E3

                2)动态DAQ配置

                首先要释放DAQ(D6),然后分配DAQ(D4),最后分配ODT入口(D3)。

        3.配置DAQ列表

                这一步骤用到的指令有:SET_DAQ_PTR(E2),WRITE_DAQ(E1)

        4.开始传输数据

        用到的指令有:SET_DAQ_LIST_MODE(E0)、START_STOP_DAQ_LIST(DE)、GET_DAQ_CLOCK(DC)、START_STOP_SYNCH(DD)

3.2.6 刷写指令集

1.声明刷写开始

        用到的指令PROGRAM_START(D2)

2.擦除FLASH

        用到的指令有 SET_MTA(F6)、PROGRAM_CLEAR(D1)。

3.开始刷写数据

        PROGRAM(D0)

4.结束刷写

        PROGRAM_VERIFY(C8)、PROGRAM_RESET(CF)

        但在实际使用,通常不怎么用这个,都是标号导出hex,通过诊断刷进去。

        因为以前如果是INCA,就得开发ProF文件,其次刷写的效率真的很低。


3.3 ECU描述文件(A2L)概述

        在讲A2L文件之前,我们先来思考几个问题。

  1. 既然标定测量的本质是对ECU内部memory进行读写访问,那么Master是通过什么途径知道存放在ECU内部的标定量、观测量的地址的?
  2. 既然Master和Slave之间是通过CAN\ETH\FlexRay等通讯,它们之间的通信速率、采样点是如何同步的?

        带着这样的问题,我们进入A2L概述之旅

3.3.1 标定上位机的标定、测量

        当我们使用INCA或者CANape时,标定窗口和测量窗口通常长这样:

        这些数据从哪里来的呢?如下图

        我们可以看到,这个数据集里有很多个观测量以及2个标定量,我们选取其中的test_calib1和measrued_Var1进行标定和测量,我们截取master的通信报文如下:

Package Type

Xcp Package

Parameters

SET_MTA

F6 xx xx 00 60 00 00 00

Address extension = 0x00

Address = 0x00000060

RES

FF

DOWNLOAD

F0 04 00 00 80 3F

Number of data elements = 0x04

Data elements = 0x00 0x00 0x80 0x3F

RES

FF

         很明显,这个0x00000060就是test_calib1的地址,那么这个标定工具INCA是怎么知道的呢?

        还记得我们ASAM-MCD-2MC吗?即A2L文件,它就是用来告诉标定工具ECU里面各种详细信息的,包括指令支持类型、通讯方式、观测量、标定量在Flash和RAM的那个具体地址以及实际数据和算法物理数据转换公式等信息。

3.3.2 A2L文件格式

        A2L文件是一种ASCII格式可读文件,记事本都可以打开,它包含了如下具体内容:

  • AML部分:描述了XCP协议的相关信息,关键字/begin A2ML  ... /end A2ML
  • ECU通用部分:描述了ECU的部分信息,比如ECU byte order,对齐方式,标定Flash\RAM等,关键字 /begin MOD_COMMON ... /end MOD_COMMON;/begin MOD_PAR ... /end MOD_PAR等
  • IF_DATA:描述了通讯接口,传输层相关信息,这个INCA要求特点严格,增加在CAN的波特率描述上调bug调了大概半个月,就是因为采样点的原因。
  • A2L对象:包含了标定量、观测量的具体地址、转换公式等,关键词 /begin CHARACTERISTIC ... /end CHARACTERISTIC

       通常我习惯把绿色部分叫做A2L header部分(与/begin HEADER关键词区分),在最开始没接触vector的ASAP2 editor时,都是根据标准描述一行一行手撸,后来掌握到关键点后,用脚本做一个基于excel的配置工具也勉强能用;

        红色部分,一般情况就是用模型生成的A2L文件,如下图:

        最开始生成的A2L文件,标定观测量没有地址的,也没有相应的header,需要集成编译后拿到map或者elf文件进行地址替换,如果没有ASAP2 editor或者CANape,那就只能用matlab自带脚本,如果想再自定义A2L格式,还得熟悉m语言,以后会专门将这块内容。 

        最后以一个A2L文档结构来描述一下:

4.小结 

        前三节内容,基本上把XCP大体框架讲的七七八八,后面会详细聊聊标定在ECU里面的具体概念、DAQ和ODT list的详解、INCA走XCP刷写必备ProF文件、基于模型如何开发标定测量以及生成完美的A2L文件,MPC5748的ovelay概念以及在集成XCP协议栈遇到的各种奇奇怪怪的问题。

相关文章:

汽车标定技术(一):XCP概述

目录 1.汽车标定概述 2.XCP协议由来及版本介绍 3.XCP技术通览 3.1 XCP上下机通信模型 3.2 XCP指令集 3.2.1 XCP帧结构定义 3.2.2 标准指令集 3.2.3 标定指令集 3.2.4 页切换指令集 3.2.5 数据采集指令集 3.2.6 刷写指令集 3.3 ECU描述文件(A2L)概述 3.3.1 标定上位…...

短视频的运营方法

尊敬的用户们,你们好!今天我将为大家带来一篇关于短视频运营的专业文章。在当今互联网时代,短视频已经成为了一个重要的流量入口,掌握正确的运营方法对于企业的发展至关重要。接下来,我将通过以下几个方面为大家详细介…...

GitLab CI/CD 持续集成/部署 SpringBoot 项目

一、GitLab CI/CD 介绍 GitLab CI/CD(Continuous Integration/Continuous Deployment)是 GitLab 提供的一种持续集成和持续部署的解决方案。它可以自动化软件的构建、测试和部署过程,以便开发者更快地、更频繁地发布可靠的产品。 整体过程如…...

第二证券:政策效应逐步显现 A股修复行情有望持续演绎

上星期,A股商场延续企稳反弹的态势,上证指数震荡上涨0.43%;沪深两市日均成交额回升至8700亿元左右;北向资金近一个月初次转为周净买入5.57亿元。 安排观点一起认为,在稳增加、稳预期相关政策持续发力,上市…...

sql逻辑优化

1.分页 通常使用每页条数及第一页作为参数 开发接口 GetMapping("/querySystemList") public List<SystemAduit> querySystemList(RequestParam("keyword") String keyword,RequestParam(name "offset", defaultValue "0") i…...

【数据结构】树与二叉树(一):树(森林)的基本概念:父亲、儿子、兄弟、后裔、祖先、度、叶子结点、分支结点、结点的层数、路径、路径长度、结点的深度、树的深度

文章目录 5.1 树的基本概念5.1.1 树的定义树有序树、无序树 5.1.2 森林的定义5.1.3 树的术语1. 父亲&#xff08;parent&#xff09;、儿子&#xff08;child&#xff09;、兄弟&#xff08;sibling&#xff09;、后裔&#xff08;descendant&#xff09;、祖先&#xff08;anc…...

2024 Android Framework学习大纲之基础理论篇

2024 Android Framework学习大纲之基础理论篇 受到当前经济影响&#xff0c;互联网越来越不景气了,因此Android App开发也是越来越不景气&#xff0c;中小型公司越来越偏向跨平台开发&#xff0c;比如Flutter&#xff0c;这样能节省成本&#xff0c;笔者也曾经是一名6年多工作经…...

【深度学习】Yolov8 区域计数

git&#xff1a;https://github.com/ultralytics/ultralytics/blob/main/examples/YOLOv8-Region-Counter/readme.md 很长时间没有做yolov的项目了&#xff0c;最近一看yolov8有一个区域计数的功能&#xff0c;不得不说很实用啊。 b站&#xff1a;https://www.bilibili.com/vid…...

Windows 系统服务器部署jar包时,推荐使用winsw,将jar包注册成服务,并设置开机启动。

一、其他方式不推荐的原因 1、Spring Boot生成的jar包&#xff0c;可以直接用java -jar运行&#xff0c;但是前提是需要登录用户&#xff0c;而且注销用户后会退出程序&#xff0c;所以不可用。 2、使用计划任务&#xff0c;写一个bat处理文件&#xff0c;里面写java -jar运行…...

npm 包管理

1. 命令 // 查看是否登录 npm who am i // 登录&#xff1a;输入用户名、密码、邮箱、一次性登录密码&#xff08;邮箱接收&#xff09; npm login // 创建 npm init // 快速创建 npm init -y // 发包 npm publish // 发包&#xff08;开源&#xff09; npm publish --access …...

力扣370周赛 -- 第三题(树形DP)

该题的方法&#xff0c;也有点背包的意思&#xff0c;如果一些不懂的朋友&#xff0c;可以从背包的角度去理解该树形DP 问题 题解主要在注释里 //该题是背包问题树形dp问题的结合版&#xff0c;在树上解决背包问题 //背包问题就是选或不选当前物品 //本题求的是最大分数 //先转…...

GPT学习笔记

百度的文心一言 阿里的通义千问 通过GPT能力&#xff0c;提升用户体验和产品力 GPT的出现是AI的iPhone时刻。2007年1月9日&#xff0c;第一代iPhone发布&#xff0c;开启移动互联网时代。新一轮的产业革命。 GPT模型发展时间线&#xff1a; Copilot - 副驾驶 应用&#xf…...

Apex的addError()显示的消息中实现换行

直接用‘<br/>’是无效的&#xff0c;因为addError默认不转义HTML符号&#xff0c;如果需要转义&#xff0c;应该将第二个参数escape设置为false。不过即使设置了也只对classic页面生效&#xff0c;lightning页面还是无法转义。 官方文档&#xff1a; 参考资料&#xf…...

STM32中微秒延时的实现方式

STM32中微秒延时的实现方式 0.前言一、裸机实现方式二、FreeRTOS实现方式三、定时器实现&#xff08;通用&#xff09;4、总结 0.前言 最近在STM32驱动移植过程中需要用到微秒延时来实现一些外设的时序&#xff0c;由于网上找到的驱动方法良莠不齐&#xff0c;笔者在实现时序过…...

2005-2021年全国各省家庭承包耕地面积和家庭承包耕地流转总面积数据(无缺失)

2005-2021年全国各省家庭承包耕地面积和家庭承包耕地流转总面积数据 1、时间&#xff1a;2005-2021年 2、来源&#xff1a;农村经营管理统计NB 3、指标&#xff1a;家庭承包经营耕地面积、家庭承包耕地流转总面积&#xff08;单位&#xff1a;亩&#xff09; 4、范围&#…...

【六、http】go的http的客户端重定向

一、http的重定向 重定向过程&#xff1a;客户浏览器发送http请求----》web服务器接受后发送302状态码响应及对应新的location给客户浏览器–》客户浏览器发现是302响应&#xff0c;则自动再发送一个新的http请求&#xff0c;请求url是新的location地址----》服务器根据此请求寻…...

AI:61-基于深度学习的草莓病害识别

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌在这个漫长的过程,中途遇到了不少问题,但是…...

idea文件比对

idea文件比对 1.项目内的文件比对2.项目间的文件比对3. 剪切板对比4. 版本历史(不同分支和不同commit)对比 1.项目内的文件比对 在项目中选择好需要比对的文件(类)&#xff0c;然后选择Compare Files Mac下的快捷键是Commandd&#xff0c; 这样的比对像是git冲突解决一样 …...

重磅发布|美创科技新一代 数据安全管理平台(DSM Cloud)全新升级

重磅发布 新一代 数据安全管理平台&#xff08;DSM Cloud&#xff09; 美创科技新一代 数据安全管理平台&#xff08;简称&#xff1a;DSM Cloud&#xff09;全新升级&#xff0c;正式发布。 在业务上云飞速发展过程中&#xff0c;快速应对数据激增&#xff0c;同时有效保障数…...

比SAM小60倍的分割一切模型:MobileSAM

1 MobileSAM SAM就是一类处理图像分割任务的通用模型。与以往只能处理某种特定类型图片的图像分割模型不同&#xff0c;SAM可以处理所有类型的图像。 在SAM出现前&#xff0c;基本上所有的图像分割模型都是专有模型。比如&#xff0c;在医学领域&#xff0c;有专门分割核磁图…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

《基于Apache Flink的流处理》笔记

思维导图 1-3 章 4-7章 8-11 章 参考资料 源码&#xff1a; https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

AspectJ 在 Android 中的完整使用指南

一、环境配置&#xff08;Gradle 7.0 适配&#xff09; 1. 项目级 build.gradle // 注意&#xff1a;沪江插件已停更&#xff0c;推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...