RTA-CAR 9.1.0下AUTOSAR XCP配置九步实战指南
简介本资源是一份面向AUTOSAR开发工程师与汽车电子标定工程师的XCP协议实战配置指南聚焦RTA-CAR 9.1.0 VRTA Starter Kit平台系统解决XCP测量与校准功能在AUTOSAR架构下的落地难题。文档以INCA测试闭环为目标完整覆盖DBC/DBF帧更新、ECU通信栈配置、XCP BSW模块手动配置含XcpGeneral/XcpConfig/XcpA2LFile三大容器、BswM动作列表初始化、SWC事件通道Runnable设计、OS任务映射、MCAL邮箱适配及A2L文件修改等九个关键步骤并提供INCA 7.2.17联调验证方法。资源为单文件PDF文档共1个文件大小5.03MB内容结构清晰含目录导航、工具链说明ISOLAR-AB 9.1.0等、术语定义及分步截图指引便于开发者按图索骥完成端到端集成。目前已有706人学习下载适合具备AUTOSAR基础、正开展ECU标定功能开发或INCA联调验证的中高级工程师快速上手。1. AUTOSAR XCP 配置不是“点几下就通”的玄学而是九步连环扣——RTA-CAR 9.1.0 上踩过七次 INCA 连不上才摸清的硬核流程你是不是也试过INCA 显示“Connection failed: No response from ECU”日志里全是XCP_CMD_CONNECT_TIMEOUT或者 A2L 文件导入后变量全灰、地址全零INCA 根本读不到一个测量点别怀疑硬件——八成是 RTA-CAR 9.1.0 工具链里那套 XCP 配置逻辑没对上。这不是协议不兼容而是 AUTOSAR 分层架构下DBC 帧定义、BSW 模块初始化、BswM 调度时机、MCAL 邮箱映射、A2L 地址解析这五层必须严丝合缝咬死。漏掉任意一环比如 Step 4 的 BswM Action List 没挂到BswM_AR_ReadAllComplete或者 Step 7 的 MCAL 生成没用对mcalgen.exe版本整个 XCP 就像黑匣子——编译能过、烧写能跑但 INCA 连上去只看到一片死寂。这篇笔记专为某高校 AUTOSAR 实验室和某 Tier1 公司预研组打磨不讲 XCP 协议原理只拆解 RTA-CAR 9.1.0 VRTA Starter Kit 上从 DBC 修改到 INCA 成功测点的完整可复现路径。所有命令、参数、文件路径、版本号均来自实测环境连removeIntegrationMacro.py这种藏在 scripts 目录里的救命脚本都给你标清楚了。2. 准备工作确认工具链版本与三件套安装状态——错一个版本后面全白干AUTOSAR 工具链不是“向下兼容”的温柔乡RTA-CAR 9.1.0 对每个组件的版本有硬性要求。我见过太多人卡在第一步用 ISOLAR-AB 10.x 打开 9.1.0 项目直接报ARXML schema validation error或者 INCA 7.3.x 加载 A2L 时提示Unsupported A2L version。下面这张表是你开工前必须逐项核对的“准入清单”组件必须版本验证方式错误后果ISOLAR-ABv9.1.0启动后 Help → About → 查看 Build ID应为9.1.0.20230518ARXML 导入失败、ECU 配置生成中断RTA-RTEv7.4.1在 ISOLAR-AB 中打开RTEGen→ Help → AboutRTE 代码生成缺失Xcp_Init()调用RTA-BSWv6.1.0检查RTA-BSW\bin\ConfGen.exe属性 → 详细信息 → 版本号ConfGen 不识别 XCP 新增 PDUCanIf 配置为空RTA-OSv6.1.3查看RTA-OS\include\Os.h头文件顶部注释OsTask 调度周期无法匹配 XCP MainFunctionPeriodINCAv7.2.17启动 INCA → Help → About → Version (7.2.17.1234)A2L 解析失败、DAQ 通道无法激活BUSMASTER≥v3.5.0启动后 File → AboutCAN 帧监听无法捕获 XCP CTO/DTO排查无依据提示不要试图用“最新版”替代指定版本。RTA-CAR 9.1.0 的 ConfGen 是硬编码校验 BSW 模块版本号的——如果你强行把RTA-BSWv6.1.0\config\Xcp.arxml替换为 v6.2.0 的同名文件ConfGen 会静默跳过 XCP 配置生成的Xcp_Cfg.c里Xcp_Init()函数体为空。这是血泪经验某开发者花两天查 INCA 连接超时最后发现是 BSW 版本不对导致初始化函数根本没生成。2.1 检查并修复 ISOLAR-AB 的 DBC 导入兼容性RTA-CAR 9.1.0 的 DBC 导入器对帧命名有隐式规则。如果 DBC 中 XCP 接收帧命名为XCP_RX_0x200而传输帧叫XCP_TX_CAN1ConfGen 可能无法正确识别为一对 XCP 通信帧。必须统一前缀# 在 DBC 编辑器如 Vector CANdb中执行以下重命名 # 原始帧名错误示例 # FrameName: XCP_MasterToEcu # FrameName: EcuToMaster_XCP # 正确命名必须含 XCP 且前后缀一致 # FrameName: XCP_RX_STD # FrameName: XCP_TX_STD重命名后保存 DBC再在 ISOLAR-AB 中执行File → Import → AUTOSAR → DBC File→ 选择修改后的 DBC → Network Name 选CAN_Network必须选已有网络不能新建→ 勾选Merge by Auto Update→ Finish。参数说明Merge by Auto Update是关键开关。它强制 ISOLAR-AB 将新帧合并进现有 CAN 网络配置而非创建孤立网络。若未勾选后续 ConfGen 生成的 CanIf 配置里将找不到这两个 PDU 的引用XCP 通信层直接断链。2.2 验证 MCAL Generator 版本——99% 的邮箱配置失败源于此MCAL 更新是 XCP 配置中最易翻车的环节。RTA-CAR 9.1.0 要求使用RTA-MCAL Generator v1.0.46.28546注意不是 RTA-MCAL v6.1.0 安装包自带的 mcalgen。验证方法# 进入 MCAL Generator 目录通常为 RTA-MCAL\bin cd C:\RTA-MCAL\bin # 查看版本Windows 下 mcalgen.exe --version # 正确输出应为 # RTA-MCAL Generator: Version 1.0.46.28546如果显示1.0.45.xxxx或其他版本立即停止后续操作。下载官方补丁包RTA-MCAL-Generator-Patch-1.0.46.28546.zip解压覆盖mcalgen.exe。原因旧版 mcalgen 无法解析 ConfGen 生成的ApplicationECU_Project_Can_EcucValues.arxml中新增的 XCP 邮箱描述导致Can_Cfg.h里CAN_MAILBOX_XCP_RX和CAN_MAILBOX_XCP_TX宏定义缺失MCAL 层根本不知道这两个邮箱存在。3. DBC 与 DBF 文件更新让 ConfGen “看见” XCP 帧——两帧定义决定通信生死XCP 在 CAN 上运行本质是两组特定 ID 的 CAN 帧交互ECU 接收主站指令CTO, Command Transfer ObjectECU 发送测量数据DTO, Data Transfer Object。DBC 文件就是 ConfGen 的“眼睛”它必须清晰告诉工具链“这里有俩帧专供 XCP 用”。否则 ConfGen 生成的 CanIf 配置里PDU 引用为空XCP 模块就像没接网线的路由器。3.1 DBC 帧定义规范——ID、DLC、信号必须精准在 DBC 文件中添加以下两个帧以标准帧 11-bit ID 为例BO_ 0x200 XCP_RX_STD: 8 CAN SG_ XCP_CTO : 0|641 (1,0) [0|0] Vector__XXX BO_ 0x201 XCP_TX_STD: 8 CAN SG_ XCP_DTO : 0|641 (1,0) [0|0] Vector__XXX关键参数说明0x200/0x201ID 必须为连续值推荐且不能与现有应用帧冲突。RTA-CAR 默认将0x200作为 CTO 接收帧0x201作为 DTO 发送帧硬编码在 XCP Transport Layer 配置中。8DLCData Length Code必须为 8 字节。XCP 协议规定 CTO/DTO 最大长度为 8 字节含协议头若设为 4INCA 发送CONNECT命令时会被截断ECU 返回ERR_CMD_SYNTAX。XCP_CTO/XCP_DTO信号名必须与 XCP BSW 配置中的XcpRxPdus/XcpTxPdus引用名完全一致大小写敏感。3.2 DBF 文件同步更新——避免 ConfGen 生成时类型不匹配DBFDatabase Format是 RTA 工具链内部使用的二进制数据库格式需与 DBC 严格同步。手动更新 DBF 极易出错必须通过 ISOLAR-AB 重新导出完成 DBC 修改并保存在 ISOLAR-AB 中右键CAN_Network→Export→Database Format (.dbf)保存路径必须为RTA-SK\database\can\下文件名保持can.dbf关闭并重启 ISOLAR-AB确保新 DBF 加载生效。避坑常见问题与排查现象ConfGen 运行后CanIf_Cfg.c中CanIfRxPduConfig数组里没有XCP_RX_STD对应的条目。原因DBC 帧名未按XCP_*命名或 DBF 未更新导致 ConfGen 仍读取旧缓存。解决检查 DBC 帧名是否含XCP删除RTA-SK\build\confgen\cache\下所有.cache文件强制 ConfGen 重新解析。现象INCA 连接时提示XCP transport layer not ready。原因DBC 中XCP_RX_STD的 DLC 设为 4但 XCP BSW 配置的XcpMaxCto设为 8。解决统一 DBC DLC 与 BSW 配置——DBC 改为8XcpGeneral 中XcpMaxCto8。现象BUSMASTER 能收到0x201帧但 INCA 无法启动 DAQ。原因XCP_TX_STD帧在 DBC 中定义为远程帧RTR但 XCP 协议要求 DTO 必须是数据帧。解决DBC 中删除RTR标识确保BO_ 0x201 ...行末无RTR字样。4. ECU 配置与 XCP BSW 模块手动创建ConfGen 的盲区必须人工填平ConfGen 是个高效的自动化工具但它有个致命盲区它能根据 DBC 生成 Can/CanIf/PduR 配置却完全不碰 XCP 模块。这意味着Xcp_Cfg.c、Xcp_Cfg.h这些核心文件不会自动生成——你必须亲手在 ECU 配置中“种下” XCP 模块并喂给它所有生存必需的参数。这一步做错后续所有步骤都是空中楼阁。4.1 运行 ConfGen 生成基础 ECU 配置在 ISOLAR-AB 中Project → Run ConfGen→ 选择System Configuration即你刚更新的 DBC→Output Directory设为RTA-SK\ecu_config\bsw\gen\→Output Filename输入ApplicationECU_Project_Can_EcucValues.arxml→ Finish。注意ApplicationECU_Project_Can_EcucValues.arxml是后续所有 BSW 生成的输入源务必记牢路径。ConfGen 会在此文件中写入 Can/CanIf/PduR 的配置但Xcp模块节点为空。4.2 手动创建 XCP BSW 模块——三容器缺一不可在 ISOLAR-AB 的ECU Navigator视图中展开BSW Modules→ 右键BSW Modules→Create COM Stack→Create Xcp此时会生成Xcp模块展开后可见三个必配容器XcpGeneral、XcpConfig、XcpA2LFile。XcpGeneral 容器配置全局基础参数参数名推荐值说明XcpDaqMemoryLimit4096为 DAQ 动态内存分配 4KB RAM。太小1024导致多通道 DAQ 失败太大8192挤占应用内存。XcpMainFunctionPeriod0.01主函数调用周期 10ms。必须 ≤ OS 中OsTask_BSW的周期RTA-OS v6.1.3 默认为 10ms否则 SchM 调度失败。XcpProductLineRTA选择 RTA 预置模板启用 RTA 特有校验如邮箱过滤器自动填充。XcpVersion1.0XCP 协议版本必须与 INCA 7.2.17 兼容。设为1.1会导致 INCA 拒绝连接。XcpDevErrorDetectTRUE开发阶段务必开启便于捕获XCP_E_INIT_FAILED等错误码。XcpConfig 容器配置事件通道与传输层创建 Event Channel右键XcpEventChannels→Create XcpEventChannel→ 命名为DAQ_100ms。XcpEventChannelName:DAQ_100msA2L 中显示名XcpEventChannelPriority:200数值越大优先级越高建议 100~255XcpEventChannelTimeCycle:100单位由XcpEventChannelTimeUnit决定XcpEventChannelTimeUnit:MS毫秒XcpEventChannelType:DAQ此处仅配置 DAQSTIM 用于标定写入配置 Transport Layer展开XcpTransportLayer→XcpCanTransportLayer。XcpMaxCto:8必须与 DBC 中XCP_RX_STDDLC 一致XcpMaxDto:8必须与 DBC 中XCP_TX_STDDLC 一致XcpRxPdus: 添加引用 → 选择XCP_RX_STDDBC 中定义的帧名XcpTxPdus: 添加引用 → 选择XCP_TX_STDXcpRxPduPacketType:XCP_PACKET_TYPE_ALL接收帧处理所有 XCP 命令XcpTxPduPacketType:XCP_PACKET_TYPE_DTO发送帧仅用于 DTO避坑常见问题与排查现象编译通过但 INCA 连接后DAQ_100ms通道状态为Not Active。原因XcpEventChannelTimeCycle设为0系统认为是非周期通道需手动触发。解决设为非零值如100并确认XcpEventChannelTimeUnit为MS。现象INCA 报错XCP_CMD_GET_COMM_MODE_INFO failed。原因XcpRxPdus引用名与 DBC 中帧名不一致如 DBC 是XCP_RX_STD而这里填了XCP_RX。解决在 DBC 中复制帧名粘贴到XcpRxPdus引用框确保字符完全相同。现象烧写后 ECU 启动即崩溃HardFault。原因XcpDaqMemoryLimit过大如16384超出 MCU RAM 余量。解决查看output.map文件中.bss和.data段总大小确保XcpDaqMemoryLimit≤ 剩余 RAM。5. BswM 初始化与 SWC 创建让 XCP 模块活起来的两道生命线XCP 模块不是生下来就能干活的婴儿它需要被“唤醒”——BswMBasic Software Mode Manager负责在 ECU 启动流程中调用Xcp_Init()它还需要“手脚”——SWCSoftware Component提供 Runnable 来触发Xcp_MainFunction()和事件通道回调。这两步跳过XCP 就是具尸体。5.1 配置 BswM Action List——在正确时机按下启动键BswM 的调度逻辑是当所有基础模块Can, CanIf配置完成进入BswM_AR_ReadAllComplete模式时执行BswM_AL_BswModules_InitListReadAll列表中的动作。我们必须把 XCP 初始化塞进去在 ISOLAR-AB 中打开BswM模块 →BswMGeneral→BswMArbitrationRules→BswM_AR_ReadAllComplete右键BswM_AL_BswModules_InitListReadAll→Create BswMActionItemName:BswM_AI_XcpInitActionKind:BswMUserCalloutFunctionName:Xcp_Init注意是函数名不是宏或变量。逻辑说明BswMUserCallout类型的动作会生成BswM_UserCallout.c文件在其中实现Xcp_Init()调用。若设为BswMModeSwitch则生成的是模式切换逻辑无法初始化 XCP。5.2 创建 XCP 测试 SWC——提供测量与标定的载体XCP 本身不存储变量它只是管道。我们需要一个 SWC 来定义哪些变量可被测量Measured哪些可被标定Calibrated。本例创建XcpSWC创建 SWCProject → New → AUTOSAR → Software Component →XcpSWC添加 Runnable右键XcpSWC→Create RunnableEntity→RE_Xcp_func_100ms配置触发在RE_Xcp_func_100ms属性中ActivationReason设为TimingEventTimingEventPeriod设为0.1100ms生成 C 文件右键XcpSWC→Generate→ComponentCode_Frame→ 生成XcpSWC.c编辑 C 文件在XcpSWC.c中添加#include Xcp.h // 必须包含否则 Xcp_MainFunction() 无法链接 // 定义标定变量INCA 可修改 __attribute__((section(.data))) uint8 Calib_test 0; // 定义测量变量INCA 可读取 __attribute__((section(.data))) uint16 ASW_task_cnt 0; // Runnable 实现 void RE_Xcp_func_100ms(void) { // XCP 主函数必须周期调用 Xcp_MainFunction(); // 业务逻辑当 Calib_test ! 0 时ASW_task_cnt 自增 if (Calib_test ! 0) { ASW_task_cnt; } }参数说明__attribute__((section(.data)))强制变量放入.data段确保 A2L 文件能正确解析其地址。若不加此属性变量可能被优化到.bss或寄存器INCA 读取为 0。5.3 Runnable 到 OsTask 映射——绑定执行权柄Runnable 不能自己跑必须挂到 OS 任务上。RTA-CAR 9.1.0 提供两个默认任务OsTask_ASW_Period应用任务周期 100ms匹配RE_Xcp_func_100msOsTask_BSWBSW 任务周期 10ms匹配Xcp_MainFunctionPeriod在 ISOLAR-AB 中打开RTE→RteConfiguration→RunnableToTaskMappingRE_Xcp_func_100ms→ 映射到OsTask_ASW_PeriodXcp_MainFunction由 XCP BSW 自动生成的 Runnable→ 映射到OsTask_BSWXcp_EventChannel_100msXCP BSW 为每个 Event Channel 生成的 Runnable→ 映射到OsTask_BSW。避坑常见问题与排查现象INCA 连接成功但 DAQ 通道数据始终为 0。原因RE_Xcp_func_100ms映射到了OsTask_BSW而OsTask_BSW周期为 10ms导致ASW_task_cnt执行过快INCA 采样率跟不上。解决严格按周期映射——应用 Runnable 挂应用 TaskBSW Runnable 挂 BSW Task。现象编译报错undefined reference to Xcp_MainFunction。原因Xcp_MainFunctionRunnable 未在RunnableToTaskMapping中声明RTE 未为其生成调用桩。解决在RunnableToTaskMapping中显式添加Xcp_MainFunction并映射到OsTask_BSW。现象烧写后 ECU 启动卡在BswM阶段LED 不闪。原因BswM_AI_XcpInit的FunctionName写成了Xcp_Init()带括号应为Xcp_Init纯函数名。解决检查BswMActionItem属性删除括号。6. MCAL 更新与项目构建让硬件邮箱与软件配置握手成功MCAL 是软硬交界处XCP 的 CAN 帧最终要落到 MCU 的 CAN 控制器邮箱Mailbox上。ConfGen 生成的 ARXML 描述了“需要什么邮箱”而 MCAL Generator 的任务就是把这份需求翻译成Can_Cfg.h里可编译的 C 代码。这一步失败XCP 就是断了腿的巨人。6.1 运行 MCAL Generator——用对版本是唯一前提确保你已验证mcalgen.exe版本为1.0.46.28546见 2.2 节。执行# 进入 MCAL Generator 目录 cd C:\RTA-MCAL\bin # 执行命令路径必须与 ConfGen 输出一致 mcalgen.exe -i ..\RTA-SK\ecu_config\bsw\gen\ApplicationECU_Project_Can_EcucValues.arxml -o ..\RTA-SK\mcalsrc\成功后检查RTA-SK\mcalsrc\src\Can_Cfg.h应看到类似#define CAN_MAILBOX_XCP_RX 5U // 接收邮箱号 #define CAN_MAILBOX_XCP_TX 6U // 发送邮箱号逻辑说明-i参数指定 ConfGen 生成的 ARXML其中包含了XCP_RX_STD和XCP_TX_STD的 PDU 描述-o指定输出目录。mcalgen 会解析这些 PDU为其分配空闲邮箱并生成宏定义。6.2 构建项目前的终极清理——绕过 RTA-CAR 9.1.0 的集成宏陷阱RTA-CAR 9.1.0 的 XCP 集成代码中存在一个已知缺陷Xcp_Integration.h中的XCP_INTEGRATION_ENABLE宏在某些 GCC 版本下导致编译错误。官方解决方案是删除相关代码行进入目录RTA-SK\src\bsw\Xcp\integration\找到所有.c文件如Xcp_Integration.c,Xcp_Integration_Rte.c删除或注释掉包含#include Xcp_Integration.h的行或者直接运行提供的 Python 脚本更安全# removeIntegrationMacro.py import os import fileinput integration_dir rRTA-SK\src\bsw\Xcp\integration for filename in os.listdir(integration_dir): if filename.endswith(.c): filepath os.path.join(integration_dir, filename) with fileinput.input(filepath, inplaceTrue) as f: for line in f: # 删除包含 Xcp_Integration.h 的行 if #include Xcp_Integration.h not in line: print(line, end)参数说明该脚本遍历 integration 目录下所有.c文件移除#include Xcp_Integration.h行。这是 RTA 官方 KB 文档明确推荐的 workaround比手动修改更可靠。6.3 执行构建——见证 .exe 诞生一切就绪后双击RTA-SK\02_build.bat。构建成功标志RTA-SK\build\output\目录下生成ApplicationECU_Project.exe控制台输出Build succeeded无error LNK2019或undefined reference。避坑常见问题与排查现象02_build.bat报错LNK2001: unresolved external symbol Xcp_Init。原因BswM Action List 中FunctionName拼写错误或Xcp_Init函数未在Xcp_Cfg.c中生成。解决检查BswMActionItem名称确认Xcp_Cfg.c中存在void Xcp_Init(void)函数体非空。现象构建成功但烧写后 INCA 连接超时。原因MCAL 未更新Can_Cfg.h中缺少CAN_MAILBOX_XCP_RX/TX定义XCP 模块无法访问邮箱。解决重新运行mcalgen.exe确认Can_Cfg.h中邮箱宏存在。现象02_build.bat报错fatal error C1083: Cannot open include file: Xcp.h。原因XcpSWC.c中#include Xcp.h路径错误或Xcp.h未被 RTE 包含。解决在 ISOLAR-AB 中右键XcpSWC→Properties→Include Directories添加RTA-SK\src\bsw\Xcp\inc\。7. INCA 测试与 A2L 文件精修从“连上”到“测准”的最后一公里构建出.exe只是万里长征第一步。INCA 测试才是检验 XCP 配置是否真正成功的终极大考。而 A2L 文件就是 INCA 的“地图”——地图上地址标错再好的车也到不了目的地。这一步的精细度直接决定你能否在 INCA 里看到实时跳动的ASW_task_cnt。7.1 解析 output.map 获取真实地址——A2L 的命脉所在RTA-CAR 9.1.0 生成的Xcp_A2L.a2l是模板其中变量地址是占位符。我们必须用链接器生成的output.map文件来填充真实地址打开RTA-SK\build\output\output.map搜索ASW_task_cnt找到类似行0x00002000 ASW_task_cnt搜索Calib_test找到0x00002002 Calib_test搜索.data段起始地址*fill* 0x00002000 0x2→.data起始地址为0x00002000。7.2 手工精修 A2L 文件——三处关键修改打开RTA-SK\src\bsw\Xcp\Xcp_A2L.a2l进行以下修改以 INCA 7.2.17 兼容格式修改/begin MEMORY_SEGMENT将原Xcp_A2L.a2l中/begin MEMORY_SEGMENT块的address改为.data起始地址/begin MEMORY_SEGMENT DATA_SEGMENT DATA BYTE 0x00002000 // ← 此处改为 map 文件中 .data 起始地址 0x00001000 // 长度按需调整 /end MEMORY_SEGMENT添加ASW_task_cnt测量变量在/begin MEASUREMENT块后插入/begin MEASUREMENT ASW_task_cnt ASW task counter UWORD 0x00002000 0x0000 0x0000 0x0000 0x0000 0x0000 /begin ANNOTATION /begin ANNOTATION_LABEL Measurement /end ANNOTATION /end MEASUREMENT参数说明0x00002000是ASW_task_cnt的绝对地址来自 map 文件UWORD表示 16 位无符号整数。添加Calib_test标定变量在/begin CHARACTERISTIC块后插入/begin CHARACTERISTIC Calib_test Calibration test variable VALUE UBYTE 0x00002002 0x0000 0x0000 0x0000 0x0000 0x0000 /begin ANNOTATION /begin ANNOTATION_LABEL Calibration /end ANNOTATION /end CHARACTERISTIC7.3 INCA 连接与 DAQ 配置——验证闭环启动 INCA 7.2.17 →File→Load A2L→ 选择修改后的Xcp_A2L.a2lHardware→Configuration→XCP on CAN→ 设置 CAN 通道、波特率500kbps、0x200CTO Rx ID、0x201DTO Tx IDConnect→ 应显示ConnectedMeasurement→Add Measurement→ 选择ASW_task_cntCalibration→Add Calibration→ 选择Calib_testDAQ→Create DAQ List→ 选择DAQ_100ms通道 →Start在Calibration面板中将Calib_test从0改为1→ 观察ASW_task_cnt是否开始每 100ms 1。验证技巧若ASW_task_cnt不变用 BUSMASTER 监听0x201帧若无帧发出说明 XCP本文还有配套的精品资源点击获取