从这里开始

MDC Development Tool 3.0.002-0000000 产品文档 01

文档版本：01|发布日期：2024-07-10

*本文档仅提供对产品过程版本的描述，仅供参考，最终实现以产品正式上市为准。

联系我们：MDC技术论坛

版权所有 © 华为技术有限公司 2024。保留一切权利。
版权所有 © 华为技术有限公司


文档介绍

产品文档主要帮助客户理解并使用MDC Development Tools开发类工具进行车载应用的相关开发工作。

表1 产品文档
文档类别 | 内容介绍
MDC Manifest Configurator使用指南 | 本文档详细介绍MDC Manifest Configurator（简称MMC）工具基础配置、模块化配置和校验等功能的使用。
MDC Development Studio使用指南 | 本文档详细介绍MDC Development Studio（简称MDS）开发车载应用软件的过程和常用操作指导。
MindStudio使用指南 | 本文档详细介绍MindStudio工具的安装指导以及如何通过工具进行模型转换，应用开发等指导。


文档约定

所有文档遵循或者使用统一的相关约定。

符号约定

在本文中可能出现下列标志，它们所代表的含义如下：

符号 | 说明
 | 表示如不避免则将会导致死亡或严重伤害的具有高等级风险的危害。
 | 表示如不避免则可能导致死亡或严重伤害的具有中等级风险的危害。
 | 表示如不避免则可能导致轻微或中度伤害的具有低等级风险的危害。
 | 用于传递设备或环境安全警示信息。如不避免则可能会导致设备损坏、数据丢失、设备性能降低或其它不可预知的结果。 “须知”不涉及人身伤害。
 | 对正文中重点信息的补充说明。 “说明”不是安全警示信息，不涉及人身、设备及环境伤害信息。

图形界面元素引用约定

在本文中可能出现下列GUI界面约定，它们所代表的含义如下。

格式 | 说明
“” | 带双引号“”的格式表示各类界面控件名称和数据表，如单击“确定”
> | 多级菜单用“>”隔开。如选择“文件 > 新建 > 文件夹”，表示选择“文件”菜单下的“新建”子菜单下的“文件夹”菜单项。


文档开发过程

华为文档开发采用工程化的方法，经过计划、开发及商品化等阶段向用户提供文字“交付件”。产品文档与硬件和软件同步开发，也包含需求分析、设计、开发和测试等阶段。

开发过程

产品文档由华为公司资料开发部负责开发。产品文档的开发包括如下过程：

  1. 分析用户需求。
  2. 制定文档开发计划。
  3. 设计文档开发交付件。
  4. 开发文档交付件原型。
  5. 测试及验证文档交付件。
  6. 发布。

通过对产品文档开发各阶段的执行以及阶段结束时的阶段决策评审保证资料质量。

遵循标准

产品文档开发过程遵从QuEST论坛（Quality Excellence for Suppliers of Telecommunications Forum）的TL9000标准。


文档获取

介绍文档的获取方式。

所有文档都可以通过华为技术支持网站（https://support.huawei.com/enterprise/）发布，网站提供产品文档的在线检索在线浏览和下载服务。

文档访问路径：网站首页>“技术支持”>“产品支持”>"智能汽车解决方案">"智能驾驶"，选择对应的产品和版本，获取所需要的文档。

版本文档是和软件包一起发布的，可在产品节点下软件页签中选择对应的版本文档。


如何获取帮助

华为技术有限公司通过MDC论坛、技术支持网站以及联系华为工程师等方式向用户提供及时有效的技术支持。

MDC智能驾驶计算平台论坛

如果在进行MDC安装、使用或应用开发过程中遇到难以解决的问题，或者有任何需求建议，可以通过MDC智能驾驶计算平台论坛进行反馈：

论坛地址：https://bbs.huaweicloud.com/forum/forum-1027-1.html

MDC技术支持人员将在一个工作日内响应您提出的问题。

技术支持网址

查阅技术支持网站上的技术资料：https://support.huawei.com/enterprise（企业网网址）

获取华为技术支持

如果在设备维护或故障处理过程中，遇到难以确定或难以解决的问题，通过文档的指导仍然不能解决，请通过如下方式获取技术支持：

  • 联系华为技术有限公司客户服务中心。

    中国区企业用户请通过以下方式联系：

    • 客户服务电话：400-822-9999
    • 客户服务邮箱：support_e@huawei.com

      企业网全球各地区客户服务热线可以通过以下网站查找：企业用户全球服务热线

  • 联系华为技术有限公司驻当地办事处的技术支持人员。


版权声明

版权所有 © 华为技术有限公司 2024。 保留一切权利。

非经本公司书面许可，任何单位和个人不得擅自摘抄、复制本文档内容的部分或全部，并不得以任何形式传播。

商标声明

和其他华为商标均为华为技术有限公司的商标。本文档提及的其他所有商标或注册商标，由各自的所有人拥有。

注意

您购买的产品、服务或特性等应受华为公司商业合同和条款的约束，本文档中描述的全部或部分产品、服务或特性可能不在您的购买或使用范围之内。除非合同另有约定，华为公司对本文档内容不做任何明示或默示的声明或保证。由于产品版本升级或其他原因，本文档内容会不定期进行更新。除非另有约定，本文档仅作为使用指导，本文档中的所有陈述、信息和建议不构成任何明示或暗示的担保。


MDC Manifest Configurator 使用指南

本文档详细介绍了MDC Manifest Configurator（下文简称MMC）工具基础配置、模块化配置和校验等功能的使用。

  • 认识MDC Manifest Configurator
  • 准备工作
  • 启动MMC
  • 了解MMC工作界面
  • 开发AUTOSAR工程
  • 校验AUTOSAR工程
  • 重构模型
  • 比较模型
  • 导出工程或ARXML文件
  • AP配置示例
  • 配置MCU的数据通路
  • 配置网络通信
  • 配置ADSFI工程
  • 配置诊断文件
  • AP常见报错处理
  • FAQ
  • 常用首选项配置参考


认识MDC Manifest Configurator

MDC Manifest Configurator（以下简称MMC）是基于智能驾驶计算平台（以下简称为计算平台）的Manifest配置工具，其遵循自适应AUTOSAR平台（AUTOSAR Adaptive Platform）规范（19-11版本），可用于计算平台软件、智能驾驶功能软件以及应用软件的配置。

MMC工具基于Eclipse平台开发，如需扩展Eclipse功能插件，请使用Eclipse官方平台下载安装对应的第三方软件。

  • 基本概念
  • MMC概要介绍
父主题： MDC Manifest Configurator 使用指南


基本概念

使用MMC工具前了解并熟悉相关的基本概念。

  • 软件开发工具链
  • 自适应AUTOSAR平台
父主题： 认识MDC Manifest Configurator


软件开发工具链

为构建智能驾驶计算平台开发生态系统，平台提供了一套高效便捷、智能易用和安全可信的工具体系链，其覆盖了软件开发集成、调测、标定、路测仿真及故障诊断等汽车的全生命周期。软件开发集成工具主要包括本文描述的AUTOSAR文件（下文简称ARXML文件）配置工具MDC Manifest Configurator（MMC），以及应用开发工具MDC Development Studio（MDS）和AI集成开发工具MindStudio，它们的运作流程如图1所示（图中虚线部分为可选操作）。

图1 计算平台软件开发集成工具

MDC Manifest Configurator

MMC是计算平台的Manifest（配置文件）配置工具，用于配置智能驾驶计算平台软件系统（由计算平台软件、智能驾驶功能软件和应用软件组成）。其遵循了自适应AUTOSAR平台规范，对软件进行了服务化设计和抽象化设计，并对抽象后的参数进行配置，输出配置文件，可作为MDS工具的输入。

MDC Development Studio

MDS是计算平台的IDE（Integrated Development Environment）集成开发工具，主要用来进行源码编辑、编译、调试和性能调优等。其还有一个很重要的功能，是以计算平台的配置工具MMC输出的配置文件作为输入，通过代码自动生成功能生成计算平台软件与智能驾驶应用软件之间的通信框架代码，智能驾驶功能软件和应用软件再基于生成的通信框架代码进行独立开发，MDS工具使用详情请参见《MDC Development Studio 使用指南》。

MindStudio

MindStudio是AI（Artificial Intelligence）算子开发和AI模型管理工具，支持把基于TensorFlow、Caffe等框架生成的神经网络模型转换为可以在计算平台芯片上执行的网络模型。

MindStudio还支持AI仿真和AI性能分析功能，工具使用详情请参见《MindStudio 使用指南》。

父主题： 基本概念


自适应AUTOSAR平台

随着智能驾驶技术的发展，对计算资源要求高的软件被引入车辆系统。这些软件不仅需要满足严格的完整性和安全性要求，同时需要随着外部系统的发展在车辆生命周期内进行迭代更新。经典AUTOSAR平台（AUTOSAR Classic Platform，CP）标准已无法满足上述需求，故自适应AUTOSAR平台（AUTOSAR Adaptive Platform，AP）应运而生。

AP是基于ECU（Electronic Control Unit）微处理器的标准化平台，支持高智能驾驶场景，车载和车外高速通信功能，提供具有高性能计算和通讯机制的灵活的软件配置。AP的逻辑架构从下至上包括三个层次：

  1. 容器/硬件（Machine）：Machine定义了运行自适应AUTOSAR的硬件，Machine定义的硬件可以是真实的物理硬件，也可以是完全虚拟化的机器、虚拟化的操作系统、操作系统级别的虚拟化容器或任何其他虚拟化环境。
  2. 自适应AUTOSAR运行时（AUTOSAR Runtime for Adaptive，ARA）：包含由功能集群提供的应用程序接口，提供基础AP功能和AP标准服务。
  3. 用户应用程序（User Application）：由若干个运行在ARA之上的自适应应用程序组成。

MMC是计算平台基于AP方法论提供的工具。因此，为了更高效地使用MMC设计计算平台软件，就需要对AP方法论进行深入了解。关于AP方法论请参见AUTOSAR社区文档“AUTOSAR_TPS_ManifestSpecification.pdf”，华为公司也会为客户提供关于AP方法论的基本原理和MMC工具使用的培训。

父主题： 基本概念


MMC概要介绍

MMC工具是计算平台提供配置功能的开发工具，将用户在图形化界面中的配置输入转化为AUTOSAR模型，并输出“.arxml”格式文件。

设计框架

计算平台系统是智能驾驶系统的软硬件基础平台，其主要提供基于计算平台设备的硬件配置和客户传感器配置的平台级Manifest设计。

在AUTOSAR的Manifest设计架构中，计算平台设计覆盖范围如图1所示。蓝框内为计算平台软件在Manifest配置的设计范围，即针对计算平台基本硬件及客户的传感器配置，事先提供平台级的Manifest设计，对外呈现的是一组ARXML配置文件，包括提供传感器服务的配置文件“sensor_services.arxml”、提供车辆及执行器服务的配置文件“vehicle_abstraction.arxml”和提供计算平台管理服务的配置文件“mdc_platform_services.arxml”。

图1 Manifest设计

功能特点

  • 模块化配置功能
    • MMC提供清晰的模块配置导向，使用户高效完成目标模块的配置。

    • 模块配置界面包括元素管理窗口（分类树状目录）和元素属性配置窗口，按功能模块展示元素信息。

    • 模块化配置功能支持对配置元素进行灵活的增删改查，提高用户配置效率。
    • 模块化界面支持Model校验结果的定位跳转，帮助用户快速定位错误信息。
  • 拖拽式配置功能

    MMC提供了拖拽式配置界面，使AP应用配置场景化，帮助用户聚焦业务逻辑的开发，更高效生成通用配置文件。

  • 模型层面和文本层面的校验功能

    模型层面校验功能可验证元素属性和元素之间关系是否符合AUTOSAR规范和计算平台实际业务定义的约束，即界面中的Model校验。文本层面的校验功能可验证ARXML文件是否存在违反Schema规则的配置项。

    • 校验结果界面提供校验错误信息，支持跳转到目标属性编辑界面，完成配置修改。
    • 校验结果界面提供过滤、排序、分组等功能，便于根据用户需求展示校验信息。

遵循规范

MMC遵循自适应AUTOSAR 19-11规范。

MMC遵守Artop社区的规范，遵循Artop软件许可证书ASLR和ASLP。

AUTOSAR的更多信息，请参见AUTOSAR官网。

公网地址说明

ARXML本质为XML文件，若两个XML文件均包含不同内容和定义的元素，就会发生命名冲突。解决这种冲突的方式是使用命名空间，常用的命名空间方式为使用URL，故MMC工具及其生成ARXML文件中存在如下URL：

http://autosar.org/sm

http://autosar.org/per

上述URL为扩展字段的命名空间。

父主题： 认识MDC Manifest Configurator


准备工作

介绍MMC的系统部署要求、软件获取和安装等操作指导。

  • 系统要求
  • 获取软件
父主题： MDC Manifest Configurator 使用指南


系统要求

为了避免因工程过大、运行过频造成的运行缓慢或内存溢出，运行MMC工具所在的PC的操作系统需为Ubuntu 20.04版本，且最低满足表1要求。

表1 最低系统要求

项目

说明

操作系统

X86_64 Ubuntu 20.04（桌面版）

内存

8GB

CPU
  • Intel六代酷睿i5
  • 4核
  • 2.5GHz

空闲磁盘空间

40GB

网卡

传输速率千兆

系统语言

en_US.UTF-8

系统缩放与布局

100%
父主题： 准备工作


获取软件

在使用MMC工具前，需获取并安装相关软件包。

获取方式

  1. 登录华为技术支持网站。
  2. 在网站首页选择“智能汽车解决方案 > 智能驾驶”，进入“智能驾驶”页面。
  3. 下载MMC安装包。

    1. 在“智能驾驶”页面选择“MDC Development Tool”。
    2. 单击“软件”页签，选择目前软件包所属版本。
    3. 在软件列表中，下载MDC_Manifest_Configurator-{version}-Ubuntu{osversion}.tar.gz包和对应的数字签名证书。
      • MMC为免安装软件，软件包解压之后即可使用。
      • 请保证{osversion}与操作系统版本一致。

  4. 下载版本配套的软件包。

    1. 返回“智能驾驶”页面，选择对应的产品形态入口，如“MDC 610”。
    2. 单击“软件”页签，选择目前软件包所属版本。
    3. 在软件列表中，下载MDC_KIT-{version}-{type}.tar.gz包（部分软件压缩包的集成包，简称KIT包）和其对应的数字签名证书。
    4. 解压KIT包，在“mdc_devel”目录下获取MDC_SDK-{version}-Ubuntu{osversion}-llvm-prod.tar.gz包（简称SDK包）。
    • 可以通过解压SDK包得到存放了ARXML文件（包括Datatype、Machine等基础配置）的manifest文件夹。
    • 请保证{osversion}与操作系统版本一致。

  5. 请参考下载网页上的《OpenPGP验证指南与工具》，对软件包进行PGP数字签名校验。数字签名证书可用于对软件包的完整性验证。如果校验失败，请不要使用该软件包，先联系华为技术支持工程师解决。

    使用软件包安装/升级之前，也需要按上述过程先验证软件包的数字签名，确保软件包未被篡改。

父主题： 准备工作


启动MMC

前提条件

  • 完成准备工作。
  • 在MMC工具软件包MDC_Manifest_Configurator-{version}-Ubuntu{osversion}.tar.gz所在目录下，执行如下命令解压软件包。

    tar -zxf MDC_Manifest_Configurator-{version}-Ubuntu{osversion}.tar.gz

    安装路径请勿包含中文和空格。

操作步骤

  1. 在MMC安装目录下，双击MMC软件图标 [image] ，启动软件。
  2. 在弹窗中的“Workspace”设置工作区的目录，再单击“Launch”，进入MMC首页。

    • 请勿将工作区设置在MMC安装目录或带有空格或特殊字符的目录下。
    • MMC不能与其他工具共用同一工作区。
    • 针对版本升级过的MMC，可能存在工作空间兼容性问题，建议创建新工作空间。

父主题： MDC Manifest Configurator 使用指南


了解MMC工作界面

MMC默认工作界面中包含了常用透视图，如图所示：

若在使用MMC过程中关闭了“MMC Explorer”、“Properties”或“Validation”，重新打开方法如下：

视图

用途

打开方式

MMC Explorer

工程资源管理视图b

“Window > Show View > MMC Explorer”a

Validation

Model、Schema校验结果查看视图

“Window > Show View > Validation”

Properties

属性查看和编辑视图

“Window > Show View > Properties”

Outline

大纲视图，主要用于拖拽式配置下的全景展示

“Window > Show View > Outline”
  • a：如果Show View的下拉菜单选项中没有“MMC Explorer”，可以选择“Other...”并搜索MMC Explorer获取界面入口。
  • b：针对MDC 510产品，不支持创建NrmConfig Project（网络配置工程）和ADSFI Project。

若在使用过程中需要复位MMC工具的初始视图界面，则可选择“Window > Perspective > Reset Perspective”即可恢复初始视图。

父主题： MDC Manifest Configurator 使用指南


开发AUTOSAR工程

本节介绍了如何使用MMC开发AUTOSAR工程。

请勿随意破坏或修改工程文件（如后缀为.project、.aird的文件），否则可能会导致工程不可用。

  • 拖拽式界面
  • 模块化界面
父主题： MDC Manifest Configurator 使用指南


拖拽式界面

MMC支持AP功能组件CM（Communication Management）和SM（State Management）模块的可视化快捷配置，使有联系的配置项的关系可视化，通过简单的界面操作快速生成CM等模块的通用配置，让用户聚焦于业务逻辑实现，简化通用配置步骤。

本节介绍在拖拽式界面开发AP配置文件的常用操作指导。

  • 功能概述
  • 创建AUTOSAR工程
  • 导入工程
  • 导入ARXML文件
  • 打开配置画布
  • 校验元素模型
  • 画布显示设置
  • 元素显示设置
父主题： 开发AUTOSAR工程


功能概述

在MMC拖拽式界面中，AP配置项都以图形方式呈现，界面提供了带有工具的画布，AP应用开发者可以在画布中通过对各元素的拖拽进行元素模型设计，使元素模型更加清晰，配置更加高效。

拖拽式配置界面介绍

以创建一个基础数据类型为例，介绍拖拽式配置界面包含的主要视图。

图1 拖拽式配置界面
表1 拖拽式配置界面图解
图标序号 | 视图名称 | 视图说明
1 | MMC Explorer | 拖拽式工程管理视图，包括拖拽式工程全目录和各模块画布入口。
2 | {ProjectName} {Modular} | 画布区域，将在此打开对应模块的画布，包括画布编辑工具和元素编辑工具。 该视图的名称由工程名称和打开的模块名称组成。 不同模块画布区域的图标有所不同，更多详细信息，请参见画布显示设置和元素显示设置。
3 | Properties | 元素属性配置视图。
4 | Outline | 整个画布的缩放全景。
父主题： 拖拽式界面


创建AUTOSAR工程

使用MMC工具进行开发时，首先需创建工程。本文介绍创建工程的操作步骤。

操作步骤

  1. 在顶部菜单栏，选择“File > New > AUTOSAR Project”。

  2. 在弹窗中设置工程名称，以cm为例。
  3. 单击“Finish”，完成工程的创建。

    默认生成如下目录，“default.arxml”为默认的ARXML文件名称，可通过右键菜单，重新设置名称。

    若工程中的文件或元素加载异常，可以右键单击目标工程，选择“Reload Semantic Resource”，重新加载资源。

后续操作

您可以根据需要执行对应操作。

  • 打开画布，进行拖拽式配置，具体操作请参考打开配置画布。
  • 进入模块化界面，进行模块化配置，更多信息请参见模块化界面。
父主题： 拖拽式界面


导入工程

本节介绍如何通过MMC的工程导入功能快速创建AUTOSAR工程，即将已有代码工程导入MMC后成为AUTOSAR工程，实现不同开发环境下工程的迁移。

操作步骤

  1. 在菜单栏中选择“File > Import”。
  2. 在弹窗中，选择需导入的工程文件类型，然后单击“Next”。

  3. 在“Import Projects from...”对话框中，选择要导入工程的路径，然后单击“Finish”。
父主题： 拖拽式界面


导入ARXML文件

创建工程后，可根据需要导入ARXML文件，可以是用户开发生成的ARXML文件，也可以是计算平台提供的ARXML文件。

前提条件

  • 若导入用户开发生成的ARXML文件，则已将其放置在上位机中。
  • 若导入计算平台提供的ARXML文件，请参见获取软件，获取SDK软件包。
  • ARXML文件所在路径不建议含有中文。
  • 不支持导入不符合AUTOSAR Adaptive Platform规范（19-11版本）的ARXML文件。
  • 对于熟悉AUTOSAR规范或了解计算平台的用户，可以直接导入平台提供的数据类型和Machine配置，以开发ARXML文件。
  • 导入ARXML文件数量不超过10000个，总大小不超过100MB。

操作步骤

  1. 在“MMC Explorer”视图中，右键单击目标工程，选择“Import...”。
  2. 在“Import”弹窗中选择“General > File System”。

  3. 单击“Next >”，在出现的新窗口中完成如下操作：

    1. 单击“Browse...”，选择ARXML文件所在路径，路径不建议含有中文。
    2. 在文件选择框中勾选所需ARXML文件。

      计算平台提供的ARXML文件说明如下所示。

      表1 “mdc_sdk_llvm/manifest”目录下

      配置文件

      说明

      common/data_type/mdc_data_type.arxml

      计算平台支持的数据类型。

      machine/host_ap_machine.arxml

      Machine定义。
    3. （可选）单击“Browse”更换目标工程。
    4. 单击“Finish”。

  4. 导入ARXML文件后，在“MMC Explorer”视图中展开目标工程查看已导入的ARXML文件；打开模块画布，查看各元素所处模块的配置。
父主题： 拖拽式界面


打开配置画布

操作步骤

  1. 右键单击目标ARXML文件下“AUTOSAR”或“HuaweiMDC”，在出现的快捷菜单中选择需要创建的画布。

    图1 AUTOSAR文件下分类

    图2 HuaweiMDC包下分类

    表1 画布菜单说明

    菜单项

    子项

    说明

    Service Interface

    服务接口配置画布的入口。

    SwComponent

    软件组件配置画布的入口。

    System & Machine

    Machine Design

    Machine设计配置画布的入口。

    Mode Declaration Group

    功能组配置画布的入口。

    Machine Manifest

    Machine部署、子网信息等配置画布的入口。

    Software Deployment

    Excutable

    可执行程序配置画布的入口。

    Process To Machine Mapping

    进程部署配置画布入的口。

    Service Instance Manifest

    Dds Deployment

    DDS协议通信部署配置画布的入口。

    Someip Deployment

    SOME/IP协议通信部署配置画布的入口。

    Service Instance (Table)

    服务实例列表画布的入口，画布将显示所有已创建的服务实例，并支持导出为CSV文件，在导出前需要确认目标工程已通过MMC校验，以免在CSV文件中引入特殊符号。

    Topo

    查看通信拓扑关系画布的入口。

    Data Type

    数据类型配置画布的入口。

  2. 在创建的画布中，将右侧工具栏中的元素拖至画布空白处，在所在ARXML文件下新建对应元素。

  3. 参考配置元素属性，配置元素的属性值。

配置元素属性

单击画布中目标元素，在下方“Properties”窗口将出现元素对应的属性配置页面，参考《AP配置项参考》，并结合实际业务需求配置属性。

父主题： 拖拽式界面


校验元素模型

MMC拖拽式配置界面提供了模型校验功能，且可以直接跳转至报错元素所在画布位置。

操作步骤

  1. 完成目标元素模型配置后，右键单击拖拽式界面画布空白处选择“Validate Diagram”。

  2. 双击目标校验项跳转至报错元素。

    • 部分关系型校验项暂时不支持跳转。
    • 在画布中被隐藏的元素报错将无法实现跳转，需要先取消隐藏才能正常跳转。

  3. 根据校验修改元素或元素属性，也可以在Constraints错误中搜索对应校验项的编号，参考对应校验项的解决方案。
父主题： 拖拽式界面


画布显示设置

单击画布空白处，画布上方将出现画布显示设置的工具栏。

表1 画布显示设置功能说明
功能图标 | 说明
 | 对全部未锁定的元素进行位置调整。
 | 对全部有连接的元素进行位置调整。
 | 选择当前画布中的所有元素。
 | 选择当前画布中所有节点间的连线。
 | 选择当前画布中所有不含连线的元素。
 | 刷新当前画布。
 | 下拉选择需要操作的图层，为了排版美观，部分画布会默认隐藏非关键元素图形，需要在此处勾选显示。
 | 下拉选择需要显示的元素类型，画布只显示同类元素。
 | 设置当前画布元素的隐藏或显示条件。
 | 锁定或解锁元素，排序命令无法生效于被锁定元素。
 | 设置画布模式。
 | 格式刷。
 | 放大画布显示比例。
 | 缩小画布显示比例。
 | 当前画布的显示比例，可以下拉选择所需显示比例。
 | 将当前画布另存为图像。
父主题： 拖拽式界面


元素显示设置

选中目标元素，画布上方将出现针对元素画布显示设置的工具栏。

表1 元素显示设置功能说明
功能图标 | 说明
 | 自动调整选中元素在画布中的位置。
 | 将选中元素向选择的方向对齐。
 | 元素间隔设置。
 | 连接线布局。
 | 锁定/解锁选中元素在画布中的位置。
 | 设置画布模式。
 | 格式刷。
 | 显示/隐藏选中元素。
 | 显示/隐藏选中标记。
 | 删除选中标记，如Note、Text等。
 | 删除选中元素。
 | 字体设置，包括加粗、斜体、颜色和类型。
 | 设置选中元素的背景颜色。
 | 设置选中元素的边框颜色。
 | 连接线的样式，可下拉选择支持的样式，并在画布上查看对应样式。
 | 设置自定义背景图片，图片必须已存在于拖拽式工程中，支持导入jpeg、png或gif格式的图片。
 | 恢复画布默认布局。
 | 所有选中元素的格式将和最后选中的元素格式统一。
 | 所有选中元素显示的长宽将和最后选中的元素统一。
 | 选中元素将根据所含字体大小自动调整全局大小。
父主题： 拖拽式界面


模块化界面

MMC基于平台推荐的AP（AUTOSAR Adaptive Platform）应用配置设计方案，提供Modular Configurator功能实现AP应用的模块化配置，简化操作，提升配置效率。

  • 功能概述
  • 基本操作
父主题： 开发AUTOSAR工程


功能概述

模块化（Modular Configurator）界面如图1所示，模块和配置说明请参考表1和表2。

模块化工作台

图1 模块模板选择界面
表1 模块配置入口说明
模块范畴 | 模块名称 | 配置入口说明
公共配置 | Core Types | 数据类型。
 | Communication Management | 通信框架，包括DDS和SOME/IP通信协议。
 | Execution Management | 启动方式。
功能组件 | State Management | 功能组管理。
 | Log & Trace | 日志管理。
 | Platform Health Management | 平台健康管理。
 | Persistency | 持久化功能。
 | Cryptography R19-11 Legacy | 密钥功能（适配AUTOSAR R19-11版本）。
 | Time Synchronization | 时间同步功能。
 | Update and Configuration Management | 更新和配置管理。
 | Network Management | 网络管理。
 | Diagnostic | 诊断功能。
 | Identity&Access Management | 身份管理与访问控制功能。
 | Cryptography R21-11 | 密钥功能（适配AUTOSAR R21-11版本）。

模块化配置界面

以“Core Types”模块配置界面为例，介绍模块化配置界面。

图2 模块化配置界面
表2 模块化配置界面说明

序号

区域说明

功能按钮/快捷键

功能说明

1

元素管理

  1. 选中目标元素类型，单击按钮新增目标类型元素，同时弹出ARPackage管理窗口。
  2. 在“Select ARPackage”弹窗中选择或添加目标ARPackage。

选中目标元素，单击该按钮，可创建一个与该元素相同的元素。

选中目标元素，单击该按钮，可删除元素。

展开或闭合全部元素目录。

升序或降序排列元素。

校验当前模块。

在右侧输入框内输入关键字，搜索指定元素。

2

元素配置

单击 [image] 新增目标子元素，或单击右侧 [image] 选择所需子元素。

选中目标元素，单击该按钮，可创建一个与该元素相同的元素。

选中目标元素，单击该按钮，可删除元素。

选中关联的元素后，单击该按钮，可跳转至关联元素的源头。

元素的删除、复制等操作还可以通过右键单击目标元素和元素目录实现。

相关功能概述

  • 操作的回退和重做
    • 支持通过快捷键“Ctrl+Z”或在上方菜单栏选择“Edit > Undo”回退当前操作。
    • 支持通过快捷键“Shift+Ctrl+Z”或在上方菜单栏选择“Edit > Redo”重新执行操作。
    • 该功能只作用于打开状态下的页签，如果关闭页签，下次打开无法回退至上次打开页签完成的操作。
    • 当对含子节点的元素或属性进行删除或复制操作时，该功能无法保证可恢复全部内容。
  • 避免无效配置

    在元素目录窗口或属性配置窗口进行配置时，对于已到达可配数量上限的元素，选中元素时 [image] 或 [image] 将显示置灰状态，即无效按钮。

  • 智能提示
    • 属性配置窗口支持tips功能，当鼠标悬浮静止在某个属性上时，将显示对应的属性说明。
    • 当“Short Name”命名重复时，简称字体将显红，并出现报错图标。
  • 按模块校验

    模块化界面支持配置校验范围，可以按照实际业务需求只校验所选模块或校验规约，校验方法请参考模块校验。

  • 全局搜索元素/属性

    模块化界面支持元素/属性搜索功能，且支持对搜索结果的跳转，搜索结果按模块分类。

父主题： 模块化界面


基本操作

本节将通过示例操作介绍模块化配置界面的常用操作。

  • 创建AUTOSAR工程
  • 导入ARXML文件
  • 打开模块配置界面
  • 创建AUTOSAR元素
  • 配置元素属性
  • 元素/属性索引
父主题： 模块化界面


创建AUTOSAR工程

使用MMC工具进行开发时，首先需创建工程。本文介绍创建工程的操作步骤。

操作步骤

  1. 在顶部菜单栏，选择“File > New > AUTOSAR Project”。

  2. 在弹窗中设置工程名称，以cm为例。
  3. 单击“Finish”，完成工程的创建。

    默认生成如下目录，“default.arxml”为默认的ARXML文件名称，可通过右键菜单，重新设置名称。

    若工程中的文件或元素加载异常，可以右键单击目标工程，选择“Reload Semantic Resource”，重新加载资源。

后续操作

您可以根据需要执行对应操作。

  • 打开画布，进行拖拽式配置，具体操作请参考打开配置画布。
  • 进入模块化界面，进行模块化配置，更多信息请参见模块化界面。
父主题： 基本操作


导入ARXML文件

创建工程后，可根据需要导入ARXML文件，可以是用户开发生成的ARXML文件，也可以是计算平台提供的ARXML文件。

前提条件

  • 若导入用户开发生成的ARXML文件，则已将其放置在上位机中。
  • 若导入计算平台提供的ARXML文件，请参见获取软件，获取SDK软件包。
  • ARXML文件所在路径不建议含有中文。
  • 不支持导入不符合AUTOSAR Adaptive Platform规范（19-11版本）的ARXML文件。
  • 对于熟悉AUTOSAR规范或了解计算平台的用户，可以直接导入平台提供的数据类型和Machine配置，以开发ARXML文件。
  • 导入ARXML文件数量不超过10000个，总大小不超过100MB。

操作步骤

  1. 在“MMC Explorer”视图中，右键单击目标工程，选择“Import...”。
  2. 在“Import”弹窗中选择“General > File System”。

  3. 单击“Next >”，在出现的新窗口中完成如下操作：

    1. 单击“Browse...”，选择ARXML文件所在路径，路径不建议含有中文。
    2. 在文件选择框中勾选所需ARXML文件。

      计算平台提供的ARXML文件说明如下所示。

      表1 “mdc_sdk_llvm/manifest”目录下

      配置文件

      说明

      common/data_type/mdc_data_type.arxml

      计算平台支持的数据类型。

      machine/host_ap_machine.arxml

      Machine定义。
    3. （可选）单击“Browse”更换目标工程。
    4. 单击“Finish”。

  4. 导入ARXML文件后，在“MMC Explorer”视图中展开目标工程查看已导入的ARXML文件；打开模块画布，查看各元素所处模块的配置。
父主题： 基本操作


打开模块配置界面

  1. 打开模块模板选择界面。

    • 方法一：右键单击目标工程，在出现的快捷菜单中选择“Modular Configurator”。
    • 方法二：选中目标工程，再单击界面上方工具栏 [image] 按钮。

  2. 在模块模板选择界面，找到所需的模块后，单击对应的Select。

    例如，单击“Core Types”模块的“Select”按钮。

父主题： 基本操作


创建AUTOSAR元素

以创建CompuMethod元素（即枚举数据类型Enum）为例，介绍创建AUTOSAR元素的操作步骤。

操作步骤

  1. 打开ARPackage管理窗口。

    选中元素管理窗口的目标元素类型，并单击上方 [image] 。

  2. 选择ARPackage。

    1. 在“Select ARPackage”弹窗中选中目标ARPackage。
    2. （可选）若需要新建ARPackage，可通过弹窗右上方功能按钮对本工程内的文件/ARPackage进行管理。

      功能按钮

      功能说明

      • ：展开当前工程所有目录。
      • ：闭合当前工程展开的目录。

      删除目标ARXML或ARPackage。

      • 新建ARXML/文件夹：选中工程或文件夹目录，单击 [image] 选择“Add ARXML”/“Add Folder”。
      • 新建ARPackage：选中目标ARXML或ARPackage，单击 [image] 选择“Add ARPackage”
    3. 确认选择无误，单击“OK”。

  3. 在元素管理窗口查看新建元素。

父主题： 基本操作


配置元素属性

以创建AUTOSAR元素中创建的CompuMethod元素为例，介绍如何进行元素属性的配置。

操作步骤

  1. 打开目标元素属性配置窗口。

    在元素管理窗口中单击已经创建的目标元素，将在右侧出现对应元素的属性配置窗口。

  2. 参考如下元素配置窗口说明，配置对应元素属性。

    图标序号

    区域说明

    1

    配置当前元素的属性值或修改所在ARPackage，属性包括简称等。

    2

    配置当前元素的子元素或聚合属性，并在此区域配置子元素/聚合属性的属性值。
    说明：
    • 元素配置窗口中带有*的属性为必配项，不带*的属性为选配项，具体的属性配置说明请参考《AP配置项参考》。
    • 属性配置过程中，“Short Name”列出现红色告警说明当前属性名称重复，其余属性报错可将鼠标悬浮至报错图标上查看报错原因。

父主题： 基本操作


元素/属性索引

  1. 单击工具界面右上角 [image] 按钮，在“Open Perspective”弹窗中选择“Artop”，并单击“Open”。
  2. 在界面上方工具栏中单击 [image] ，打开全局搜索窗口。
  3. 选择对应搜索范围的页签。

    • Short Name：按元素简称的关键字搜索。
    • Class Name：按类名的关键字搜索。

  4. 在页签下方输入框内输入关键字，并单击“Search”。
  5. 在窗口下方搜索结果中，选中需要跳转的对象，并单击“OK”。

    • 也可以双击搜索结果中的目标类名或者元素进行跳转。
    • 当搜素范围选择的是元素简称（Short Name），将同时打开元素管理窗口和属性编辑窗口。
    • 当搜索范围选择的是类名（Class Name），将跳转至元素管理窗口。

父主题： 基本操作


校验AUTOSAR工程

MMC提供了界面校验、命令行校验以及场景化校验三种方式，用户可根据实际需求选择合适的方式进行校验。

  • 界面校验
  • 命令行校验
  • 场景化校验
父主题： MDC Manifest Configurator 使用指南


界面校验

MMC提供了对ARXML文件的全量校验，以及在Model和Schema层面的可视化校验功能。其功能名称和说明如下。

  • Validate Model：全量校验。支持实时校验和一次性校验。
  • Module Validation As：基于AUTOSAR规范的模块校验。
  • Validate Schema：基于XSD文本层面校验，建议在ARXML文件配置完成并解决完Model报错后进行校验。
  • 全量校验
  • 模块校验
  • Schema校验
  • Validation视图使用
父主题： 校验AUTOSAR工程


全量校验

全量校验指校验工程的所有模块和所有元素，可校验ARXML文件是否符合基于AUTOSAR规范和计算平台实际业务定义的约束。全量校验包括实时校验和一次性校验。

前提条件

已完成ARXML文件的配置。

背景信息

  • 实时校验：在配置元素时，对该元素进行实时地全量校验。“Validation”视图实时显示校验结果，以便在配置过程中及时发现并更正错误。默认为关闭状态。
  • 一次性校验：配置完成后，全量校验一次工程。“Validation”视图显示对应的结果，如果配置发生变化，需手动再次执行校验操作。
    • 在同一开发环境下，校验时间与文件大小成正比。
    • 无论是否开启实时校验，当校验结果达到1000条时，将停止校验。
    • 开启或关闭实时校验功能，将作用于MMC工具内已存在的所有工程。
    • 针对Data Type的元素的配置，实时校验仅校验数据类型相关的规约。
    • 为了确保配置的正确性，即使开启了实时校验，配置完成依然需进行一次性校验。

操作步骤

  1. 打开MMC工具后，如需开启实时校验功能，单击工具栏 [image] 按钮。
  2. 配置工程过程中，可在“Validation”视图中，查看实时校验结果，并参考Constraints错误修正错误。

    • 在“Validation”视图查看校验结果时，若手误关闭该视图，可选择“Window > Show View > Other > Validation”重新打开。
    • “Validation”视图相关操作说明，请参考Validation视图使用。

  3. （可选）如需关闭实时校验功能，再次单击 [image] 按钮。
  4. 完成工程配置后，选择目标工程进行一次性校验。

    • 方法一：单击工具栏 [image] 按钮。
    • 方法二：右键单击目标工程，在右键菜单中，选择“Validation > Validate Model”。

    校验结束后可在界面下方“Validation”视图中查看校验结果。

  5. 根据错误描述并参考Constraints错误，修改配置。
  6. 重复步骤4~5，直至“Validation”视图中无报错。
父主题： 界面校验


模块校验

您可以根据业务需要，就指定的检验模块，配置校验模板，然后对工程执行对应的校验，以基于AUTOSAR规范和计算平台实际业务定义，校验ARXML文件是否符合指定模块下的约束。

前提条件

已完成ARXML文件的配置。

步骤一：配置模块校验的模板

  1. 选中目标工程，并单击工具栏中 [image] 右侧的 [image] 按钮。
  2. 在显示的下拉框中选择“Validate Module Configuration...”，打开模块校验模板的配置窗口。

  3. 在“ModeValidation Configurations”弹窗中，配置模块校验模板。

    默认的模板“All Module Configuration”包含了所有校验模块。您可以根据业务需要，参考以下步骤，创建所需校验模块的模板。

    1. 单击工具栏上的 [image] 按钮，然后在输入框内，输入模板名称，例如CM Validation。
      • 模板名称不可与已有名称重复，不支持@、&、斜线、冒号、星号、引号、和问号。
      • 模板名称长度不超过256个字符。

    2. 在右侧的“Select Validation Modules”列表下，选择要校验的模块。

      操作说明如下表所示。

      项目

      说明

      Select Validation Modules

      选中或取消选中下方列表的所有模块。

      Cancel

      取消当前操作，直接关闭配置窗口。

      Revert

      回退到上一次保存状态。

      Save

      保存当前配置。

      Validation

      保存配置，并执行对应配置的分模块校验。
    3. （可选）管理模块校验模板。

      您可以根据业务需要，参考以下说明，管理模板。

      • 添加：单击工具栏上的 [image] 按钮，参考上述步骤，再次添加模块校验模板。
      • 复制：选中需复制的模板后，单击 [image] 按钮。
      • 删除：选中需删除的模板后，单击 [image] 按钮。
      • 搜索：在搜索框内输入关键字，搜索含有关键字的模板名称。
      • 修改模板名称：双击要修改名称的模板。

  4. （可选）查看模块校验的校验项目。

    配置模块校验模板时，您可以查看各个模块的校验项目，以及对应的规约。

    1. 在“ModeValidation Configurations”弹窗中，单击“Select Validation Modules”旁的 [image] 按钮。
    2. 在“Constraint Informationt”弹窗中，选择要查看的规约后，在“Detailed Description”查看规约描述。

      关于规约的更多详细信息，请参见Constraints错误。

    3. 单击“OK”，关闭“Constraint Informationt”弹窗。

步骤二：添加模板至Favorties

  1. 单击工具栏中 [image] 右侧的 [image] 按钮，在下拉框中选择“Organize Favorites...”。
  2. 在“Organize Validate Module Favorites”弹窗中，单击“Add”。

  3. 在“Add Validate Module Favorites”弹窗中，选择并添加模块校验的模板。

  4. （可选）在“Orgnize Validate Module Favorites”弹窗中，管理模块校验的模板。

    选中对应的模板后，单击对应按钮执行对应操作。

    • Remove：移除选中的模板，快捷下拉框中将不再显示该模板。
    • Up：将选中的模板上移一个位置。
    • Down：将选中的模板下移一个位置。

  5. 单击“OK”，完成配置。

步骤三：执行模块校验

  1. 您可以选择以下方式，执行模块化校验。

    • 在界面上方，单击工具中模块校验按钮 [image] 右侧的 [image] 按钮，并在下拉框中选择要执行的模板。

    • 右键单击目标工程后，在下拉框中，选择“Validation > Module Validation As”，再选择要执行的模板。
    • 执行模块化校验后，在快捷下拉框中将显示Favorites和历史最近执行过的模板，最多显示10个。
    • Favorites中的模板优先级高于历史执行模板。例如，您添加了10个模板至Favorites，下拉框中将不显示历史执行过的模板。

  2. 在“Validation”视图中查看校验结果，双击报错项还能定位到报错具体位置。
父主题： 界面校验


Schema校验

本节介绍了如何使用MMC对已完成配置的ARXML文件进行校验，找出文件中违反Schema规则的配置项。

前提条件

已存在完成配置的ARXML文件。

操作步骤

  1. 在MMC界面的“MMC Explorer”视图中，选中目标工程，并单击工具栏 [image] 按钮，进行Schema校验。

    校验结束后可在界面下方“Validation”视图中查看校验结果。

    MMC界面默认打开“Validation”视图，若手误关闭，可选择“Window > Show View > Validation”重新打开。

  2. （可选）若需要定位告警位置，请参考Validation视图使用。
  3. 参考Schema告警，找到分析对应告警原因，根据相应解决方法在告警的具体位置进行修改。
父主题： 界面校验


Validation视图使用

模块化界面和拖拽式界面都支持“Validation”视图的使用，该视图支持校验结果的展示、报错位置的跳转、校验结果的排序和分类等。

“Validation”视图显示的校验报错项数量上限是1000条（Errors、Warnings和Infos总和），如果错误项较多请先处理已显示的报错项。

“Validation”视图如上图所示，可以通过下表了解视图所支持的功能。

图标序号

区域说明

功能

说明

1

工具栏

（Errors）

显示错误级别校验项的数量，单击只显示/隐藏错误级别的校验结果，处理优先于Warnings和Infos。

（Warnings）

显示告警级别校验项的数量，单击只显示/隐藏告警级别的校验结果，处理优先于Infos。

（Infos）

显示提示级别校验项的数量，单击只显示/隐藏提示级别的校验结果。

用于过滤校验结果，可选：

  • Filter By Project：根据工程过滤，在弹窗中选择目标工程。
  • Filter By Arxml：根据ARXML文件过滤，在弹窗中选择目标ARXML。
  • Clean Filter：取消过滤。

用于选择校验结果的显示方式，可选：

  • Group By Error Code：按所属校验项分类。
  • Group By Model Category：按元素类型分类。

用于清空当前窗口所有校验结果，也可通过视图右上角 [image] 按钮实现。

用于导出当前窗口的所有校验结果，也可通过视图右上角 [image] 按钮实现。

根据输入的关键字搜索目标校验结果。

2

校验结果显示栏

Go To

右键单击目标校验结果，在快捷菜单中选择后将跳转至报错的具体位置（模块化界面）。

Copy Detail

右键单击目标校验结果，在快捷菜单中选择后将拷贝当前报错项的所有信息。

Properties

右键单击目标校验结果，在快捷菜单中选择后将打开报错属性窗口，包括具体报错信息、当前校验结果的时间、报错元素所属文件及文件中具体位置和校验项当前状态等。
父主题： 界面校验


命令行校验

MMC安装包中提供了校验功能脚本“validate.sh”，便于通过命令行方式快速校验ARXML文件。

操作步骤

  1. 在MMC软件包安装目录下打开Terminal。
  2. （可选）执行命令./validate.sh --help，查看命令使用方法。

    [info] current system is ubuntu 20.04
Description: This shell script is used to validate file.

Usage:
    -i <args> -o <arg> -e <args>
    -i,--input   <args>   arxmls directory or arxml path
    -o,--output  <arg>    output directory
    -e,--exclude <args>   the arxmls directory or arxml to be excluded
    -h,--help show the help description
Example:
    ./validate.sh -i $arxml_path -o $output_path
    ./validate.sh -i $arxml_path1 $arxml_path2 -o $output_path
    ./validate.sh -i $arxml_path -o $output_path -e $arxml_subpath

Note:
    The directory containing special characters such as spaces and Chinese characters is not supported.
    This shell script should run on ubuntu "20.04".

    根据执行命令后的回显，可知校验ARXML文件的命令格式为./validate.sh -i $arxml_folder [-o $output_file][-e $exclude_file]

    命令中的参数说明，如下表所示。

    命令参数

    参数值

    是否必选

    参数说明

    -i或--input

    $arxml_folder

    是

    输入待校验的ARXML文件或文件夹路径。

    若只输入文件名，则表示带校验的文件位于执行命令所在的目录。

    -o或--output

    $output_file

    否

    输出校验结果的文件或文件夹路径。

    如果不配置该参数，则校验结果仅显示在Terminal界面。

    -e或--exclude

    $exclude_file

    否

    过滤待校验文件目录中的指定文件或文件夹路径。

  3. 校验ARXML文件。

    根据命令格式，参考步骤2的参数说明，执行命令。

    命令示例：./validate.sh -i ~/manifest -o ~/output -e ~/manifest/default.arxml

    示例说明：校验“~/manifest”路径下除“~/manifest/default.arxml”以外的所有文件，输出的校验结果位于路径“~/output/”下。

  4. 在回显中查看校验结果。

    以执行命令./validate.sh -i demo.arxml为例，校验当前执行命令路径下的文件，结果参考如下。

    • 有报错，回显如下：
      Start validation
[Schema.WARNING], file:  demo_error.arxml, line: 11, column:  50, "message: cvc-pattern-valid: Value 'nameapace?' is not facet-valid with respect to pattern '[a-zA-Z][a-zA-Z0-9_]*' for type 'IDENTIFIER--SIMPLE'. (cvc-pattern-valid: Value 'nameapace?' is not facet-valid with respect to pattern '[a-zA-Z][a-zA-Z0-9_]*' for type 'IDENTIFIER--SIMPLE'., 11, 50)"
[Schema.WARNING], file:  demo_error.arxml, line: 11, column:  50, "message: cvc-complex-type.2.2: Element 'SHORT-NAME' must have no element [children], and the value must be valid. (cvc-complex-type.2.2: Element 'SHORT-NAME' must have no element [children], and the value must be valid., 11, 50)"
[Model.ERROR], file:/home/mdc/MDC_Manifest_Configurator-*.*.*-*-Ubuntu20/demo_error.arxml#/ARRoot/serviceInterface/event?type=VariableDataPrototype, The required feature 'type' of 'event' must be set
Validate schema failed. WARNING: 2
Validate model failed. ERROR: 1

      根据报错信息，打开对应文件（demo.arxml），找到报错行（line: 11, column: 50），即下文加粗字段，再依据报错提示对目标字段进行修改。

      <?xml version="1.0" encoding="UTF-8"?>
<AUTOSAR xmlns="http://autosar.org/schema/r4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://autosar.org/schema/r4.0 AUTOSAR_00048.xsd">
  <AR-PACKAGES>
    <AR-PACKAGE UUID="77752b3d-8713-49ac-bd6f-e3711fd5bf55">
      <SHORT-NAME>ARRoot</SHORT-NAME>
      <ELEMENTS>
        <SERVICE-INTERFACE>
          <SHORT-NAME>serviceInterface</SHORT-NAME>
          <NAMESPACES>
            <SYMBOL-PROPS>
              <SHORT-NAME>nameapace?</SHORT-NAME>
              <SYMBOL>ara</SYMBOL>
            </SYMBOL-PROPS>
          </NAMESPACES>
          <EVENTS>
            <VARIABLE-DATA-PROTOTYPE>
              <SHORT-NAME>event</SHORT-NAME>
            </VARIABLE-DATA-PROTOTYPE>
          </EVENTS>
        </SERVICE-INTERFACE>
      </ELEMENTS>
    </AR-PACKAGE>
  </AR-PACKAGES>
</AUTOSAR>
    • 无报错，回显如下：
      Start validation
Validate schema successfully.
Validate model successfullly.

父主题： 校验AUTOSAR工程


场景化校验

在设计完所需的通信路径后，用户可通过CM通路检查功能，对通信路径进行校验，验证通信路径的两端是否能通信。

前提条件

已完成通信路径的开发。以CM通信部署为例，具体参见“通信部署（CM）”章节。

操作步骤

  1. 启用CM通路检查功能，进入校验模式，有如下两种方式：

    • 方式一：
      1. 右键单击目标工程，在下拉菜单中选择“PingTool”，在工具界面下方打开“PingTool”界面。

      2. 单击“ProviderInstance”行后方的 [image] ，在弹框中选择需校验的发送端。

        当左侧选择的instance被部署到多个process时，可在右侧选择需校验的process。

      3. 单击“RequiredInstance”行后方的 [image] ，在弹框中选择需校验的接收端。

    • 方式二：
      1. 右键单击目标工程的ARXML文件下的AUTOSAR，在下拉菜单中选择“Service Instance Manifest > Topo”，进入Topo画布。

      2. 右键单击Topo画布上的通信连线，在下拉菜单中选择“PingTool”。

  2. 在“Description”栏中查看结果。

    • 若有异常，则会显示对应报错信息。
    • 若没有异常，则会显示一条校验通过的信息。

  3. 显示问题源。

    1. 单击 [image] 展开报错信息。
    2. 查看并双击对应的“Elements”栏报错提示信息。

    3. 跳转至问题位置，并高亮显示。

  4. 修改问题。

    完成问题修改后，会自动重新校验这条通路，并根据新的校验结果在“Description”栏给出新的提示信息。

  5. 完成问题修改。

    所有问题都修改完成后，在“Description”栏会显示校验成功的提示。

父主题： 校验AUTOSAR工程


重构模型

MMC提供了模型重构功能，通过创建复合Process，关联Machine，并添加其他Process的组件用于重构模型。

前提条件

  • 已创建AUTOSAR工程，本章节以工程名“demo”为例介绍复合Process的创建。
  • 已完成AUTOSAR工程的开发，并将开发完成的配置文件导入或放置于工程名为“demo”的工程下。

操作步骤

  1. 右键单击目标工程名，选择“New > New Composition Process”。

  2. 设置组件名称以及路径。

    1. 单击“Browse...”，选择组件所在路径，默认为当前工程目录。
    2. “Component name”输入组件名称，本章节以my_sample为例。
    3. 单击“Finish”。

    生成组件及其元素如下图所示：

  3. 关联Machine。

    1. 右键单击“my_sample”组件下的复合Process“MySampleProcess”，选择“Autosar Tools > Deploy To Machine”。

    2. 选择需要关联的Machine，单击“Finish”。

      支持通过输入Machine名称快速匹配需要关联的Machine。

      在Process元素“MySampleProcess”下方会生成processToMachineMapping，如下图所示：

  4. （可选）添加其他Process的组件用于重构。

    1. 右键单击“my_sample”组件下的复合Process“MySampleProcess”，选择“Autosar Tools > Add Components”。

    2. 选择需要的Process，选择如下方式进行重构：
      • 如果不希望修改组件Process的源文件，可以选择“Copy”，并单击“Finish”。

        在“my_sample”组件的“Process”以及“Service”下会自动复制所需Process的stateDependentStartupConfig元素、CM模块元素（ServiceInstanceToPortPrototypeMapping、ServiceInstanceToMachineMapping和serviceInstance）以及Per模块元素（PersistencyKeyValueDatabase、PersistencyPortPrototypeToKeyValueDatabaseMapping、PersistencyFileArray、PersistencyPortPrototypeToFileArrayMapping）。

      • 如果需要修改组件Process的源文件，则选择“Move”，并单击“Finish”。

        在“my_sample”组件的“Process”以及“Service”下会移植所需Process的stateDependentStartupConfig元素、CM模块元素（ServiceInstanceToPortPrototypeMapping、ServiceInstanceToMachineMapping和serviceInstance）以及Per模块元素（PersistencyKeyValueDatabase、PersistencyPortPrototypeToKeyValueDatabaseMapping、PersistencyFileArray和PersistencyPortPrototypeToFileArrayMapping）。

      • 支持通过输入Process名称快速匹配需要的Process。
      • 通过“Console”控制台中可查看合并至该复合Process“MySampleProcess”的元素。
      • 合并至该复合Process的StartupConfig的子元素TagWithOptionalValue、StartupOption以及EnterExitTimeout的属性值需手动配置。

父主题： MDC Manifest Configurator 使用指南


比较模型

MMC支持通过界面比较功能比较模型之间的差异，并通过命令行方式输出差异报告。

  • 界面比较
  • 命令行差异报告输出
父主题： MDC Manifest Configurator 使用指南


界面比较

MMC提供界面比较功能，通过该功能可以比较工程、文件夹、文件或元素间的差异，并针对差异进行合并，输出差异报告。

由于上述比较的操作类似，本章节以工程比较为例进行介绍。

前提条件

已完成2个工程的配置。

操作步骤

  1. 在“MMC Explorer”视图中按住“Ctrl”键，依次选择2个工程，单击鼠标右键，选择“Model Compare > Each Other”，进入比较界面。

    比较界面如下图所示：

  2. 在差异导航视图中选择差异元素，在差异比较视图中查看具体差异。

    差异导航视图中的差异元素左侧会存在如下标识，表示不同类型的变更。

    表1 差异元素标识说明

    图标

    说明

    示例

    加号

    右侧待比较文件与左侧待比较文件相比，该元素/属性为新添加的元素/属性。

    减号

    右侧待比较文件与左侧待比较文件相比，该元素/属性为删除的元素/属性。

    三角符号

    右侧待比较文件与左侧待比较文件相比，该元素/属性存在变更，或该元素/属性存在属性值。

    • 若仅需查看左侧工程和右侧工程中的差异，完成查看后可单击“Cancel”或右上角 [image] 退出SDK版本差异界面。
    • 若需将需要的变更同步至工程中的ARXML配置文件中，则执行3~5。

  3. 根据实际需要，选择元素并合并变更。

    表2 工具栏说明

    图标

    说明

    / [image] /

    • ：显示从左向右合并的结果。
    • ：显示从右向左合并的结果。
    • ：不显示更改的结果。

    该元素/属性从左向右合并变更。

    单击此图标后，目标元素的标识由 [image] 变为 [image] ，并跳转至下一个差异元素。

    该元素/属性从右向左合并变更。

    单击此图标后，目标元素的标识由 [image] 变为 [image] ，并跳转至下一个差异元素。

    所有元素从左向右合并变更。

    所有元素从右向左合并变更。

    跳转至下一个差异元素。

    跳转至上一个差异元素。

    跳转至下一个未解决的差异。

    跳转至上一个未解决的差异。

    /

    展开/折叠差异导航视图中的所有变更点。

  4. （可选）导出差异报告。

    1. 单击 [image] ，进入导出差异报告界面。
    2. 选择导出路径，并输入差异报告名称，单击“保存”。

  5. 单击“Commit”，提交变更，此时工程中的ARXML配置文件会随之更改。
  6. （可选）进入差异报告所在目录，打开差异文件，查看具体差异。

父主题： 比较模型


命令行差异报告输出

MMC安装包中提供了差异比较脚本“diff_report.sh”，便于通过命令行方式生成差异报告并进行查看。

  1. 在MMC软件包安装目录下打开Terminal。
  2. 参考如下命令格式，执行命令并生成差异报告。

    表1 命令格式说明

    命令格式

    说明

    示例

    ./diff_report.sh -l <filepath1> -r <filepath2> -o <filepath3>

    比较文件夹/文件，并生成差异报告。

    ./diff_report.sh -l /home/mdc/sample -r /home/mdc/demo -o ./

    ./diff_report.sh -l /home/mdc/sample/sample.arxml -r /home/mdc/demo/demo.arxml -o ./
    表2 命令参数说明

    参数a

    说明

    -l <filepath1>

    左侧待比较文件夹/文件。<filepath1>为左侧待比较文件夹/文件的绝对路径。

    -r <filepath2>

    右侧待比较文件夹/文件。<filepath2>为右侧待比较文件夹/文件的绝对路径。

    -o <filepath3>

    输出差异报告。<filepath3>为差异报告路径，生成的差异报告名称为“diff_report.html”。

    a：用“<>”括起来的部分在命令书写时需替换为具体的内容，同时去掉括号。

  3. 进入差异报告所在目录，打开“diff_report.html”文件，查看具体差异。

    表3 差异比较文件说明

    参数

    说明

    Left: <filepath>

    左侧待比较文件夹/文件。其中<filepath>为左侧待比较文件夹/文件的绝对路径。

    Right: <filepath>

    右侧待比较文件夹/文件。其中<filepath>为右侧待比较文件夹/文件的绝对路径。

    +-/-+/<>/~
    • +-：左侧待比较文件夹/文件中新增元素。
    • -+：左侧待比较文件夹/文件中删除元素。
    • <>：左侧待比较文件夹/文件中元素的属性变更。
    • ~：左侧待比较文件夹/文件中的元素位置变更。

父主题： 比较模型


导出工程或ARXML文件

工程校验通过后，根据业务需要，可导出工程，也可以全量导出或选择指定类型的元素导出ARXML文件，以便后续查看或开发。

前提条件

已成功校验工程。

导出工程

  1. 右键单击目标工程，并选择“Export...”。
  2. 在“Export”弹窗中，选择要导出的文件类型，再单击“Next”。

  3. 在“Export”弹窗中，选择要导出的文件和导出的文件路径，然后单击“Finish”。

导出全量配置文件

由拖拽式界面导出的配置文件不支持在同一工程内再次导入（即不可再次导入“manifest”工程），只能创建新的AUTOSAR工程再次导入。

  1. 右键单击目标工程，并选择“Export...”。
  2. 在“Export”弹窗中选择“General > File System”。
  3. 在“File system”区域，选择导出文件和目录。

  4. 单击“Finish”，将文件导出至指定目录下。

导出指定元素

该功能仅导出元素，不支持导出元素间的关联关系。

  1. 在“Autosar Browser”视图中，找到目标工程元素的指定类型，例如“DataType”，右键单击该类型，再单击“Export”。

    如果已关闭“Autosar Browser”视图，可开菜单栏选择“Window > Show View > Other...”，打开该视图。

  2. 在弹窗中，选择要导出的路径，完成导出操作。

后续操作

您可以将导出的配置文件用于后续开发，更多信息，请参见《MDC Development Studio 使用指南》的“创建MDC工程”章节。

父主题： MDC Manifest Configurator 使用指南


AP配置示例

本章节以模块化和拖拽式配置方式介绍AP典型配置示例。

本章节仅介绍元素的配置操作，元素属性的详细说明请参见工具适配的MDC计算平台设备对应产品文档中“参考信息 > AP配置项参考”。

  • 创建AUTOSAR工程
  • 通信部署（CM）
  • 状态管理（SM）
  • 持久化（PER）
父主题： MDC Manifest Configurator 使用指南


创建AUTOSAR工程

使用MMC工具进行开发时，首先需创建工程。本文以创建一个名为cm的工程为例，介绍创建工程的操作步骤。

操作步骤

  1. 在顶部菜单栏，选择“File > New > AUTOSAR Project”。

  2. 在弹窗中设置工程名称，以cm为例。
  3. 单击“Finish”，完成工程的创建。

    默认生成如下目录，“default.arxml”为默认的ARXML文件名称，可通过右键菜单，重新设置名称。

    若工程中的文件或元素加载异常，可以右键单击目标工程，选择“Reload Semantic Resource”，重新加载资源。

后续操作

根据业务需要创建所需的工程后，可根据业务需要，选择要开发的特性，进行项目开发。

  • 通信部署（CM）：下文将以工程目录为“cm/default.arxml/HuaweiMDC”的工程为例，介绍基于该工程进行CM开发的操作步骤。
  • 状态管理（SM）：下文将以工程目录为“sm/mdc_mode_declaration.arxml/HuaweiMDC”的工程为例，介绍基于该工程进行SM开发的操作步骤。
  • 持久化（PER）：下文将以工程目录为“Per/default.arxml/HuaweiMDC”的工程为例，介绍基于该工程进行PER开发的操作步骤。

如需跨特性引用元素，则需将各个特性建在同一个项目中。

父主题： AP配置示例


通信部署（CM）

CM（Communication Management）模块即通信管理模块，用于构建和监督各应用程序之间面向服务（服务端-客户端）的通信，为应用程序提供进程间通信机制，包括DDS协议通信和SOME/IP协议通信，以及端到端（E2E）的通信保护库，如两个APP之间的传输数据类型、传输方式和依赖的通信协议等。

可以使用MMC的模块化界面和拖拽式界面，以进行通信部署的配置。

  • 本章节仅介绍MMC工具的配置操作步骤和元素的关键信息，元素属性的详细说明，请参见工具适配的MDC计算平台设备对应产品文档中“AP配置项参考 > CM配置项”章节。
  • 本章节配置的参数值均为示例，仅供演示操作。实操过程中，需根据实际业务场景为参数定义正确的值。
  • 配置流程
  • 拖拽式界面配置示例
  • 模块化界面配置示例
父主题： AP配置示例


配置流程

CM配置流程涵盖定义数据类型、子网信息、服务接口、部署通信等步骤，图1为计算平台推荐的AP应用配置流程，拖拽式和模块化界面配置操作步骤略有不同，具体配置说明请参考表1，下文将以此推荐步骤介绍AP应用的配置流程。

图1 CM配置流程
表1 CM配置流程说明
任务描述 | 定义元素 | 关联元素 | 拖拽式界面配置流程 | 模块化界面配置流程
定义基础数据类型。 | StdCppImplementationDataType | - | 定义数据类型 | 定义数据类型
定义服务接口，包括传输的数据类型和数据的传输形式。 | ServiceInterface、VariableDataPrototype、Field、ClientServerOperation | StdCppImplementationDataType | 定义服务接口 | 定义服务接口
定义子网信息，配置Machine（物理机或虚拟机）地址和网络地址。 | Machine、MachineDesign | EthernetCluster | 定义子网信息 | 定义子网信息
将DDS通信域和SOME/IP服务中心分别与目标Machine关联。 | EthernetCommunicationConnector、SomeipServiceDiscovery | MachineDesign | 关联子网信息 | 关联子网信息
部署通信方式，包括DDS和SOME/IP通信协议。 | DdsServiceInterfaceDeployment/SomeipServiceInterfaceDeployment | ServiceInterface、VariableDataPrototype/Field/ClientServerOperation | 部署通信协议 | 部署通信协议
定义AP应用组件，并创建对应组件上的发送/接收端口。 | AdaptiveApplicationSwConponentType、PPortPrototype、RPortPrototype | - | 定义可执行程序和进程设计 | 定义可执行程序和进程设计
定义可执行程序，并关联目标AP应用组件。 | Executable、ProcessDesign | AdaptiveApplicationSwConponentType
在目标Machine内选择可执行程序，创建对应进程。 | Process | Executable、PPortPrototype、RPortPrototype | 定义应用进程信息 | 定义应用进程信息
定义应用通信保护库，用于定位软硬件故障源，需要与服务实例关联。 | E2EProfileConfiguration | DdsServiceInstance/SomeipServiceInstance | 暂不支持 | （可选）定义通信保护库
定义TLS配置。 | CryptoServicePrimitive、CryptoServiceCertificate、CryptoServiceKey、TlsSecureComProps | - | 暂不支持 | （可选）配置TLS
创建服务实例，连接收发端口，保证服务端与客户端的通信。 | DdsServiceInstance/SomeipServiceInstance | E2EProfileConfiguration | 创建通信服务实例 | 创建通信服务实例
配置SOME/IP序列化。 | ApSomeipTransformationProp、TransformationPropsToServiceInterfaceElementMapping、DataPrototypeInServiceInterfaceRef | - | 暂不支持 | （可选）配置SOME/IP序列化属性
配置S2S通信。 | PduTriggering、SoAdConfig、SocketAddress、SocketConnectionBundle、SystemSignal、ISignal、ISignalIPdu、ISignalTriggering、PduTriggering、ServiceInstanceToSignalMapping、DataPrototypeInServiceInterfaceRef | - | 暂不支持 | （可选）定义Service2Signal通信
父主题： 通信部署（CM）


拖拽式界面配置示例

以配置简单的摄像头数据收发实例为例，介绍如何在拖拽式界面配置CM通信实例。

  • 定义数据类型
  • 定义服务接口
  • 定义子网信息
  • 关联子网信息
  • 部署通信协议
  • 定义可执行程序和进程设计
  • 定义应用进程信息
  • 创建通信服务实例
  • 校验工程
  • 导出配置文件
    工程校验通过后，您可以将配置文件导出，以进行后续的开发。
父主题： 通信部署（CM）


定义数据类型

配置CM框架时，需要先定义应用通信时传输的数据类型。根据业务需要，可创建不同的数据类型，例如整型（Int32）、字符串（String）、结构体（Structure）等。创建结构体时，需先创建该结构体成员的数据类型。

本文以定义传输摄像头数据涉及到的数据类型为例，介绍创建数据类型的操作步骤。

背景信息

本文示例创建的数据类型包括：

数据类型 | 简称（Short Name） | 说明
Int32 | timeStamp | 时间戳。
Boolean | validaFlag | 有效性标识。
String | dataFlow | 数据流。
Structure | CameraDataType | 摄像头数据类型。 上述三个数据类型为该结构体的成员。

操作步骤

  1. 在“MMC Explorer”视图中，右键单击“cm/default.arxml/HuaweiMDC”选择“Data Type”，打开“new Data Type”画布。

    创建的数据类型元素将显示在所选择的包下，下文示例创建的数据类型都将显示在“cm/default.arxml/HuaweiMDC”包目录下。

  2. 创建数据类型（Int32、Boolean和String）。

    1. 将“Data Type”工具栏中的数据类型，分别拖拽至画布空白处，并在对应的“Properties”窗口中，设置“Short Name”。

      Data Type

      Short Name

      Value

      int32_t

      Value

      bool

      String

      String
    2. 将“Data Type”工具栏中的“Reference”，分2次拖拽至画布空白处，并在对应的“Properties”窗口中，设置“Short Name”和“Type Reference”。

      Data Type

      Short Name

      Type Reference

      Reference

      Int32

      int32_t

      Reference

      Boolean

      bool

  3. 创建数据结构（Structure）。

    1. 将“Structure”工具栏中的“Structure”拖至画布空白处，“Short Name”设置为CameraDataType。
    2. 将“Structure”工具栏中的“Element”，分三次拖至“CameraDataType”中，并在对应的“Properties”窗口中完成配置。

      Short Name

      Type Reference

      说明

      timeStamp

      Int32

      时间戳

      单击“...”，然后选择步骤2创建的对应数据类型。

      validaFlag

      Boolean

      有效性标识

      dataFlow

      String

      数据流

  4. 完成以上配置后，在“MMC Explorer”视图中，展开工程包目录，查看元素树形结构。

父主题： 拖拽式界面配置示例


定义服务接口

定义数据类型后，可以创建服务接口，为服务接口引用已创建的数据类型，并定义数据的传输方式，以完成定义通信所需的服务接口。

本文以定义一个摄像头数据的服务接口“CameraDataServiceInterface”为例，介绍定义服务接口的操作步骤。该接口通过Event方式传输数据。

前提条件

已为接口定义数据类型。

本文示例接口定义的数据类型为“CameraDataType”。具体操作，请参见 定义数据类型。

操作步骤

  1. 在“MMC Explorer”视图中，右键单击“cm/default.arxml”下的“AUTOSAR”，选择“Service Interface”，打开“new Service Interface”画布。
  2. 将“Service Interface”工具栏中的“Service”拖拽至画布空白处，并在对应的“Properties”窗口中，设置“Short Name”为CameraDataServiceInterface。

  3. 将“Contents”工具栏中的“Event”拖至“CameraServiceInterface”的“Events”栏下，并在“Properties”窗口中完配置。

    属性

    说明

    示例

    Short Name

    输入Event的简称。

    CameraData

    Type

    单击“...”，然后选择引用已定义的数据类型。

    CameraDataType

  4. 完成以上配置后，在“MMC Explorer”视图中，展开工程包目录，查看元素树形结构。

父主题： 拖拽式界面配置示例


定义子网信息

配置CM通信框架时，需配置子网信息。通过拖拽式工具的SubNet元素，创建网络端口，配置Machine（物理机和虚拟机）IP地址、子网掩码等子网信息。

本文以创建一个名为Host0NetworkEndpoint的网络端口为例，介绍定义子网信息的操作步骤。

操作步骤

  1. 在“MMC Explorer”视图中，右键单击“cm/default.arxml”下的“AUTOSAR”，选择“System & Machine > Machine Design”，打开“new Machine Design”画布。
  2. 将“Network”工具栏下的“SubNetwork”拖至画布空白处，并在对应的“Properties”窗口中，设置“Short Name”为Host0EthernetPhysicalChannel。
  3. 单击 [image] ，在对应“Properties”窗口中，参考下图，根据业务需要，完成子网信息配置。

    属性

    说明

    示例

    Short Name

    网络端口的简称。

    Host0NetworkEndpoint

    ipv4 address

    IP地址。

    192.168.10.6

    Network Mask

    子网掩码。

    255.255.255.0

    MulticastIp

    组播地址。

    239.192.255.123

后续操作

定义子网信息后，根据要部署的通信协议，将子网信关联至对应的Machine上。具体操作，请参见：

  • 关联子网信息和DDS通信域
  • 关联子网信息和SOME/IP服务中心
父主题： 拖拽式界面配置示例


关联子网信息

根据业务需要，选择所需的通信方式，定义通信协议，并与目标Machine关联。通信部署支持的协议包括DDS和SOME/IP，更多信息，请参见工具适配的MDC计算平台设备对应产品文档中“基础特性开发指南 > CM开发指南”章节。

关联子网信息前，需先创建MachineDesign，配置以太网接口和网络端口，然后创建Machine并引用MachineDesign。

下文分别介绍将已定义的子网信息与DDS通信域和SOME/IP服务中心进行关联。

  • 关联子网信息和DDS通信域
  • 关联子网信息和SOME/IP服务中心
父主题： 拖拽式界面配置示例


关联子网信息和DDS通信域

本文以创建一个名为Host0DpMachine的Machine为例，通过引用对应的MachineDesign，介绍关联子网信息和DDS通信系域的操作步骤。

前提条件

已定义子网信息，并已打开Machine设计画布。

本文示例定义子网信息的网络端口为Host0NetworkEndpoint。具体操作，请参见“定义子网信息”章节。

操作步骤

  1. 创建Machine的以太网接口，并与网络端口关联。

    1. 将“MachineDesign”工具栏下的“MachineDesign”拖至画布空白处，并在对应的“Properties”窗口中，设置“Short Name”为Host0DpMachineDesign。

    2. 单击 [image] ，在对应的“Properties”窗口中，设置“Short Name”为Host0DpEthernetCommConnector。

      • 创建的MachineDesign含有 [image] 和 [image] ，分别对应Connector和Discovery。
      • Discovery仅用于部署SOME/IP通信协议，本文示例不涉及该配置项。
    3. 选中“Relationship”工具栏下的“Connector >NetworkEndpoint”，从 [image] 连线至 [image] ，即完成Machine和以太网网口的关联。

  2. 创建Machine，并引用已定义的通信网口。

    1. 右键单击“cm/default.arxml”下的“AUTOSAR”，选择“System & Machine > Machine Manifest”，打开“new Machine Manifest”画布。
    2. 将“Machine Manifest”工具栏下的“Machine”拖至画布空白处，并在弹窗口中，完成如下配置。

      属性

      说明

      示例值

      Machine

      Machine的简称。

      Host0DpMachine

      Machine Design

      单击“...”，选择步骤1定义的MachineDesign。

      Host0DpMachineDesign

    创建Machine后，需为其配置Processor、ModeDeclarationGroupPrototype等EM相关的必配元素，否则无法通过校验。

    由于这些元素不属于CM特性，可忽略这些元素的配置，本文不介绍相关配置。关于EM的更多信息，请参见工具适配的MDC计算平台设备对应产品文档中“基础特性开发指南 > EM开发指南”章节。

  3. 完成以上配置后，在“MMC Explorer”视图中，展开工程包目录，查看元素树形结构。

后续操作

关联子网信息和DDS通信域后，需部署DDS通信协议。具体操作，请参见部署DDS通信协议。

父主题： 关联子网信息


关联子网信息和SOME/IP服务中心

本文以创建一个名为Host0SpMachine的Machine为例，通过引用对应的MachineDesign，介绍关联子网信息和SOME/IP服务中心的操作步骤。

前提条件

已定义子网信息，并已打开Machine设计画布。

本文示例定义子网信息的网络端口为Host0NetworkEndpoint。具体操作，请参见“定义子网信息”章节。

操作步骤

  1. 创建Machine的以太网接口和服务发现，并将以太网接口与网络端口关联。

    1. 将“MachineDesign”工具栏下的“MachineDesign”拖至画布空白处，并在对应的“Properties”窗口中，设置“Short Name”为Host0SpMachineDesign。

    2. 单击 [image] ，在对应的“Properties”窗口中，设置“Short Name”为Host0SpEthernetCommConnector。

    3. 单击 [image] ，在对应的“Properties”窗口中，输入“Someip Service Discovery Port”的值，例如30491。

    4. 选中“Relationship”工具栏下的“Connector >NetworkEndpoint”，从 [image] 连线至 [image] ，即完成Machine和以太网网口的关联。

  2. 创建Machine，并引用已定义的通信网口。

    1. 右键单击“cm/default.arxml”下的“AUTOSAR”，选择“System & Machine > Machine Manifest”，打开“new Machine Manifest”画布。
    2. 将“Machine Manifest”工具栏下的“Machine”拖至画布空白处，并在弹窗口中，完成如下配置。

      属性

      说明

      示例值

      Machine

      Machine的简称。

      Host0SpMachine

      Machine Design

      单击“...”，选择步骤1定义的MachineDesign。

      Host0SpMachineDesign

    创建Machine后，需为其配置Processor、ModeDeclarationGroupPrototype等EM相关的必配元素，否则无法通过校验。

    由于这些元素不属于CM特性，可忽略这些元素的配置，本文不介绍相关配置。关于EM的更多信息，请参见工具适配的MDC计算平台设备对应产品文档中“基础特性开发指南 > EM开发指南”章节。

  3. 完成以上配置后，在“MMC Explorer”视图中，展开工程包目录，查看元素树形结构。

后续操作

关联子网信息和SOME/IP服务中心后，需部署SOME/IP通信协议。具体操作，请参见部署SOME/IP服务中心。

父主题： 关联子网信息


部署通信协议

关联子网信息后，根据对应的协议类型，需进行对应的部署。进行通信部署时，需先创建通信部署，然后引用定义的服务接口，并完成对应的配置，例如Event、Topic等。

下文分别介绍部署DDS和SOME/IP通信协议的操作步骤。

  • 部署DDS通信协议
  • 部署SOME/IP服务中心
父主题： 拖拽式界面配置示例


部署DDS通信协议

本文以创建一个名为CameraDdsDeployment的DDS通信协议的部署为例，介绍部署DDS通信协议的操作步骤。

前提条件

已定义服务接口，并为接口定义了Event。

本文示例引用的服务接口为CameraDataServiceInterface，该接口的Event为CameraData。具体操作，请参见“定义服务接口”章节。

操作步骤

  1. 在“MMC Explorer”视图中，右键单击“cm/default.arxml”下的“AUTOSAR”选择“Service Instance Manifest > Dds Deployment”，打开“new Dds Deployment”画布。
  2. 创建DDS通信协议部署，再引用服务接口，并设置服务ID。

    将“Deployment”工具栏下的“Dds”拖至画布空白处，并在对应的“Properties”窗口中，完成如下配置。

    属性

    说明

    示例

    Short Name

    DDS通信协议部署的简称。

    CameraDdsDeployment

    Service Interface Id

    服务ID号。

    1

    ServiceInterface

    引用服务接口。

    CameraDataServiceInterface

    Frag Size

    详细说明，请参见工具适配的MDC计算平台设备对应产品文档中“AP配置项参考 > Deployment配置 > DdsServiceInterfaceDeployment”章节。

    2048

    List Size

    256

  3. 为DDS通信协议部署，设置Event和Topic。

    将“Sub Deployments”工具栏下的“Event”拖至“CameraDdsEventDeployment”下的“Event”处，并在对应的“Properties”窗口中，完成如下配置。

    属性

    说明

    示例

    Short Name

    DDS通信协议部署的Event的简称。

    CameraDdsEventDeployment

    Event

    引用服务接口定义的Event。

    CameraData

    Topic Name

    Event消息订阅的Topic。

    CameraDdsEventTopic

  4. 完成以上配置后，在“MMC Explorer”视图中，展开工程包目录，查看元素树形结构。

后续操作

部署DDS通信协议后，需定义可执行程序和进程设计。具体操作，请参见“定义可执行程序和进程设计”章节。

父主题： 部署通信协议


部署SOME/IP服务中心

本文以创建一个名为CameraSpDeployment的SOME/IP通信协议的部署为例，介绍部署SOME/IP通信协议的操作步骤。

前提条件

已定义服务接口，并为接口定义了Event。

本文示例引用的服务接口为CameraDataServiceInterface，该接口的Event为CameraData。具体操作，请参见“定义服务接口”章节。

操作步骤

  1. 在“MMC Explorer”视图中，右键单击“cm/default.arxml”下的“AUTOSAR”选择“Service Instance Manifest > Someip Deployment”，打开“new Someip Deployment”画布。
  2. 创建SOME/IP通信协议部署，再引用服务接口，并设置服务ID。

    将“Deployment”工具栏下的“Someip”拖至画布空白处，并在对应的“Properties”窗口中，完成如下配置。

    属性

    说明

    示例

    Short Name

    SOME/IP通信协议部署的简称。

    CameraSpDeployment

    Service Interface Id

    服务ID号。

    103

    ServiceInterface

    引用服务接口。

    CameraDataServiceInterface

    Major Version

    详细说明，请参见工具适配的MDC计算平台设备对应产品文档中“AP配置项参考 > Deployment配置 > SomeipServiceInterfaceDeployment”配置项。

    1

    Minor Version

    0

  3. 为SOME/IP通信协议部署，设置Event和Topic。

    将“Sub Deployments”工具栏下的“Event”拖至“CameraSpEventDeployment”下的“Event”处，并在对应的“Properties”窗口中，完成如下配置。

    属性

    说明

    示例

    Short Name

    SOME/IP通信协议部署的Event的简称。

    CameraSpEventDeployment

    Event

    引用服务接口定义的Event。

    CameraData

    Event ID

    详细说明，请参见工具适配的MDC计算平台设备对应产品文档中“AP配置项参考 > Deployment配置 > SomeipEventDeployment”配置项。

    1

    Transport Protocol

    udp

  4. 完成以上配置后，在“MMC Explorer”视图中，展开工程包目录，查看元素树形结构。

后续操作

部署SOME/IP通信协议后，需定义可执行程序和进程设计。具体操作，请参见“定义可执行程序和进程设计”章节。

父主题： 部署通信协议


定义可执行程序和进程设计

部署通信协议后，需创建应用组件，并将定义的服务接口用于应用之间的数据传输。然后，创建可执行程序，并与应用组件关联。最后，创建进程设计（ProcessDesign），将其与可执行程序关联。

本文以创建摄像头的服务端和客户端可执行程序（ExeCameraDataServer和ExeCameraDataClient）为例，介绍定义可执行程序及进程设计的操作步骤。

前提条件

已创建服务接口，并被通信协议引用。

本文示例的服务接口为CameraDataServiceInterface，具体操作，请参见“定义服务接口”章节。

本文示例用于数据收发的服务端与客户端分别为CameraDataServer和CameraDataClient。

  • CameraDataServer：摄像头数据通信的服务端，消息发布者（Publisher），本文示例将此端作为发送端。
  • CameraDataClient：摄像头数据通信的客户端，消息订阅者（Subscriber），本文示例将此端作为接收端。

操作步骤

  1. 创建发送端与接收端应用组件，并为应用组件创建端口。

    1. 在“MMC Explorer”视图中，右键单击“cm/default.arxml”下的AUTOSAR，选择“SwComponent”，打开“new SwComponent”画布。
    2. 将“SwComponent”工具栏下的“ApplicationSwc”，分两次拖拽至画布空白处，并在对应的“Properties”窗口中，完成配置。

      收发端

      Short Name

      说明

      发送端

      CameraDataServer

      本文示例中发送摄像头数据的服务端应用组件。

      接收端

      CameraDataClient

      本文示例中接收摄像头数据的客户端应用组件。

    3. 将“Ports”工具栏下的“PPortPrototype”和“RPortPrototype”，分别拖拽至“CameraDataServer”和“CameraDataClient”中，并在对应的“Properties”窗口中，完成配置。

      收发端

      组件的端口

      端口的Short Name

      发送端

      PPortPrototype

      PubCameraData

      接收端

      RPortPrototype

      SubCameraData

  2. 通过服务接口，连接服务端与客户端应用的端口。

    1. 选中“Relationship”工具栏下的“Contract”，先单击“PubCameraData”，再单击“SubCameraData”。

    2. 在弹窗中，选择已定义的通信服务接口CameraDataServiceInterface，单击“OK”。

      完成连接后，发送端和接收端将显示已通信状态（ [image] 和 [image] ）。

  3. 创建可执行程序，并将其与应用关联。

    1. 右键单击“cm/default.arxml”下的“AUTOSAR”选择“Software Deployment > Executable”，打开“new Executable”画布。

      画布中显示已定义的应用，本文示例应用CameraDataServer和CameraDataClient如下图所示。

    2. 将“Component”工具栏下的“Executable”，分两次拖拽至画布空白处，并分别设置“Short Name”为ExeCameraDataServer和ExeCameraDataClient。

      创建可执行程序后，还需设置LOG相关的配置项，否则无法通过校验。

      由于这些元素不属于CM特性，请忽略相关元素的配置，本文不介绍相关操作。LOG相关配置项的更多信息，请参见工具适配的MDC计算平台设备对应产品文档中“AP配置项参考 > LOG配置”。

    3. 选中“Relationship”工具栏下的“Executable >ApplicationSwc”，先单击ExeCameraDataServer，再单击CameraDataServer。然后，按照同样的方法，将ExeCameraDataClient和CameraDataClient建立关联。

  4. 将可执行程序定义为进程设计。

    1. 将“Component”工具栏下的“ProcessDesign”，拖拽至画布空白处，并分别取名为SendCameraDataHost0ProcessDesign和ReceiveCameraDataHost0ProcessDesign。

    2. 选中“Relationship”工具栏下的“ProcessDesign->Executable”，先单击SendCameraDataHost0ProcessDesign，再单击ExeCameraDataServer，将服务端应用的可执行程序与对应的进程设计关联。
    3. 参照步骤4.2，将客户端应用的可执行程序（ExeCameraDataClient）与对应的进程设计（ReceiveCameraDataHost0ProcessDesign）关联。

  5. 完成以上配置后，在“MMC Explorer”视图中，展开工程包目录，查看元素树形结构。

父主题： 拖拽式界面配置示例


定义应用进程信息

定义进程设计（ProcessDesign）后，需创建进程，并引用对应的进程设计，然后映射到目标Machine上。

本文以创建摄像头数据发送进程（SendCameraDataHost0Process）和摄像头数据接收进程（ReceiveCameraDataHost0Process）为例，介绍定义应用进程并与Machine建立映射的操作步骤。本示例的摄像头数据发送和接收进程分别位于服务端和客户端。

前提条件

已定义Machine、可执行程序和进程设计。

本文示例将引用已定义的相关配置项，具体信息如下表所示。

配置项

示例

相关文档

Machine

根据不同的协议，定义不同的Machine：

  • DDS：Host0DpMachine
  • SOME/IP：Host0SpMachine
说明：

不同通信协议下，定义应用进程信息的操作步骤相同，本文以DDS协议的部署为例。
  • 关联子网信息和DDS通信域
  • 关联子网信息和SOME/IP服务中心

Executable
  • 发送端：ExeCameraDataServer
  • 接收端：ExeCameraDataClient

定义可执行程序和进程设计

ProcessDesign
  • 发送端：SendCameraDataHost0ProcessDesign
  • 接收端：ReceiveCameraDataHost0ProcessDesign

操作步骤

  1. 在“MMC Explorer”视图中，右键单击“cm/default.arxml”下的“AUTOSAR”选择“Software Deployment > Process To Machine Mapping”，打开“new Process To Machine Mapping”画布。

    画布中显示已定义的Machine。

  2. 创建发送端进程，并完成映射配置。

    1. 将“Process Deployment”工具栏下的“Process”拖至已定义的Machine中，并在对应的“Properties”窗口的“AUTOSAR”页签中，完成配置。

      配置项

      说明

      示例

      Short Name

      发送端进程的简称。

      SendCameraDataHost0Process

      Process Design

      引用与发送端进程关联的进程设计。

      SendCameraDataHost0Proce...

      Executable

      引用与发送端进程关联的可执行程序。

      ExeCameraDataServer
    2. 单击“Properties”窗口的“Processing Mapping”页签，在“Process To Machine Mapping”的输入框中，为映射定义“Short Name”，例如SendCameraDataProcessToHost0MachineMapping。

  3. 创建接收端进程，并完成映射配置。

    参照步骤2，完成配置，相关信息如下。

    配置项

    说明

    示例

    Short Name

    接收端进程的简称。

    ReceiveCameraDataHost0Process

    Process Design

    引用与接收端进程关联的进程设计。

    ReceiveCameraDataHost0Pr...

    Executable

    引用与接收端进程关联的可执行程序。

    ExeCameraDataClient

    Process To Machine Mapping

    接收端进程与Machine的映射的简称。

    ReceiveCameraDataProcessHost0MachineMapping

  4. 完成以上配置后，在“MMC Explorer”视图中，展开工程包目录，查看元素树形结构。

父主题： 拖拽式界面配置示例


创建通信服务实例

完成数据收发端的应用程序等配置后，根据选择的通信协议，返回对应的通信部署，创建通信服务实例，并引用已定义的部署、以太网接口、进程设计等配置项，最终实现通信部署。

下文分别介绍创建DDS和SOME/IP通信服务实例的操作步骤。

  • 创建DDS通信服务实例
  • 创建SOME/IP通信服务实例
父主题： 拖拽式界面配置示例


创建DDS通信服务实例

本文以创建收发摄像头数据的服务实例（CameraDataDdsProvidedServiceInstance）和（CameraDataDdsRequiredServiceInstance）为例，介绍创建DDS通信服务实例的操作步骤。

前提条件

已定义DDS通信协议部署、以太网接口、进程设计和网络通信端口。

本文示例将引用已定义的相关配置项，具体信息如下表所示。

配置项

示例

相关文档

EthernetCommunicationConnector

Host0DpEthernetCommConnector

关联子网信息和DDS通信域

DdsServiceInterfaceDeployment

CameraDdsDeployment

部署DDS通信协议

ProcessDesign
  • 发送端：SendCameraDataHost0ProcessDesign
  • 接收端：ReceiveCameraDataHost0ProcessDesign

定义可执行程序和进程设计

PortPrototype
  • 发送端：PubCameraData
  • 接收端：SubCameraData

操作步骤

  1. 在“MMC Explorer”视图中，右键单击“cm/default.arxml”下的“AUTOSAR”选择“Service Instance Manifest > Dds Deployment”，再次打开“new Dds Deployment”画布。
  2. 创建发送数据的服务实例。

    1. 将“Instance”工具栏下的“Dds Provided Instance”拖至画布空白处，在弹窗中完成如下配置，然后单击“OK”。

      属性

      说明

      示例

      Service Instance Id

      发送数据的服务实例标识ID。

      1

      Service Interface Deployment

      引用已定义的DDS通信部署。

      CameraDdsDeployment

      Communication Connector

      引用已定义的Machine的以太网接口。

      Host0DpEthernetCommConne...

      Process Design

      引用发送数据的可执行程序的进程设计。

      SendCameraDataHost0Proce...

      Port Prototype

      引用发送数据的网络端口。

      PubCameraData

    2. 在创建的实例对应的“Properties”窗口的“AUTOSAR”页签中，完成如下配置。

      属性

      说明

      示例

      Short Name

      发送数据服务实例的简称。

      CameraDataDdsProvidedServiceInstance

      Domain Id

      详细说明，请参见工具适配的MDC计算平台设备对应产品文档中“AP配置项参考 > DdsProvidedServiceInstance”。

      31

      Qos Profile

      default_qos.xml

      Transport Plugins

      SHM

      创建服务实例后，实例内会自动创建服务实例与Machine之间的映射关系“Instance To Machine Mapping”，本文示例使用默认的“Short Name”，即DdsServiceInstanceToMachineMapping1。

  3. 创建接收数据的服务实例。

    参照上一步的操作，使用“Instance”工具栏下的“Dds Required Instance”，完成配置，相关信息如下。

    属性

    说明

    示例

    Service Instance Id

    接收数据的服务实例标识ID。

    说明：

    一组收发的通信之间的“Service Instance Id”需保持一致。

    1

    Service Interface Deployment

    引用已定义的DDS通信部署。

    CameraDdsDeployment

    InstanceToMachineMapping

    服务实例与Machine之间的映射关系。

    DdsServiceInstanceToMachineMapping1

    Communication Connector

    引用Machine的网络通信接口。

    Host0DpEthernetCommConne...

    Process Design

    引用接收数据的可执行程序的进程设计。

    ReceiveCameraDataHost0Pr...

    Port Prototype

    引用接收数据的网络端口。

    SubCameraData

    Short Name

    接收数据服务实例的简称。

    CameraDataDdsRequiredServiceInstance

    Domain Id

    详细说明，请参见工具适配的MDC计算平台设备对应产品文档中“AP配置项参考 > DdsRequiredServiceInstance”。

    31

    Qos Profile

    default_qos.xml

    Transport Plugins

    SHM

  4. 完成以上配置后，在“MMC Explorer”视图中查看元素树形结构。

父主题： 创建通信服务实例


创建SOME/IP通信服务实例

本文以创建收发摄像头数据的服务实例（CameraDataSpProvidedServiceInstance）和（CameraDataSpRequiredServiceInstance）为例，介绍创建SOME/IP通信服务实例的操作步骤。

前提条件

已定义SOME/IP通信协议部署、以太网接口、进程设计和网络通信端口。

本文示例将引用已定义的相关配置项，具体信息如下表所示。

配置项

示例

相关文档

EthernetCommunicationConnector

Host0SpEthernetCommConnector

关联子网信息和SOME/IP服务中心

SomeipServiceInterfaceDeployment

CameraSpDeployment

部署SOME/IP服务中心

ProcessDesign
  • 发送端：SendCameraDataHost0ProcessDesign
  • 接收端：ReceiveCameraDataHost0ProcessDesign

定义可执行程序和进程设计

PortPrototype
  • 发送端：PubCameraData
  • 接收端：SubCameraData

操作步骤

  1. 在“MMC Explorer”视图中，右键单击“cm/default.arxml”下的“AUTOSAR”选择“Service Instance Manifest > Someip Deployment”，再次打开“new Someip Deployment”画布。
  2. 创建发送数据的服务实例。

    1. 将“Instance”工具栏下的“Someip Provided Instance”拖至画布空白处，在弹窗中完成如下配置，然后单击“OK”。

      属性

      说明

      示例

      Service Instance Id

      发送数据的服务实例标识ID。

      1

      Service Interface Deployment

      引用已定义的SOME/IP通信部署。

      CameraSpDeployment

      Communication Connector

      引用Machine的以太网接口。

      Host0SpEthernetCommConne...

      Process Design

      引用发送数据的可执行程序的进程设计。

      SendCameraDataHost0Proce...

      Port Prototype

      引用发送数据的网络端口。

      PubCameraData

    2. 在创建的实例对应的“Properties”窗口的“AUTOSAR”页签中，完成如下配置。

      属性

      说明

      示例

      Short Name

      发送数据服务实例的简称。

      CameraDataSpProvidedServiceInstance

      Service Instance Id

      详细说明，请参见工具适配的MDC计算平台设备对应产品文档中“AP配置项参考 > ProvidedSomeipServiceInstance”。

      1

      创建服务实例后，实例内会自动创建服务实例与Machine之间的映射关系“Instance To Machine Mapping”，本文示例使用默认的“Short Name”，SomeipServiceInstanceToMachineMapping1。

  3. 创建接收数据的服务实例。

    参照上一步的操作，使用“Instance”工具栏下的“Someip Required Instance”，完成如下配置。

    属性

    说明

    示例

    Service Instance Id

    接收数据的服务实例标识ID。

    说明：

    一组收发的通信之间的“Service Instance Id”需保持一致。

    1

    Service Interface Deployment

    引用已定义的SOME/IP通信部署。

    CameraSpDeployment

    Instance To Machine Mapping

    服务实例与Machine之间的映射关系。

    SomeipServiceInstanceToMachineMapping1

    Communication Connector

    引用Machine的网络通信接口。

    Host0SpEthernetCommConne...

    Process Design

    引用接收数据的可执行程序的进程设计。

    ReceiveCameraDataHost0Pr...

    Port Prototype

    引用接收数据的网络端口。

    SubCameraData

    Short Name

    接收数据服务实例的简称。

    CameraDataSpRequiredServiceInstance

    Required Service Instance Id

    详细说明，请参见工具适配的MDC计算平台设备对应产品文档中“AP配置项参考 > RequiredSomeipServiceInstance”。

    1

  4. 完成以上配置后，在“MMC Explorer”视图中查看元素树形结构。

父主题： 创建通信服务实例


校验工程

工程配置完成后，您可以使用MMC的校验功能，对其进行校验。本文以全量校验为例，介绍校验工程的操作步骤。

前提条件

已完成工程的配置。

操作步骤

  1. 打开MMC工具后，如需开启实时校验功能，单击工具栏 [image] 按钮。
  2. 配置工程过程中，可在“Validation”视图中，查看实时校验结果，并参考Constraints错误修正错误。

    • 在“Validation”视图查看校验结果时，若手误关闭该视图，可选择“Window > Show View > Other > Validation”重新打开。
    • “Validation”视图相关操作说明，请参考Validation视图使用。

  3. （可选）如需关闭实时校验功能，再次单击 [image] 按钮。
  4. 完成工程配置后，选择目标工程进行一次性校验。

    • 方法一：单击工具栏 [image] 按钮。
    • 方法二：右键单击目标工程，在右键菜单中，选择“Validation > Validate Model”。

    校验结束后可在界面下方“Validation”视图中查看校验结果。

  5. 根据错误描述并参考Constraints错误，修改配置。
  6. 重复步骤4~5，直至“Validation”视图中无报错。
父主题： 拖拽式界面配置示例


导出配置文件

工程校验通过后，您可以将配置文件导出，以进行后续的开发。

由拖拽式界面导出的配置文件不支持在同一工程内再次导入（即不可再次导入“manifest”工程），只能创建新的AUTOSAR工程再次导入。

前提条件

已成功校验工程。

操作步骤

  1. 右键单击目标工程，并选择“Export...”。
  2. 在“Export”弹窗中选择“General > File System”。
  3. 在“File system”区域，选择导出文件和目录。

  4. 单击“Finish”，将文件导出至指定目录下。

后续操作

您可以将导出的配置文件用于后续开发，更多信息，请参见《MDC Development Studio 使用指南》的“创建MDC工程”章节。

父主题： 拖拽式界面配置示例


模块化界面配置示例

本章节以CM模块下DDS通信配置和SOME/IP通信配置为例，介绍如何通过MMC工具高效生成对应通信配置文件。

  • 定义数据类型
  • 定义服务接口
  • 定义子网信息
  • 关联子网信息
  • 部署通信协议
  • 定义可执行程序和进程设计
  • 定义应用进程信息
  • （可选）定义通信保护库
  • （可选）配置TLS
  • 创建通信服务实例
  • （可选）配置SOME/IP序列化属性
  • （可选）定义Service2Signal通信
  • 校验工程
  • 导出配置文件
    工程校验通过后，您可以将配置文件导出，以进行后续的开发。
父主题： 通信部署（CM）


定义数据类型

配置CM框架时，需要先定义应用通信时传输的数据类型。根据业务需要，可创建不同的数据类型，例如整型（Int32）、字符串（String）、结构体（Structure）等。创建结构体时，需先创建该结构体成员的数据类型。通过Core Type模块的“StdCppImplementationDataType”元素，可为通信定义数据类型。

本文以定义传输摄像头数据涉及到的数据类型为例，介绍创建数据类型的操作步骤。

背景信息

本文示例创建的数据类型包括：

数据类型 | 简称（Short Name） | 说明
Int32 | timeStamp | 时间戳。
Boolean | validaFlag | 有效性标识。
String | dataFlow | 数据流。
Structure | CameraDataType | 摄像头数据类型。 上述三个数据类型为该结构体的成员。

操作步骤

  1. 在“MMC Explorer”视图中，右键单击目标工程，在快捷菜单中选择“Modular Configurator”。
  2. 在“Modular Configurator”界面中，单击“Core Types”模块的“Select”按钮，进入基础数据类型模块配置界面。

  3. 创建数据类型String。

    1. 在元素管理窗口中，选择“DataType > StdCppImplementationDataType > STRING”，并单击上方 [image] 。

    2. 在“Select ARPackage”弹窗中，选择目标工程下的ARPackage，例如“cm/default.arxml/HuaweiMDC”，并单击“OK”。

    3. 在元素配置窗口中，设置“Short Name”为String。

  4. 创建数据类型Int32和Boolean。

    1. 参照上一步，在元素管理窗口的“DataType > StdCppImplementationDataType > VALUE”下，创建两个元素bool和int32_t。

    2. 参照上一步，在元素管理窗口的“DataType > StdCppImplementationDataType > TYPE_REFERENCE”下，创建数据类型Int32和Boolean，并分别引用上一步创建的元素。

      元素类型

      Short Name

      Type Reference

      TYPE_REFERENCE

      Int32

      int32_t

      TYPE_REFERENCE

      Boolean

      bool

  5. 创建Structure数据类型。

    1. 参照3.a，在元素管理窗口的“DataType > StdCppImplementationDataType > STRUCTURE”下，创建元素并设置“Short Name”为“CameraDataType”。

    2. 在元素配置窗口的“Sub Elements”区域，单击 [image] 按钮，为该数据类型添加成员，并引用已创建的数据类型。

      Short Name

      Type Reference

      说明

      timeStamp

      Int32

      时间戳

      validaFlag

      Boolean

      有效性标识

      dataFlow

      String

      数据流

  6. 在视图和元素管理窗口中，查看新增的元素。

父主题： 模块化界面配置示例


定义服务接口

定义数据类型后，可以创建服务接口，为服务接口引用已创建的数据类型，并定义数据的传输方式，以完成定义通信所需的服务接口。通过CM模块的“ServiceInterface”元素，可为CM通信定义服务接口。

本文以定义一个摄像头数据的服务接口“CameraDataServiceInterface”为例，介绍定义服务接口的操作步骤。该接口通过Event方式传输数据。

前提条件

已为接口定义数据类型。

本文示例接口定义的数据类型为“CameraDataType”。具体操作，请参见 定义数据类型。

操作步骤

  1. 返回“Modular Configurator”界面，单击“Communication Management”模块的“Select”按钮，进入CM模块配置界面。

  2. 创建服务接口。

    1. 在元素管理窗口中，选择“PortInterface > ServiceInterface”，并单击上方 [image] 。

    2. 在“Select ARPackage”弹窗中，选择目标工程下的ARPackage，例如“cm/default.arxml/HuaweiMDC”，并单击“OK”。

  3. 配置服务接口的通信方式。

    1. 在元素配置窗口中，设置“Short Name”为CameraDataServiceInterface。
    2. 在“Events”区域，单击 [image] 按钮，为服务接口添加Event，并关联已创建的数据类型。

      属性

      说明

      示例

      Short Name

      输入Event的简称。

      CameraData

      Type

      引用已定义的数据类型。

      CameraDataType

  4. 在视图和元素管理窗口中，查看新增的元素。

父主题： 模块化界面配置示例


定义子网信息

配置CM通信框架时，需创建Machine，并引用网络连接配置。通过CM模块的EthernetCluster元素，可配置Machine（物理机和虚拟机）IP地址、子网掩码等子网信息。子网信息主要包括主机（物理机/虚拟机）IP地址，通过CM模块的EthernetCluster元素进行配置。

本文以创建一个名为Host0NetworkEndpoint的网络端口为例，介绍定义子网信息的操作步骤。

操作步骤

  1. 创建用于配置子网信息的元素。

    1. 在“CM Designer”页面的元素管理窗口中，选择“EthernetTopology > EthernetCluster”，并单击上方 [image] 。

    2. 在“Select ARPackage”弹窗中，选择目标工程下的ARPackage，例如“cm/default.arxml/HuaweiMDC”，并单击“OK”。

  2. 配置子网信息。

    1. 在元素配置窗口中，设置“Short Name”为CameraEthernetCluster。
    2. 在“Ethernet Cluster Variants”区域，单击 [image] ，添加聚合元素“EthernetPhysicalChannel.NetworkEndpoint”，并参考下图完成配置。

      创建的元素“NetworkEndpoint”自带一个“Ipv4Configuration”，选中该元素后，再单击 [image] ，可为该元素添加多个属性，然后完成该元素的配置。

      属性

      说明

      示例

      Short Name

      网络端口的简称。

      Host0NetworkEndpoint

      ipv4 address

      IP地址。

      192.168.10.6

      Network Mask

      子网掩码。

      255.255.255.255

  3. 完成以上配置后，在元素管理窗口中，查看新增的服务接口。

父主题： 模块化界面配置示例


关联子网信息

根据业务需要，选择所需的通信方式，定义通信协议，并与目标Machine关联。通信部署支持的协议包括DDS和SOME/IP，更多信息，请参见工具适配的MDC计算平台设备对应产品文档中“基础特性开发指南 > CM开发指南”章节。

关联子网信息前，需先创建MachineDesign，配置以太网接口和网络端口，然后创建Machine并引用MachineDesign。通过CM模块的“MachineDesign”和“Machine”元素，可实现子网信息的关联。

下文分别介绍将已定义的子网信息与DDS通信域和SOME/IP服务中心进行关联。

  • 关联子网信息和DDS通信域
  • 关联子网信息和SOME/IP服务中心
父主题： 模块化界面配置示例


关联子网信息和DDS通信域

本文以创建一个名为Host0DpMachine的Machine为例，通过引用对应的MachineDesign，介绍关联子网信息和DDS通信系域的操作步骤。

先进行Machine的设计，定义一个MachineDesign元素，配置使用DDS通信方式，再绑定目标Machine。

前提条件

已定义子网信息，并已打开Machine设计画布。

本文示例定义子网信息的网络端口为Host0NetworkEndpoint。具体操作，请参见 定义子网信息

操作步骤

  1. 创建MachineDesign元素。

    1. 在“CM Designer”页面的元素管理窗口中，选择“SystemDesign > MachineDesign”，并单击上方 [image] 。

    2. 在“Select ARPackage”弹窗中，选择目标工程下的ARPackage，例如“cm/default.arxml/HuaweiMDC”，并单击“OK”。

  2. 创建Connector。

    1. 在元素配置窗口的“Configurating MachineDesign”，设置“Short Name”为Host0DpMachineDesign。
    2. 在“Communication Connectors”区域，单击 [image] ，添加聚合元素“CommunicationConnector”，并完成如下配置。

      属性

      说明

      示例

      Short Name

      Connector的简称。

      Host0DpEthernetCommConnector

      Unicast Network Endpoint

      引用已定义的NetworkEndpoint中的网络端口。

      Host0NetworkEndpoint

  3. 创建Machine，并引用已定义的MachineDesign。

    1. 参考步骤1，在元素管理窗口的“MachineManifest > Machine”下，创建Machine。

    2. 在元素配置窗口的“Configurating Machine”区域，完成如下配置。

      属性

      说明

      示例值

      Short Name

      Machine的简称。

      Host0DpMachine

      Machine Design

      引用上文定义的MachineDesign。

      Host0DpMachineDesign

    创建Machine后，需为其配置Processor、ModeDeclarationGroupPrototype等EM相关的必配元素，否则无法通过校验。

    由于这些元素不属于CM特性，可忽略这些元素的配置，本文不介绍相关配置。关于EM的更多信息，请参见工具适配的MDC计算平台设备对应产品文档中“基础特性开发指南 > EM开发指南”章节。

  4. 在视图和元素管理窗口中，查看新增的元素。

后续操作

关联子网信息和DDS通信域后，需部署DDS通信协议。具体操作，请参见“部署DDS通信协议”章节。

父主题： 关联子网信息


关联子网信息和SOME/IP服务中心

本文以创建一个名为Host0SpMachine的Machine为例，通过引用对应的MachineDesign，介绍关联子网信息和SOME/IP服务中心的操作步骤。

前提条件

已定义子网信息，并已打开Machine设计画布。

本文示例定义子网信息的网络端口为Host0NetworkEndpoint。具体操作，请参见 定义子网信息

操作步骤

  1. 创建MachineDesign元素。

    1. 在“CM Designer”页面的元素管理窗口中，选择“SystemDesign > MachineDesign”，并单击上方 [image] 。

    2. 在“Select ARPackage”弹窗中，选择目标工程下的ARPackage，例如“cm/default.arxml/HuaweiMDC”，并单击“OK”。

  2. 创建Connector和Discovery。

    1. 在元素配置窗口的“Configurating MachineDesign”，设置“Short Name”为Host0SpMachineDesign。
    2. 在“Communication Connectors”区域，单击 [image] ，添加聚合元素“CommunicationConnector”，并完成如下配置。

      属性

      说明

      示例

      Short Name

      Connector的简称。

      Host0SpEthernetCommConnector

      Unicast Network Endpoint

      引用已定义的NetWorkEndpoint中的网络端口。

      Host0NetworkEndpoint
    3. 在“Service Discover Configs”区域，单击 [image] ，添加聚合元素“SomeipServiceDiscovery”，并完成如下配置。

      属性

      说明

      示例

      Multicast Sd Ip Address

      引用已定义的NetworkEndpoint中的IP地址。

      Host0NetworkEndpoint

      Someip Service Discovery Port

      服务发现端口号。

      23

  3. 创建Machine，并引用已定义的MachineDesign。

    1. 参考步骤1，在元素管理窗口的“MachineManifest > Machine”下，创建Machine元素。

    2. 在元素配置窗口的“Configurating Machine”区域，完成如下配置。

      属性

      说明

      示例值

      Short Name

      Machine的简称。

      Host0SpMachine

      Machine Design

      引用上文定义的MachineDesign。

      Host0SpMachineDesign

      创建Machine后，需为其配置Processor、ModeDeclarationGroupPrototype等EM相关的必配元素，否则无法通过校验。

      由于这些元素不属于CM特性，可忽略这些元素的配置，本文不介绍相关配置。关于EM的更多信息，请参见工具适配的MDC计算平台设备对应产品文档中“基础特性开发指南 > EM开发指南”章节。

  4. 在视图和元素管理窗口中，查看新增的元素。

后续操作

关联子网信息和SOME/IP服务中心后，需部署SOME/IP通信协议。具体操作，请参见“部署SOME/IP通信协议”章节。

父主题： 关联子网信息


部署通信协议

关联子网信息后，根据对应的协议类型，需进行对应的部署。进行通信部署时，需先创建通信部署，然后引用定义的服务接口，并完成对应的配置，例如Event、Topic等。

通过CM模块的“DdsServiceInterfaceDeployment”元素，可部署通信协议。

下文分别介绍部署DDS和SOME/IP通信协议的操作步骤。

  • 部署DDS通信协议
  • 部署SOME/IP通信协议
父主题： 模块化界面配置示例


部署DDS通信协议

本文以创建一个名为CameraDdsDeployment的DDS通信协议的部署为例，介绍部署DDS通信协议的操作步骤。

前提条件

已定义服务接口，并为接口定义了Event。

本文示例引用的服务接口为CameraDataServiceInterface，该接口的Event为CameraData。具体操作，请参见 定义服务接口。

操作步骤

  1. 创建DDS通信协议部署。

    1. 在“CM Designer”页面的元素管理窗口中，选择“ServiceInterfaceDeployment > DdsServiceInterfaceDeployment”，并单击上方 [image] 。

    2. 在“Select ARPackage”弹窗中，选择目标工程下的ARPackage，例如“cm/default.arxml/HuaweiMDC”，并单击“OK”。

  2. 配置DDS通信协议部署。

    1. 在元素配置窗口的“Configurating DdsServiceInterfaceDeployment”，完成如下配置。

      属性

      说明

      示例

      Short Name

      DDS通信协议部署的简称。

      CameraDdsDeployment

      Service Interface Id

      服务ID号。

      1

      ServiceInterface

      引用服务接口。

      CameraDataServiceInterface

      Frag Size

      分片的大小。

      2048

      List Size

      分片的个数。

      详细说明，请参见工具适配的MDC计算平台设备对应产品文档中“AP配置项参考 > DdsServiceInterfaceDeployment”。

      256

      配置“ServiceInterface”前，勾选“Associated Configuration”，会根据该服务接口的Event、Field或Method自动生成对应的聚合元素，可忽略下一步，或根据业务需要调整对应配置。

    2. 在“Event Deployments”区域，单击 [image] ，添加聚合元素“DdsEventDeployment”，并完成如下配置。

      属性

      说明

      示例

      Short Name

      DDS通信协议部署的Event的简称。

      CameraDdsEventDeployment

      Topic Name

      Event消息订阅的Topic。

      CameraDdsEventTopic

      Event

      引用服务接口定义的Event。

      CameraData

  3. 完成以上配置后，在元素管理窗口中，查看新增的元素。

后续操作

部署DDS通信协议后，需定义可执行程序及进程。具体操作，请参见“定义可执行程序和进程设计”章节。

父主题： 部署通信协议


部署SOME/IP通信协议

本文以创建一个名为CameraSpDeployment的SOME/IP通信协议的部署为例，介绍部署SOME/IP通信协议的操作步骤。

前提条件

已定义服务接口，并为接口定义了Event。

本文示例引用的服务接口为CameraDataServiceInterface，该接口的Event为CameraData。具体操作，请参见 定义服务接口。

操作步骤

  1. 创建SOME/IP通信协议部署。

    1. 在“CM Designer”页面的元素管理窗口中，选择“ServiceInterfaceDeployment > SomeipServiceInterfaceDeployment”，并单击上方 [image] 。

    2. 在“Select ARPackage”弹窗中，选择目标工程下的ARPackage，例如“cm/default.arxml/HuaweiMDC”，并单击“OK”。

  2. 配置SOME/IP通信协议部署。

    1. 在元素配置窗口的如下区域，完成如下配置。

      配置区域

      属性

      说明

      示例

      Configurating SomeipServiceInterfaceDeployment

      Short Name

      SOME/IP通信协议部署的简称。

      CameraSpDeployment

      Service Interface Id

      服务ID号。

      103

      ServiceInterface

      引用服务接口。

      CameraDataServiceInterface

      Service Interface Version

      Major Version

      ServiceInterface的major版本号。

      1

      Minor Version

      ServiceInterface的minor版本号。

      详细说明，请参见工具适配的MDC计算平台设备对应产品文档中“AP配置项参考 > SomeipServiceInterfaceDeployment”。

      0
      • 属性的详细说明，请参见工具适配的MDC计算平台设备对应产品文档中“AP配置项参考 > SomeipServiceInterfaceDeployment”。
      • 配置“ServiceInterface”前，勾选“Associated Configuration”，会根据该服务接口的Event、Field或Method自动生成对应的聚合元素，也可根据业务需要调整对应的配置。
    2. 在“Event Deployments”区域，单击 [image] ，添加聚合元素“SomeipEventDeployment”，并完成如下配置。

      属性

      说明

      示例

      备注

      Short Name

      SOME/IP通信协议部署的Event的简称。

      CameraSpEventDeployment

      -

      Event

      引用服务接口定义的Event。

      CameraData

      -

      Event Id

      配置SOME/IP协议Event的唯一标识。

      1

      勾选“Associated Configuration”后，该属性不会自动生成，需要根据业务需要配置。

      （可选）Serializer

      定义使用哪种序列化方法。

      SIGNAL-BASED

      Transport Protocol

      详细说明，请参见工具适配的MDC计算平台设备对应产品文档中“AP配置项参考 > SomeipEventDeployment”。

      UDP
    3. 在“Event Groups”区域，单击 [image] ，为Event创建组，并完成如下配置。

      属性

      说明

      示例

      备注

      Short Name

      Event Group的简称。

      CameraSomeipEventGroup

      -

      Events

      引用上一步定义的SomeipEventDeployment。

      CameraSpEventDeployment

      -

      Event Group Id

      配置SOME/IP协议EventGroup的唯一标识。

      详细说明，请参见工具适配的MDC计算平台设备对应产品文档中“AP配置项参考 > SomeipEventGroup”。

      1

      勾选“Associated Configuration”后，该属性不会自动生成，需要根据业务需要配置。

  3. 在视图和元素管理窗口中，查看新增的元素。

后续操作

部署SOME/IP通信协议后，需定义可执行程序及进程。具体操作，请参见“定义可执行程序和进程设计”章节。

父主题： 部署通信协议


定义可执行程序和进程设计

部署通信协议后，需创建应用组件，并将定义的服务接口用于应用之间的数据传输。然后，创建可执行程序，并与应用组件关联。最后，创建进程设计（ProcessDesign），将其与可执行程序关联。

通过CM模块的“Application ”下的元素，可定义可执行程序及进程设计。

本文以创建摄像头的服务端和客户端可执行程序（ExeCameraDataServer和ExeCameraDataClient）为例，介绍定义可执行程序及进程设计的操作步骤。

前提条件

已创建服务接口，并被通信协议引用。

本文示例的服务接口为CameraDataServiceInterface，具体操作，请参见 定义服务接口。

本文示例用于数据收发的服务端与客户端分别为CameraDataServer和CameraDataClient。

  • CameraDataServer：摄像头数据通信的服务端，消息发布者（Publisher），本文示例将此端作为发送端。
  • CameraDataClient：摄像头数据通信的客户端，消息订阅者（Subscriber），本文示例将此端作为接收端。

操作步骤

  1. 创建发送端应用组件类型。

    1. 在“CM Designer”页面的元素管理窗口中，选择“Application > AdaptiveApplicationSwComponentType”，并单击上方 [image] 。

    2. 在“Select ARPackage”弹窗中，选择目标工程下的ARPackage，例如“cm/default.arxml/HuaweiMDC”，并单击“OK”。

  2. 通过配置组件类型，为发送端添加端口。

    1. 在元素配置窗口的“Configurating AdaptiveApplicationSwComponentType”，为组件类型设置“Short Name”为CameraDataServer。
    2. 在“Ports”下，单击 [image] 按钮，然后选择“Add PPort”，为组件添加发送端口，并完成如下配置。

      属性

      说明

      示例值

      Short Name

      发送端的端口简称。

      PubCameraData

      Port Interface

      引用已定义的服务接口。

      CameraDataServiceInterface

  3. 创建接收端组件，并添加接收端的端口。

    参照步骤1~2，在元素管理窗口的“Application > AdaptiveApplicationSwComponentType”下，创建接收端组件的元素，并完成添加端口等配置。

    配置区域

    属性

    说明

    示例

    Configurating AdaptiveApplicationSwComponentType

    Short Name

    接收端应用组件的简称。

    CameraDataClient

    Ports

    Short Name

    接收端的端口简称。

    SubCameraData

    Class

    端口类型。

    添加端口时，然后选择“Add RPort”，

    RPortPrototype

    Port Interface

    引用已定义的服务接口。

    CameraDataServiceInterface

  4. 创建可执行程序，并引用对应的应用组件。

    参考步骤1，在元素管理窗口的“Application > Executable”下，分别创建发送端与接收端可执行程序对应的元素，然后完成如下配置。

    配置区域

    属性

    说明

    发送端示例

    接收端示例

    Configurating Executable

    Short Name

    可执行程序的简称。

    ExeCameraDataServer

    ExeCameraDataClient

    Logging Behavior

    日志相关配置项，更多信息，请参见工具适配的MDC计算平台设备对应产品文档中“AP配置项参考 > Service Instance配置”。

    DOES-NOT-USE-LOGGING

    Root Sw Component Prototype

    Short Name

    父类组件类型的简称。

    CameraDataServerRootSwC

    CameraDataClientRootSwC

    Application Type

    引用步骤2和3定义的应用组件。

    CameraDataServer

    CameraDataClient

  5. 创建进程设计，并引用对应的可执行程序。

    参考步骤1，在元素管理窗口的“Application > ProcessDesign”下，分别创建发送端与接收端进程设计的元素，然后在Configurating ProcessDesign区域，完成如下配置。

    配置区域

    属性

    说明

    发送端示例

    接收端示例

    Configurating ProcessDesign

    Short Name

    进程设计的简称。

    SendCameraDataHost0ProcessDesign

    ReceiveCameraDataHost0ProcessDesign

    Executable

    引用步骤4的对应端的可执行程序。

    ExeCameraDataServer

    ExeCameraDataClient

  6. 在视图和元素管理窗口中，查看新增的元素。

父主题： 模块化界面配置示例


定义应用进程信息

定义进程设计（ProcessDesign）后，需创建进程，并引用对应的进程设计，然后映射到目标Machine上。通过CM模块的“ProcessManifest”下的元素，可定义可执行程序及进程。

本文以创建摄像头数据发送进程（SendCameraDataHost0Process）和摄像头数据接收进程（ReceiveCameraDataHost0Process）为例，介绍定义应用进程并与Machine建立映射的操作步骤。本示例的摄像头数据发送和接收进程分别位于服务端和客户端。

前提条件

已定义Machine、可执行程序和进程设计。

本文示例将引用已定义的相关配置项，具体信息如下表所示。

配置项

示例

相关文档

Machine

根据不同的协议，定义不同的Machine：

  • DDS：Host0DpMachine
  • SOME/IP：Host0SpMachine
说明：

不同通信协议下，定义应用进程信息的操作步骤相同，本文以DDS协议的部署为例。
  • 关联子网信息和DDS通信域
  • 关联子网信息和SOME/IP服务中心

Executable
  • 发送端：ExeCameraDataServer
  • 接收端：ExeCameraDataClient

定义可执行程序和进程设计

ProcessDesign
  • 发送端：SendCameraDataHost0ProcessDesign
  • 接收端：ReceiveCameraDataHost0ProcessDesign

操作步骤

  1. 为发送端应用组件的可执行程序，创建进程。

    1. 在“CM Designer”页面的元素管理窗口中，选择“ProcessManifest > Process”，并单击上方 [image] 。

    2. 在“Select ARPackage”弹窗中，选择目标工程下的ARPackage，例如“cm/default.arxml/HuaweiMDC”，并单击“OK”。

  2. 通过配置进程，引用已定义的发送端的可执行程序。

    在元素配置窗口的“Configurating Process”区域，完成如下配置。

    属性

    说明

    示例

    Short Name

    发送端可执行程序的进程简称。

    SendCameraDataHost0Process

    Executable

    引用与发送端进程关联的可执行程序。

    ExeCameraDataServer

    Design

    引用与发送端进程关联的进程设计。

    SendCameraDataHost0Proce...

  3. 创建接收端应可执行程序的进程。

    参照步骤1~2，在元素管理窗口的“ProcessManifest > Process”下，创建接收端进程的元素，并完成如下配置。

    属性

    说明

    示例

    Short Name

    接收端可执行程序的进程简称。

    ReceiveCameraDataHost0Process

    Executable

    引用与接收端进程关联的可执行程序。

    ExeCameraDataClient

    Design

    引用与接收端进程关联的进程设计。

    ReceiveCameraDataHost0Pr...

  4. 将可执行程序映射到Machine。

    1. 参考步骤1，在元素管理窗口的“ProcessManifest > ProcessToMachineMappingSet”下，创建进程到Machine的进程集元素，并配置“Short Name”为ProcessToMachineMappingSet。
    2. 在元素配置窗口的“Process To MachineMappings”下，单击两次 [image] ，为发送端和接收端，分别创建进程到Machine的映射，然后完成如下配置。

      属性

      说明

      发送端示例

      接收端示例

      Short Name

      进程与Machine的映射的简称。

      SendCameraDataProcessToHost0MachineMapping

      ReceiveCameraDataProcessHost0MachineMapping

      Machine

      引用与进程关联的Machine。

      Host0DpMachine

      Process

      引用与进程关联的进程设计。

      SendCameraDataHost0Proce...

      ReceiveCameraDataHost0Pr...

  5. 在视图和元素管理窗口中，查看新增的元素。

后续操作

定义应用进程后，可创建通信实例，实现CM的部署。

如需使用通信保护库或TLS功能，则还需先进行对应的配置。具体操作，请参见：

  • （可选）定义通信保护库
  • （可选）配置TLS
父主题： 模块化界面配置示例


（可选）定义通信保护库

配置CM框架时，如需在通信时检查通信故障等，则可定义一个端到端通信保护库配置。待到配置服务通信实例时，可引用该通信保护库配置。

通过CM模块的“E2EProfileConfiguration”元素，可定义通信保护库。

本文以定义一个摄像头数据的通信保护库配置“CameraE2EProfileConfiguration”为例，介绍定义通信保护库的操作步骤。

操作步骤

  1. 创建通信保护库配置集。

    1. 在“CM Designer”页面的元素管理窗口中，选择“E2E > E2EProfileConfigurationSet”，并单击上方 [image] 。
    2. 在“Select ARPackage”弹窗中选择包目录，并单击“OK”。

  2. 配置通信保护库集，并添加通信保护库配置。

    1. 元素配置窗口的“Configurating E2EProfileConfigurationSet”区域，设置通信保护库集的“Short Name”，例如CameraE2EProfileConfigurationSet。
    2. 在“E2e Profile Configurations”区域，单击 [image] 按钮，创建元素E2eProfileConfigurations，并完成如下配置。

      属性

      说明

      示例

      Short Name

      E2E配置的元素简称。

      CameraE2EProfileConfiguration

      Profile Name

      详细说明，请参见工具适配的MDC计算平台设备对应产品文档中“AP配置项参考 > E2EProfileConfiguration配置”。

      PROFILE_04

      Max Delta Counter

      65535

      Data Id Mode

      ALL-16BIT

      Clear From Valid To Invalid

      FALSE

  3. 在视图和元素管理窗口中，查看新增的元素。

后续操作

定义的通信保护库，在配置服务实例时会被引用。具体操作，请参见“创建通信服务实例”章节。

父主题： 模块化界面配置示例


（可选）配置TLS

传输层安全协议（TLS）用于在两个应用程序之间提供保密性与数据完整性，包括TLS握手协议与TLS记录协议。握手成功后，服务端与客户端才能进行数据交换。

如果使用SOME/IP通信方式，可根据业务需要，通过CM模块的“TransportLayerSecurity”下的元素，完成TLS相关配置。本文以创建并配置一个名为CameraTlsSecureComProps的TLS属性为例，介绍TLS相关配置的操作步骤。

操作步骤

  1. 创建并配置CryptoServicePrimitive。

    1. 在“CM Designer”页面的元素管理窗口中，选择“TransportLayerSecurity > CryptoServicePrimitive”，并单击上方 [image] 。

    2. 在“Select ARPackage”弹窗中，选择目标工程下的ARPackage，例如“cm/default.arxml/HuaweiMDC”，并单击“OK”。

    3. 元素配置窗口，完成以下配置。

      属性

      说明

      示例

      Short Name

      定义CryptoServicePrimitive的简称。

      CameraCryptoServicePrimitive

      Algorithm Family

      详细说明，请参见工具适配的MDC计算平台设备对应产品文档中“AP配置项参考 > TLS配置 > CryptoServicePrimitive”。

      Description of AES for CameraData

      Algorithm Mode

      ECB

      Algorithm Secondary Family

      Detailed description of AES for CameraData

  2. 创建并配置CryptoServiceCertificate。

    参考步骤1，在元素管理窗口的“TransportLayerSecurity > CryptoServiceCertificate”下，创建元素并完成配置。

    属性

    说明

    示例

    Short Name

    定义CryptoServiceCertificate的简称。

    CameraCryptoServiceCertificate

    Algorithm Family

    详细说明，请参见工具适配的MDC计算平台设备对应产品文档中“AP配置项参考 > TLS配置 > CryptoServiceCertificate”。

    ECC

    Format

    X-509

    Maximum Length

    4294967295

    Next Higher Certificate

    -

  3. 创建并配置CryptoServiceKey。

    参考步骤1，在元素管理窗口的“TransportLayerSecurity > CryptoServiceKey”下，创建元素并完成配置。

    属性

    说明

    示例

    Short Name

    定义CryptoServiceKey的简称。

    CameraCryptoServiceKey

    Algorithm Family

    详细说明，请参见工具适配的MDC计算平台设备对应产品文档中“AP配置项参考 > TLS配置 > CryptoServiceKey”。

    This is the description for test.

    Key Generation

    KEY-DERIVATION

    Key Storage Type

    -

    Length

    4294967295

  4. 通过创建并配置SecureComPropsSet，创建TlsSecureComProps。

    1. 参考步骤1，在元素管理窗口的“TransportLayerSecurity > SecureComPropsSet”下，创建安全传输属性集，并设置“Short Name”为CameraSecureComPropsSet。
    2. 在“SecureComProps”下，单击 [image] 按钮，然后选择“Add Tls Secure Com Props”，为属性集创建TLS安全传输属性，并完成如下配置。

      属性

      说明

      示例

      Short Name

      定义TLS安全传输属性的简称。

      CameraClientTlsSecureComProps

      Category

      用于标识TLS客户端与服务端。

      TLS_CLIENT

      Key Exchanges

      引用步骤1创建的CryptoServicePrimitive，使加密套件的密钥交换与之关联。

      CameraCryptoServicePrimitive

    3. 选中上一步创建的元素后，单击 [image] 按钮，然后选择“Add Tls Cipher Suites”，为TLS安全传输属性创建密码套件，并完成如下配置。

      属性

      说明

      示例

      Short Name

      定义密码套件的简称。

      CameraClientTlsCryptoCipherSuite

      Key Exchanges

      引用步骤1创建的CryptoServicePrimitive，使密码套件的密钥交换与之关联。

      CameraCryptoServicePrimitive

      Authentication

      引用步骤1创建的CryptoServicePrimitive，使生成和验证密码套件的MAC与之关联。

      CameraCryptoServicePrimitive

      Certificate

      引用步骤2创建的CryptoServiceCertificate，使加密套件的证书标识与之关联。

      CameraCryptoServiceCertificate

      Encryption

      引用步骤1创建的CryptoServicePrimitive，使加密套件的执行加密与之关联。

      CameraCryptoServicePrimitive

      Version

      密码套件支持的TLS版本。

      TLS-12

      Priority

      密码套件的优先级。

      1

    4. 选中上一步创建的元素后，单击 [image] 按钮，然后选择“Add Psk Identity”，为密码套件创建预共享密钥身份，并完成如下配置。

      属性

      说明

      示例

      Pre Shared Key

      引用步骤3创建的CryptoServiceKey。

      CameraCryptoServiceKey

      Psk Identity

      详细说明，请参见工具适配的MDC计算平台设备对应产品文档中“AP配置项参考 > TLS配置 > TlsPskIdentity”。

      CameraPskIdentity

      Psk Identity Hint

      CameraPskIdentityHint

    5. 参考上述步骤，为服务端创建对应的元素。

  5. 在视图和元素管理窗口中，查看新增的元素。

父主题： 模块化界面配置示例


创建通信服务实例

根据通信协议类型，可创建DDS通信服务实例和SOME/IP通信服务实例。

通过CM模块的“ServiceInstantiation”和“ServiceInstanceMapping”下的元素，可实现服务实例的创建。

  • 创建DDS通信服务实例
  • 创建SOME/IP通信服务实例
父主题： 模块化界面配置示例


创建DDS通信服务实例

本文以创建收发摄像头数据的服务实例（CameraDataDdsProvidedServiceInstance）和（CameraDataDdsRequiredServiceInstance）为例，介绍创建DDS通信服务实例的操作步骤。

前提条件

已定义DDS通信协议部署、以太网接口、进程设计、网络通信端口和父类组件类型。

本文示例将引用已定义的相关配置项，具体信息如下表所示。

配置项

示例

相关文档

EthernetCommunicationConnector

Host0DpEthernetCommConne...

关联子网信息和DDS通信域

DdsServiceInterfaceDeployment

CameraDdsDeployment

部署DDS通信协议

ProcessDesign
  • 发送端：SendCameraDataHost0ProcessDesign
  • 接收端：ReceiveCameraDataHost0ProcessDesign

定义可执行程序和进程设计

PortPrototype
  • 发送端：PubCameraData
  • 接收端：SubCameraData

RootSwC
  • 发送端：CameraDataServerRootSwC
  • 接收端：CameraDataClientRootSwC

操作步骤

  1. 创建数据发送的通信服务实例。

    1. 在“CM Designer”页面的元素管理窗口中，选择“ServiceInstantiation > DdsProvidedServiceInstance”，并单击上方 [image] 。

    2. 在“Select ARPackage”弹窗中，选择目标工程下的ARPackage，例如“cm/default.arxml/HuaweiMDC”，并单击“OK”。

  2. 配置数据发送的通信服务实例。

    1. 在元素配置窗口的“Configurating DdsProvidedServiceInstance”区域，完成如下配置。

      属性

      说明

      示例

      Short Name

      数据发送的通信服务实例的简称。

      CameraDataDdsProvidedServiceInstance

      Service Interface Deployment

      引用已定义的DDS通信部署。

      CameraDdsDeployment

      Domain Id

      计算平台DDS通信域配置数量上限为63，domainId范围为[0,63]，其中[30,63]为自定义可配范围。

      31

      Tansport Plugins

      数据传输方式。

      UDP

      Qos Profile

      用于定义全局的质量策略，包括关键的通信规则。

      default_qos.xml

      Service Instance Id

      定义服务实例号，用于对应接收端服务实例。

      1
      • 配置“Service Interface Deployment”前，勾选“Associated Configuration”，会根据该通信部署的Event、Field或Method自动生成对应的聚合元素。可忽略下一步或根据业务需要调整对应配置。
      • 配置“Service Instance Id”时，需注意一组收发的通信之间的“Service Instance Id”需保持一致。

    2. 在“Event Qos Props”区域，单击 [image] 按钮，添加“DdsEventQosProps”元素，并完成如下配置。

      属性

      说明

      示例

      Event

      引用已定义的数据传输方式的部署。

      CameraDdsEventDeployment

      Qos Profile

      选择当前部署项的质量策略，优先级高于步骤2.1中配置的全局Qos Profile。

      default_qos.xml

    3. （可选）如需使用通信保护库功能，则在“E2e Event Protection Props”区域，单击 [image] 按钮，创建通信保护库属性，并完成如下配置。

      属性

      说明

      示例

      Short Name

      通信保护库属性的简称。

      CameraE2EEventProtectionProps

      Event

      引用已定义的Event。

      CameraDdsEventDeployment

      E2e Profile Configuration

      引用已定义的通信保护库配置。

      CameraE2EProfileConfiguration

      Data Ids

      详细说明，请参见工具适配的MDC计算平台设备对应产品文档中“AP配置项参考 > End2EndEventProtectionPropsy”。

      1

      Min Data Length

      96

      Max Data Length

      32768

  3. 创建并配置数据接收的通信服务实例。

    参考步骤1~2，在元素管理窗口的“ServiceInstantiation > DdsRequiredServiceInstance”下，创建元素并完成配置。

    数据接收的通信服务实例的配置参数说明，请参见数据发送的通信服务实例。

    本文示例数据接收的通信服务实例的“Short Name”为CameraDataDdsRequiredServiceInstance，其他配置与数据接收的通信服务实例保持一致。

    配置“Service Interface Deployment”前，勾选“Associated Configuration”，会根据该通信部署的Event、Field或Method自动生成对应的聚合元素。也可以根据业务需要调整对应配置。

  4. 创建服务实例与Machine之间的映射。

    参考步骤1~2，在元素管理窗口的“ServiceInstanceMapping > DdsServiceInstanceToMachineMapping”下，创建元素并完成如下配置。

    属性

    说明

    示例

    Short Name

    服务实例与Machine之间的映射简称。

    DdsServiceInstanceToMachineMapping

    Service Instances

    引用步骤1~3定义的收发通信服务实例。

    说明：

    一组收发的通信之间的“Service Instance Id”需保持一致。
    • CameraDataDdsProvidedServiceInstance
    • CameraDataDdsRequiredServiceInstance

    Communication Connector

    引用已定义的Machine的以太网接口。

    Host0DpEthernetCommConne...

  5. 创建服务实例与网络通信端口之间的映射。

    1. 参考步骤1~2，在元素管理窗口的“ServiceInstanceMapping > ServiceInstanceToPortPrototypeMapping”下，创建发送端的相关映射元素，并完成如下配置。

      配置区域

      属性

      说明

      示例

      Configurating ServiceInstanceToPortPrototypeMapping

      Short Name

      发送端服务实例与网络通信端口之间的映射简称。

      DdsServiceInstanceToPPortPrototypeMapping

      Process

      引用已定义的发送数据的可执行程序的进程设计。

      SendCameraDataHost0Proce...

      Service Instance

      引用步骤2定义的发送端服务实例。

      CameraDataDdsProvidedServiceInstance

      Port Prototype

      Context Root Sw Component Prototype

      引用已定义的发送端组可执行程序的父类组件类型。

      CameraDataServerRootSwC

      Target Port Prototype

      引用已关联组件的发送端网络通信端口。

      PubCameraData

    2. 参照上一步，再创建一个ServiceInstanceToPPortPrototypeMapping，创建接收端的相关映射元素，并完成如下配置。

      配置区域

      属性

      说明

      示例

      ConfiguratingServiceInstanceToPortPrototypeMapping

      Short Name

      接收端服务实例与网络通信端口之间的映射简称。

      DdsServiceInstanceToRPortPrototypeMapping

      Process

      引用已定义的接收数据的可执行程序的进程设计。

      ReceiveCameraDataHost0Pr...

      Service Instance

      引用步骤3定义的接收端服务实例。

      CameraDataDdsReceivedServiceInstance

      Port Prototype

      Context Root Sw Component Prototype

      引用已定义的接收端可执行程序的父类组件类型。

      CameraDataClientRootSwC

      Target Port Prototype

      引用已关联组件的接收端网络通信端口。

      SubCameraData

  6. 在视图和元素管理窗口中，查看新增的元素。

父主题： 创建通信服务实例


创建SOME/IP通信服务实例

本文以创建收发摄像头数据的服务实例（CameraDataSpProvidedServiceInstance）和（CameraDataSpRequiredServiceInstance）为例，介绍创建SOME/IP通信服务实例的操作步骤。

前提条件

已定义SOME/IP通信协议部署、以太网接口、进程设计、网络通信端口和父类组件类型。

本文示例将引用已定义的相关配置项，具体信息如下表所示。

配置项

示例

相关文档

EthernetCommunicationConnector

Host0SpEthernetCommConnector

关联子网信息和SOME/IP服务中心

SomeipServiceInterfaceDeployment

CameraSpDeployment

部署SOME/IP通信协议

ProcessDesign
  • 发送端：SendCameraDataHost0ProcessDesign
  • 接收端：ReceiveCameraDataHost0ProcessDesign

定义可执行程序和进程设计

PortPrototype
  • 发送端：PubCameraData
  • 接收端：SubCameraData

RootSwC
  • 发送端：CameraDataServerRootSwC
  • 接收端：CameraDataClientRootSwCroot

操作步骤

  1. 创建数据发送的通信服务实例。

    1. 在“CM Designer”页面的元素管理窗口中，选择“ServiceInstantiation > ProvidedSomeipServiceInstance”，并单击上方 [image] 。

    2. 在“Select ARPackage”弹窗中，选择目标工程下的ARPackage，例如“cm/default.arxml/HuaweiMDC”，并单击“OK”。

  2. 配置数据发送的通信服务实例。

    1. 在元素配置窗口的“Configurating ProvidedSomeipServiceInstance”区域，完成如下配置。

      属性

      说明

      示例

      Short Name

      数据发送的通信服务实例的简称。

      CameraDataSpProvidedServiceInstance

      Service Interface Deployment

      引用已定义的SOME/IP通信部署。

      CameraSpDeployment

      Service Instance Id

      定义服务实例号，用于对应接收端服务实例。

      1
      • 配置“Service Interface Deployment”前，勾选“Associated Configuration”，会根据该通信部署的Event、Field或Method自动生成对应的聚合元素，也可根据业务需要调整对应的配置。
      • 配置“Service Instance Id”时，需注意一组收发的通信之间的“Service Instance Id”需保持一致。

    2. 在“Provided Event Groups”区域，单击 [image] 按钮，创建发送端的Event组，并完成如下配置。

      属性

      说明

      示例

      备注

      Short Name

      发送端的Event组的简称。

      CameraSomeipProvidedEventGroup

      -

      Event Group

      引用已定义的Event组。

      CameraSomeIpEventGroup

      -

      Multicast Threshold

      详细说明，请参见工具适配的MDC计算平台设备对应产品文档中“AP配置项参考 > SomeipProvidedEventGroup”。

      0

      勾选“Associated Configuration”后，该属性不会自动生成，需要根据业务需要配置。

    3. （可选）如需使用通信保护库功能，则在“E2e Event Protection Props”区域，单击 [image] 按钮，创建通信保护库属性，并完成如下配置。

      属性

      说明

      示例

      Short Name

      通信保护库属性的简称。

      CameraEndEventProtectionProps

      Event

      引用已定义的Event。

      CameraSpEventDeployment

      E2e Profile Configuration

      引用已定义的通信保护库配置。

      CameraE2EProfileConfiguration

      Data Ids

      详细说明，请参见工具适配的MDC计算平台设备对应产品文档中“AP配置项参考 > E2EProfileConfiguration配置”。

      2

      Min Data Length

      96

      Max Data Length

      32768

  3. 为数据接收创建SOME/IP服务发现的客户端配置。

    参考步骤1，在元素管理窗口的“ServiceInstantiation > SomeipSdClientServiceInstanceConfig”下，创建元素并完成配置。

  4. 创建并配置数据接收的通信服务实例。

    参考步骤1~2，在元素管理窗口的“ServiceInstantiation > RequiredSomeipServiceInstance”下，创建元素并完成配置。

    配置区域

    属性

    说明

    示例

    Configurating RequiredSomeipServiceInstance

    Short Name

    数据接收的通信服务实例的简称。

    CameraDataSpRequiredServiceInstance

    Service Interface Deployment

    引用已定义的SOME/IP通信部署。

    CameraSpDeployment

    Sd Client Config

    引用步骤3定义的SOME/IP服务发现的客户端配置。

    CameraSomeipSdClientServiceInstanceConfig

    Service Instance Id

    定义服务实例号，用于对应接收端服务实例。

    说明：

    一组收发的通信之间的“Service Instance Id”需保持一致。

    1

    Required Event Groups

    Short Name

    发送端的Event组的简称。

    CameraSomeipRequiredEventGroup

    Event Group

    引用已定义的Event组。

    CameraSomeIpEventGroup

    （可选）E2e Event Protection Props

    Short Name

    通信保护库属性的简称。

    CameraEndEventProtectionProps

    Event

    引用已定义的Event。

    CameraSpEventDeployment

    E2e Profile Configuration

    引用已定义的通信保护库配置。

    CameraE2EProfileConfiguration

    Data Ids

    详细说明，请参见工具适配的MDC计算平台设备对应产品文档中“AP配置项参考 > E2EProfileConfiguration配置”。

    1

    Min Data Length

    96

    Max Data Length

    32768

    配置“Service Interface Deployment”前，勾选“Associated Configuration”，会根据该通信部署的Event、Field或Method自动生成对应的聚合元素，也可根据业务需要调整对应的配置。

  5. 创建服务实例与Machine之间的映射。

    参考步骤1~2，在元素管理窗口的“ServiceInstanceMapping > SomeipServiceInstanceToMachineMapping”下，分别为发送端和接收端，创建元素并完成如下配置。

    属性

    说明

    发送端示例

    接收端示例

    Short Name

    服务实例与Machine之间的映射简称。

    ProvidedSomeipServiceInstanceToMachineMapping

    RequiredSomeipServiceInstanceToMachineMapping

    Service Instances

    引用步骤2和4定义的收发通信服务实例。

    说明：

    一组收发的通信之间的“Service Instance Id”需保持一致。

    CameraDataSpProvidedServiceInstance

    CameraDataSpRequiredServiceInstance

    Communication Connector

    引用已定义的Machine的以太网接口。

    Host0SpEthernetCommConne...

    Udp Port

    详细说明，请参见工具适配的MDC计算平台设备对应产品文档中“AP配置项参考 > ServiceInstance配置”章节。

    0

    1

    （可选）Secure Com Props For Udps

    如需使用TLS功能，需引用已配置的TLS安全传输属性。更多信息，请参见工具适配的MDC计算平台设备对应产品文档中“AP配置项参考 > TLS配置”章节。

    CameraClientTlsSecureCom...

    CameraServerTlsSecureCom...

  6. 创建服务实例与网络通信端口之间的映射。

    参考步骤1~2，在元素管理窗口的“ServiceInstanceMapping > ServiceInstanceToPortPrototypeMapping”下，分别为发送端和接收端，创建对应的相关映射元素，并完成如下配置。

    配置区域

    属性

    说明

    发送端示例

    接收端示例

    Configurating ServiceInstanceToPortPrototypeMapping

    Short Name

    服务实例与网络通信端口之间的映射简称。

    SomeipServiceInstanceToPPortPrototypeMapping

    SomeipServiceInstanceToRPortPrototypeMapping

    Process

    引用已定义的对应端数据的可执行程序的进程设计。

    SendCameraDataHost0Proce...

    ReceiveCameraDataHost0Pr...

    Service Instance

    引用步骤2和4定义的收发通信服务实例。

    CameraDataSpProvidedServiceInstance

    CameraDataSpRequiredServiceInstance

    Port Prototype

    Context Root Sw Component Prototype

    引用已定义的对应端可执行程序的父类组件类型。

    CameraDataServerRootSwC

    CameraDataClientRootSwC

    Target Port Prototype

    引用已关联组件的对应端的网络通信端口。

    PubCameraData

    SubCameraData

  7. 在视图和元素管理窗口中，查看新增的元素。

父主题： 创建通信服务实例


（可选）配置SOME/IP序列化属性

若选择SOME/IP通信，可对通信数据结构进行序列化配置。通过CM模块的“Serialization”下的元素，可配置序列化属性。

本文以摄像头数据通信为例，通过对数据类型CameraDataType进行序列化配置，介绍SOME/IP序列化属性配置的操作步骤。

前提条件

已定义数据类型、服务接口及其数据传输方式。

本文示例将引用已定义的相关配置项，具体信息如下表所示。

配置项 | 示例 | 相关文档
DataType | CameraDataType | 定义数据类型
ServiceInterface | CameraDataServiceInterface | 定义服务接口
Event | CameraData

背景信息

配置序列化时，会用到以下复合元素：

  • TransformationPropsSet.ApSomeipTransformationProp：定义序列化的各属性的具体配置。
  • TransformationPropsServiceInterfaceElementMappingSet.TransformationPropsToServiceInterfaceElementMapping：将属性TransformationProps同Event、Method、Field关联，用于配置ServiceInterface级别的序列化属性配置。
  • SomeipDataPrototypeTransformationProps.DataPrototypeInServiceInterfaceRef：通过一定的映射关系，关联TransformationProps到指定Event、Method、Field具体的数据类型，用于配置DataPrototype级别的序列化属性配置。

更多说明，请参见工具适配的MDC计算平台设备对应产品文档中“AP配置项参考 > 序列化属性配置”章节。

操作步骤

  1. 通过元素TransformationPropsSet，创建ApSomeipTransformationProp。

    1. 在“CM Designer”页面的元素管理窗口中，选择“Serialization > TransformationPropsSet”，并单击上方 [image] 。

    2. 在“Select ARPackage”弹窗中，选择目标工程下的ARPackage，例如“cm/default.arxml/HuaweiMDC”，并单击“OK”。

    3. 在元素配置窗口中，完成如下配置。

      参考工具适配的MDC计算平台设备对应产品文档中“AP配置项参考 > 序列化属性配置 > ApSomeipTransformationProps”修改默认属性配置，本文以默认配置为例。

  2. 通过元素TransformationPropsServiceInterfaceElementMappingSet，创建TransformationPropsToServiceInterfaceElementMapping。

    1. 参考步骤1，在元素管理窗口的“Serialization > TransformationPropsServiceInterfaceElementMappingSet”下，创建对应元素。

    2. 在元素配置窗口的“Configurating TransformationPropsServiceInterfaceElementMappingSet”，设置“Short Name”。

      示例使用默认值。

    3. 在“Mapping”区域，单击 [image] ，添加聚合元素“CommunicationConnector”，并完成如下配置。

      属性

      说明

      示例

      Short Name

      TransformationPropsToServiceInterfaceElementMapping的简称。

      TransformationPropsToServiceInterfaceElementMapping

      Events

      引用服务接口定义的传输方式。

      更多信息，请参见工具适配的MDC计算平台设备对应产品文档中“AP配置项参考 > 序列化属性配置 > TransformationPropsToServiceInterfaceElementMapping”。

      CameraData

      Fields

      Methods

      TransformationProps

      引用步骤1创建的ApSomeipTransformationProp。

      ApSomeipTransformationProp

  3. 通过SomeipDataPrototypeTransformationProps，创建DataPrototypeInServiceInterfaceRef。

    1. 参考步骤1，在元素管理窗口的“Serialization > SomeipDataPrototypeTransformationProps”下，创建对应元素。

    2. 在元素配置窗口，定义Short Name并创建一个DataPrototypeInServiceInterfaceRef。

      配置区域

      属性

      说明

      示例

      Configurating SomeipDataPrototypeTransformationProps

      Short Name

      SomeipDataPrototypeTransformationProps的简称。

      SomeipDataPrototypeTransformationProps

      Data Prototypes

      Port Interface

      引用定义的服务接口。

      CameraDataServiceInterface

      Root Data Prototype

      引用服务接口关联的Event。

      CameraData

      Target Data Prototype

      引用定义的数据类型。更多信息，请参见工具适配的MDC计算平台设备对应产品文档中“AP配置项参考 > 序列化属性配置 > TransformationPropsToServiceInterfaceElementMapping”。

      timeStamp

      Context Data Prototype

      CameraDataType

    3. 参考上一步，再创建两个DataPrototypeInServiceInterfaceRef，分别为数据类型的CameraDataType其他两个成员，配置DataPrototype级别的序列化属性配置。

  4. 在视图和元素管理窗口中，查看新增的元素。

父主题： 模块化界面配置示例


（可选）定义Service2Signal通信

如果部署了SOME/IP协议的通信，可根据业务需要，定义Service2Signal通信，以实现AUTOSAR AP与CP的相互通信。

通过CM模块的“SignalToService”和“EthernetPhysicalChannel”下的元素，可配置Service2Signal通信所使用的基础组件静态服务发现。

  • 配置静态服务发现
  • 定义Signal-Based通信
父主题： 模块化界面配置示例


配置静态服务发现

基于SignalBased通信的CP侧不支持发送服务发现报文，AP侧需要采用SOME/IP的静态服务发现方式与CP端进行通信。因此，在该场景下需配置静态服务发现，以预设CP侧的IP及端口等信息。本文以UDP方式的通信为例，介绍使用MMC来配置静态服务发现的相关操作步骤。

前提条件

已定义子网信息。

本文示例将引用已定义的相关配置项，具体信息如下表所示。

配置项 | 示例 | 相关文档
EthernetPhysicalChannel | Host0EthernetPhysicalChannel | 定义子网信息
NetwokEndpoint | Host0NetworkEndpoint

背景信息

服务端与客户端的静态服务发现配置方法相似，由PUD映射的服务实例决定。服务实例与PDU的映射配置操作，请参见定义Signal-Based通信。

除映射的PUD的服务实例外，还需注意：

  • 服务端仅需配置“SocketConnectionBundle”下的属性“Server Port”。
  • 客户端除“Server Port”外，还需配置“SocketConnection”的属性“Client Port”。
  • 如果同时配置了“Server Port”和“Client Port”，则以PDU映射的服务实例为准。

静态服务发现的更多信息，请参见工具适配的MDC计算平台设备对应产品文档中“AP配置项参考 > 配置静态服务发现”内的相关配置。

操作步骤

  1. 创建PduTriggering。

    1. 在元素管理窗口的“EthernetTopology > EthernetCluster”下，找到并单击已创建的EthernetCluster。

    2. 在元素编辑视图的“Ethernet Cluster Variants”区域，展开列表中的复合元素，选中“EthernetPhysicalChannel”后，单击 [image] ，再选择“Add Pdu Triggering”，为“EthernetPhysicalChannel”创建聚合元素“PduTriggering”，并设置“Short Name”为CameraPduTriggering。

  2. 创建SoAdConfig元素。

    选中“EthernetPhysicalChannel”后，单击 [image] ，再选择“Add So Ad Config”。

  3. 创建SocketAddress元素。

    1. 右键单击已创建的“SoAdConfig”元素，在下拉菜单中选择“Add Socket Address”，从而为“SoAdConfig”创建聚合元素“SocketAddress”。

    2. 参照上一步的方法，为“SocketAddress”创建聚合元素“ApplicationEndpoint”，并为聚合元素配置“Network Endpoint”。
    3. 为“ApplicationEndpoint”创建聚合元素“UdpTp”，再为自带的聚合属性“TpPort”配置“Port Number”。

    聚合元素

    需配置的属性

    说明

    示例

    ApplicationEndpoint

    Network Endpoint

    引用定义子网信息时定义的“NetworkEndpoint”。

    Host0NetworkEndpoint

    TpPort

    Port Number

    输入端口号，更多说明，请参见工具适配的MDC计算平台设备对应产品文档中“AP配置项参考 > TpPort”。

    1

  4. 创建SocketConnectionBundle。

    1. 参考步骤3.1，为“SoAdConfig”创建聚合元素“SocketConnectionBundle”，并为聚合元素配置“Server Port”。
    2. 为“SocketConnectionBundle”创建聚合元素“SocketConnection”，并为聚合元素配置“Client Port”。
    3. 为“SocketConnection”创建聚合元素“SocketConnectionIpduIdentifier”，并为聚合元素配置“PduTriggering”。

    聚合元素

    需配置的属性

    说明

    示例

    SocketConnectionBundle

    Server Port

    引用步骤3创建的“SocketAddress”。

    SocketAddress

    SocketConnection

    Client Port

    SocketAddress

    SocketConnectionIpduIdentifier

    PduTriggering

    引用步骤1创建的“PduTriggering”。

    CameraPduTriggering

后续操作

静态服务发现配置完成后，需为创建的PduTriggering配置Ipdu等相关元素，以实现S2S通信，具体操作请参见“定义Signal-Based通信”章节。

父主题： （可选）定义Service2Signal通信


定义Signal-Based通信

本文以定义摄像头的Event方式的通信为例，介绍定义Signal-Based通信的操作步骤。

背景信息

Service2Signal（Signal to Service，以下简称S2S）通信主要是在AP侧实现PDU（Protocol Data Unit）到AP数据类型的相互转换，实现AUTOSAR AP与CP的相互通信。其中PDU到AP侧数据类型的相互转换，需要在配置上实现PDU中ISignal与AP侧基础类型的映射。

  • AP作为接收端时，S2S模块可以根据配置从收到的PDU中取出相应的内存，从而转换成AP侧对应的数据类型。
  • AP作为发送端时，S2S模块可以将AP侧要发送的数据，逐一拷贝到所对应的PDU上，发送出去。

前提条件

  • 已部署SOME/IP通信协议，且SomeipEventDeployment中的“Serializer”属性被设置为“SIGNAL-BASED”。具体操作，请参见“部署SOME/IP通信协议”中的2。
  • 已配置静态服务发现。
  • 已定义数据类型、Event和通信服务实例。

本文示例将引用已定义的相关配置项，具体信息如下表所示。

配置项

示例

相关文档

DataType

CameraDataType

定义数据类型

Event

CameraData

定义服务接口

EthernetCluster

CameraEthernetCluster

定义子网信息

ServiceInstance
  • 发送端：CameraDataSpProvidedServiceInstance
  • 接收端：CameraDataSpRequiredServiceInstance

创建SOME/IP通信服务实例

操作步骤

  1. 创建系统Signal。

    1. 在“CM Designer”页面的元素管理窗口中，选择“SignalToService > SystemSignal”，并单击上方 [image] 。

    2. 在“Select ARPackage”弹窗中，选择目标工程下的ARPackage，例如“cm/default.arxml/HuaweiMDC”，并单击“OK”。

    3. 在元素配置窗口，设置“Short Name”和“Dynamic Length”。

  2. 创建ISignal。

    参照步骤1，在元素管理窗口的“SignalToService > ISignal”下，创建元素并完成如下配置。

    属性

    说明

    示例

    Short Name

    ISignal的简称。

    CameraISignal

    ISignal Type

    详细说明，请参见工具适配的MDC计算平台设备对应产品文档中“AP配置项参考 > SignalBased配置 > ISignal”配置项。

    ARRAY

    Length

    272

    System Signal

    引用上一步创建的系统Signal。

    CameraSystemSignal

    创建ISignal后，需为其配置“dataTypePolicy”的必配元素，否则无法通过校验。由于该元素不属于CM特性，本文不介绍相关操作。

  3. 创建ISignalIPdu。

    1. 参照步骤1，在元素管理窗口的“SignalToService > ISignalIPdu”下，创建元素。
    2. 在元素配置窗口的“Configurating ISignalIPdu”区域，完成如下配置。

      属性

      说明

      示例

      Short Name

      ISignal的简称。

      CameraISignalIPdu

      Has Dynamic Length

      详细说明，请参见工具适配的MDC计算平台设备对应产品文档中“AP配置项参考 > SignalBased配置 > ISignalIPdu”。

      FALSE

      Length

      272

    3. 在“ISignal To Pdu Mapping”区域，单击 [image] ，并完成如下配置。

      属性

      说明

      示例

      Short Name

      ISignal的简称。

      CameraISignalToIPduMapping

      ISignal

      引用步骤2定义的ISignal。

      CameraISignal

      Packing Byte Order

      详细说明，请参见工具适配的MDC计算平台设备对应产品文档中“AP配置项参考 > SignalBased配置 > ISignalToIPduMapping”。

      OPAQUE

      Start Position

      272

  4. 配置ISignalTriggering和PduTriggering。

    1. 在元素管理窗口的“EthernetTopology > EthernetCluster”下，找到并单击已创建的EthernetCluster。

    2. 在“Ethernet Cluster Variants”区域，展开列表中的复合元素，找到已创建的“PduTriggering”，并为其配置IPdu。

      属性

      说明

      示例

      IPdu

      引用步骤3创建的ISignalIPdu。

      CameraISignalIPdu

    3. 选中“EthernetPhysicalChannel”后，单击 [image] ，再选择“Add Isignal Triggering”，然后完成如下配置。

      属性

      说明

      示例

      Short Name

      ISignal Triggering的简称。

      CameraISignalTriggering

      IPdu

      引用步骤3创建的ISignalIPdu。

      CameraISignal

  5. 创建服务实例与Signal的映射。

    1. 参照步骤1，在元素管理窗口的“SignalToService > ServiceInstanceToSignalMappingSet”下，创建映射集。

    2. 在元素配置窗口的“Configurating ServiceInstanceToSignalMappingSet”区域，设置“Short Name”为“CameraServiceInstanceToSignalMappingSet”。
    3. 在“Service Instance To Signal Mappings”区域，单击 [image] ，为数据发送的服务实例与Signal之间，创建映射，并完成如下配置。

      属性

      说明

      示例

      Short Name

      建数据发送的服务实例与Signal的映射简称。

      CameraProvidedServiceInstanceToSignalMapping

      Service Instance

      引用已定义的数据发送的服务实例。

      CameraDataSpProvidedServ...

    4. 选中创建的映射后，单击 [image] ，然后选择“Signal Based Event Element To ISignal Triggering Mapping”，并完成以下配置。

      属性

      说明

      示例

      Short Name

      基于Signal Based的Event元素与Signal Triggering的映射简称。

      TimeStamSignalBasedEventElementToISignalTriggeringMapping

      ISignal Triggering

      引用步骤4创建的ISignal Triggering。

      CameraISignalTriggering

    5. 选中上一步创建的元素后，单击 [image] ，然后选择“Data Prototype In Service Interface Ref”，并完成以下配置。

      属性

      说明

      示例

      Root Data Prototype

      引用已定义的Event。

      CameraData

      Target Data Prototype

      引用已定义的Event的数据类型的成员。

      timeStamp

    6. 操作步骤5.5，为Event的数据类型的其他成员，创建“Data Prototype In Service Interface Ref”，并完成配置。

    7. 参考上述步骤5.3~5.6，在“Service Instance To Signal Mappings”区域，创建数据接收的服务实例与Signal的映射，并为该映射分别创建三个对应数据类型的映射。

      配置区域

      属性

      说明

      示例a

      ServiceInstanceToSignalMapping

      Short Name

      建数据接收的服务实例与Signal的映射简称。

      CameraServiceInstanceToSignalMapping

      Service Instance

      引用已定义的数据接收的服务实例。

      CameraDataSpRequiredServ...

      SignalBasedEventElementToISignalTriggeringMapping

      Short Name

      基于Signal Based的Event元素与Signal Trggering的映射简称。
      • TimeSignalBasedEventElementToISignalTriggeringMapping
      • dataFlowSignalBasedEventElementToISignalTriggeringMapping
      • ValidaFlowSignalBasedEventElementToISignalTriggeringMapping

      ISignal Triggering

      引用步骤4创建的ISignal Triggering。

      CameraISignalTriggering

      DataPrototypeInServiceInterfaceRef

      Root Data Prototype

      引用已定义的Event。

      CameraData

      Target Data Prototype

      引用已定义的数据类型。
      • timeStam
      • dataFlow
      • validaFlow

      a：如下图的示例所示，一个服务实例与Signal的映射下创建了三个对应的数据类型的映射，因此，除第三和第六行单元格的示例外，其他单元格内的示例均为对应的三个映射的示例。

  6. 在视图和元素管理窗口中，查看新增的元素。

父主题： （可选）定义Service2Signal通信


校验工程

工程配置完成后，您可以使用MMC的校验功能，对其进行校验。本文以全量校验为例，介绍校验工程的操作步骤。

前提条件

已完成工程的配置。

操作步骤

  1. 打开MMC工具后，如需开启实时校验功能，单击工具栏 [image] 按钮。
  2. 配置工程过程中，可在“Validation”视图中，查看实时校验结果，并参考Constraints错误修正错误。

    • 在“Validation”视图查看校验结果时，若手误关闭该视图，可选择“Window > Show View > Other > Validation”重新打开。
    • “Validation”视图相关操作说明，请参考Validation视图使用。

  3. （可选）如需关闭实时校验功能，再次单击 [image] 按钮。
  4. 完成工程配置后，选择目标工程进行一次性校验。

    • 方法一：单击工具栏 [image] 按钮。
    • 方法二：右键单击目标工程，在右键菜单中，选择“Validation > Validate Model”。

    校验结束后可在界面下方“Validation”视图中查看校验结果。

  5. 根据错误描述并参考Constraints错误，修改配置。
  6. 重复步骤4~5，直至“Validation”视图中无报错。
父主题： 模块化界面配置示例


导出配置文件

工程校验通过后，您可以将配置文件导出，以进行后续的开发。

前提条件

已成功校验工程。

操作步骤

  1. 右键单击目标工程后，再选择“Export...”。
  2. 在“Export”弹窗中选择“General > File System”，再单击“Next >”。

  3. 单击“To directory”栏的“Browse...”按钮，选择导出路径，再单击“Finish”。

后续操作

您可以将导出的配置文件用于后续开发，更多信息，请参见《MDC Development Studio 使用指南》的“创建MDC工程”章节。

父主题： 模块化界面配置示例


状态管理（SM）

State Management（下文简称SM）是AP中的状态管理组件，负责AP平台功能组的状态管理，提供功能组状态设置、查询等能力，实现平台上进程的协同管理。

可以使用MMC的模块化界面和拖拽式界面，配置状态管理（SM）的配置文件。

本章节仅介绍MMC工具的配置操作步骤，元素和属性的详细说明，请参见工具适配的MDC计算平台设备对应产品文档中“AP配置项参考 > SM配置项”章节。

  • 配置流程
  • 拖拽式界面配置示例
  • 模块化界面配置示例
父主题： AP配置示例


配置流程

SM配置流程涵盖定义功能组、功能组状态、功能组状态转换关系和扩展任务。定义的功能组可在配置Machine和Process时被引用。

图1 SM配置流程
表1 SM配置流程说明
任务描述 | 定义元素 | 关联元素 | 拖拽式界面配置流程 | 模块化界面配置流程
创建功能组，并为功能组配置基本信息。 | ModeDeclarationGroup | - | 创建功能组 | 创建功能组
定义功能组状态。 | ModeDeclaration、ModeConflict、ModeDependency | - | 定义状态 | 定义状态
定义状态转换关系，为所有功能组构建独立的状态机。 | ModeTransition | - | 定义状态关系 | 定义状态关系
为状态转换关系定义扩展任务。 | ModeTransitionTask | ModeTransition | 暂不支持 | （可选）定义转换关系的扩展任务
为Machine引用定义的功能组。 | - | FunctionGroup | 在Machine中配置功能组 | 操作步骤
父主题： 状态管理（SM）


拖拽式界面配置示例

本章节介绍如何通过MMC工具的拖拽式界面，高效地生成状态管理的配置文件。

  • 创建功能组
    配置状态管理时，需先创建功能组（Function Group）。功能组由不同的进程组成，这些进程之间协同控制，以完成特定的系统功能。
  • 定义状态
    创建功能组后，需为功能组定义状态。
  • 定义状态关系
    功能组定义状态后，需定义状态转换关系。通过状态转换关系为所有功能组构建独立的状态机。状态关系包括互斥、依赖和转换关系。本文为功能组Access的状态Running创建互斥和依赖关系，以及为MachineState创建转换关系为例，介绍相关的操作步骤。
  • 在Machine中配置功能组
    功能组定义完成后，可将其配置于Machine中。
  • 校验工程
  • 导出配置文件
    工程校验通过后，您可以将配置文件导出，以进行后续的开发。
父主题： 状态管理（SM）


创建功能组

配置状态管理时，需先创建功能组（Function Group）。功能组由不同的进程组成，这些进程之间协同控制，以完成特定的系统功能。

前提条件

已创建工程，并已创建了Machine和Process元素。具体操作，请参见“创建AUTOSAR工程”、“创建Machine元素”和“创建Process元素”章节。

操作步骤

  1. 打开已配置的拖拽式工程。
  2. 打开SM功能组画布。

    在“MMC Explorer”视图中，右键单击工程下ARXML文件下的“AUTOSAR”图标，选择“System & Machine > Mode Declaration Group”。

  3. 在“Mode Declaration”画布右侧工具栏中“Mode Declaration Group”下，将“Mode Group”拖拽至画布空白处，以创建功能组。

  4. 在画布下方的“Properties”窗口中，将“Short Name”修改为MachineState。
  5. 参照上述步骤，根据业务需要，创建指定的功能组，示例如下。

父主题： 拖拽式界面配置示例


定义状态

创建功能组后，需为功能组定义状态。

前提条件

已创建功能组。

操作步骤

  1. 在“Mode Declaration”画布右侧工具栏中“Mode Declaration Group”下，将“Mode”拖拽至指定功能组中，以定义该功能组的状态。

  2. 在画布下方的“Properties”窗口中，将“Short Name”修改为Off。
  3. 右侧工具栏中“Mode Declaration Group”下，将“Init Mode”拖拽至指定功能组中，并配置简称，以定义该功能组的初始状态。

  4. （可选）参照上述步骤，根据业务需要，为功能组创建并定义所需的多个状态。

    如下图所示，本文示例为2个功能组一共创建了11个状态。

父主题： 拖拽式界面配置示例


定义状态关系

功能组定义状态后，需定义状态转换关系。通过状态转换关系为所有功能组构建独立的状态机。状态关系包括互斥、依赖和转换关系。本文为功能组Access的状态Running创建互斥和依赖关系，以及为MachineState创建转换关系为例，介绍相关的操作步骤。

前提条件

已定义状态。

操作步骤

  1. 在“Mode Declaration”画布右侧工具栏中，选中“Transition”下的“Transition”。

  2. 依次单击画布中指定功能组中的状态，例如，先单击“Startup”，再单击“Update”，以定义转换关系。

    下图示例中定义的转换关系，表示由“Startup”转换为“Update”。

  3. 在画布下方的“Properties”窗口中，将“Short Name”修改为StartupToUpdate。
  4. 参考步骤1~3，在右侧工具栏中，分别选中Dependency和Conflict，然后再依次单击要定义的状态，以创建依赖和互斥关系。

  5. （可选）参照上述步骤，根据业务需要，为功能组状态创建和定义多个关系。

父主题： 拖拽式界面配置示例


在Machine中配置功能组

功能组定义完成后，可将其配置于Machine中。

前提条件

已定义功能组。

操作步骤

  1. 在“MMC Explorer”视图中，右键单击工程的“AUTOSAR”，选择“System & Machine > Machine Manifest”，进入Machine画布。
  2. 在画布右侧工具栏，将“Machine Manifest”下的“Mode Declaration Group”拖拽至指定的Machine中。

    创建Machine的操作，请参见创建Machine元素。

  3. 在“Mode Declaration Group Prototype”弹窗中，选择“Mode Declaration Group”，例如“MachineState”，然后单击“OK”。

  4. 根据业务需要，为Machine添加的功能组修改“Short Name”。
父主题： 拖拽式界面配置示例


模块化界面配置示例

本章节以SM模块下配置状态管理为例，介绍如何通过MMC工具高效地生成状态管理的配置文件。

  • 创建功能组
    配置状态管理时，需先创建功能组（Function Group）。功能组由不同的进程组成，这些进程之间协同控制，以完成特定的系统功能。
  • 定义状态
    创建功能组后，需为功能组定义状态。
  • 定义状态关系
    功能组定义状态后，需定义状态转换关系。通过状态转换关系为所有功能组构建独立的状态机。状态关系包括互斥、依赖和转换关系。本文为功能组Access的状态Running创建互斥和依赖关系，以及为MachineState创建转换关系为例，介绍相关的操作步骤。
  • （可选）定义转换关系的扩展任务
  • 在Machine中配置功能组
    功能组定义完成后，可将其配置于Machine中。
  • 校验工程
  • 导出配置文件
    工程校验通过后，您可以将配置文件导出，以进行后续的开发。
父主题： 状态管理（SM）


创建功能组

配置状态管理时，需先创建功能组（Function Group）。功能组由不同的进程组成，这些进程之间协同控制，以完成特定的系统功能。

前提条件

已创建工程，并在CM模块创建了Machine和Process元素。具体操作，请参见“创建AUTOSAR工程”、“关联子网信息”和“定义应用进程信息”章节。

操作步骤

  1. 在“MMC Explorer”视图中，右键单击目标工程，在快捷菜单中选择“Modular Configurator”。
  2. 在“Modular Configurator”界面中，单击“State Management”模块的“Select”，进入功能组配置界面。

  3. 创建并定义功能组。

    1. 在元素管理窗口中，选择“ModeDeclaration > ModeDeclarationGroup”，并单击上方 [image] 按钮。

    2. 在“Select ARPackage”弹窗中，选择目标工程下的ARPackage，例如“sm/mdc_mode_declaration.arxml/HuaweiMDC”，并单击“OK”。

    3. 在打开的右侧元素配置窗口中，为创建的功能组配置属性。

      表1 功能组属性说明

      属性

      说明

      示例值

      是否必配

      Short Name

      功能组的简称。

      仅支持以字母开头，取值仅限字母、数字和下划线，且总的字符长度在[1,128]。

      MachineState

      是

      AR Package

      该元素所属的包。

      manifest/default.arxml/HuaweiMDC

      是

      Category

      选择功能组的目录，以应用于对应的元素属性：

      • （默认）FunctionGroup：功能组。
      • Process：进程状态组。

      更多详细说明，请参见工具适配的MDC计算平台设备对应产品文档中“AP配置项参考 > Machine配置/Process配置”。

      FunctionGroup

      否

      Initial Mode

      创建功能组状态后，再配置该属性。

      具体操作，请参见定义状态的步骤4。

      -

      是
    4. 参考步骤1~3，根据业务需要，再创建指定的功能组。

父主题： 模块化界面配置示例


定义状态

创建功能组后，需为功能组定义状态。

前提条件

已创建功能组。

操作步骤

  1. 在“SM Designer”元素管理窗口，选中要配置的功能组后，然后在元素配置界面，单击“Mode Declarations”下的 [image] 按钮，以创建一个功能组状态。

  2. 单击创建的功能组状态的“Short Name”列，为其定义简称，例如Off。

  3. （可选）取消选中功能组状态后，参照上述步骤，根据业务需要，创建多个功能组状态。

    本文示例中，为功能组MachineSate创建以下状态。

    为功能组Access创建以下状态。

  4. 在“Configurating ModeDeclarationGroup”区域，配置初始状态。

    MachineSate配置示例：

    Access配置示例：

父主题： 模块化界面配置示例


定义状态关系

功能组定义状态后，需定义状态转换关系。通过状态转换关系为所有功能组构建独立的状态机。状态关系包括互斥、依赖和转换关系。本文为功能组Access的状态Running创建互斥和依赖关系，以及为MachineState创建转换关系为例，介绍相关的操作步骤。

前提条件

已定义状态。

操作步骤

  1. 在“SM Designer”元素管理界面，选中要配置互斥和依赖关系的功能组后，例如Access，然后在元素配置界面的“Mode Declarations”列表中，选中已创建的功能组状态。

  2. 单击“Mode Declarations”下 [image] 旁的 [image] 按钮，再根据业务需要，选择“Add Mode Conflict”或“Add Mode Dependency”，为功能组状态定义互斥或依赖关系。

  3. 单击“States”列中对应单元格中的“...”，然后分别为互斥和依赖关系，定义对应的功能状态。

    功能组状态的更多详细说明，请参见工具适配的MDC计算平台设备对应产品文档中“AP配置项参考 > ModeDeclaration配置”章节。

  4. 在“SM Designer”元素管理界面，选中要配置转换关系的功能组后，例如MachineState，然后单击元素配置界面“Mode Transitions”下的 [image] 按钮，以创建一个功能组状态的转换关系。

    配置状态组状态的转换关系，示例如下。

    关于该元素的详细说明，请参见工具适配的MDC计算平台设备对应产品文档中“AP配置项参考 > ModeTransition配置”章节。

  5. （可选）单击“Actions”列单元格内的“...”，为转换关系配置关联动作。

    一个转换关系可添加多个关联动作，添加的关联动作按照从上至下的优先级大小。

  6. （可选）参照上述步骤，根据业务需要，定义多个状态转换关系。

    MachineSate配置示例：

    Access配置示例：

父主题： 模块化界面配置示例


（可选）定义转换关系的扩展任务

定义状态转换关系后，可为其配置扩展任务。

前提条件

已定义状态转换关系。

操作步骤

  1. 在“SM Designer”元素管理界面，选中要配置转换关系扩展任务的功能组后，例如MachineState，然后在元素配置界面的“Mode Transitions”下的列表中，选中要配置扩展任务的状态转换关系。

  2. 单击“Mode Transitions”下 [image] 旁的 [image] 按钮，选择“Add Mode Transition Task”，为状态转换关系定义扩展任务。

    功能组状态的更多详细说明，请参见工具适配的MDC计算平台设备对应产品文档中“AP配置项参考 > ModeTransitionTask配置”章节。

  3. （可选）参考上述步骤，为状态转换关系定义多个扩展任务。

父主题： 模块化界面配置示例


在Machine中配置功能组

功能组定义完成后，可将其配置于Machine中。

前提条件

已定义功能组。

操作步骤

  1. 打开CM模块下的元素配置界面，选择“MachineManifest > Machine”，单击已创建Machine元素。
  2. 在右侧的元素配置窗口，单击“Function Groups”下的 [image] 按钮，为Machine创建一个功能组。
  3. 分别单击创建的功能组的“Short Name”列和“Type”，为其定义简称，以及上文所定义的CM功能组MachineState。

父主题： 模块化界面配置示例


持久化（PER）

PER（Persistence，持久化）模块为AP应用提供将数据存储至持久化介质，以及从持久化介质中读取数据的能力。其基本功能包括：文件数据解析与存储、冗余备份与恢复、资源管理等。

本章节通过使用MMC的模块化界面介绍Key-Value文件以及普通文件的持久化配置。

本章节仅介绍MMC工具的配置操作步骤，元素和属性的详细说明请参见工具适配的MDC计算平台设备对应产品文档中“AP配置项参考 > PER配置项”章节。

  • KeyValueStorage配置示例
  • FileStorage配置示例
父主题： AP配置示例


KeyValueStorage配置示例

  • 配置流程
  • 定义数据类型
  • 定义Key-Value数据库
  • 定义操作接口
  • 配置映射关系
父主题： 持久化（PER）


配置流程

Key-Value文件的持久化配置流程涵盖数据类型、Key-Value数据库、操作接口定义以及映射关系配置等步骤，图1为计算平台推荐的Key-Value文件持久化配置流程，当前MMC工具仅支持模块化配置。

图1 KeyValueStorage配置流程
表1 KeyValueStorage配置流程说明
任务描述 | 定义元素 | 关联元素 | 模块化界面配置流程
定义数据类型。 | StdCppImplementationDataType | - | 定义数据类型
定义Key-Value数据库，包括Key-Value数据、冗余备份策略以及KV文件保存路径。 | PersistencyKeyValueDatabase、PersistencyKeyValuePair、Uri、PersistencyRedundancyCrc、PersistencyRedundancyMOutOfN | StdCppImplementationDataType | 定义Key-Value数据库
定义操作接口，并配置启动冗余备份功能。 | Redundancy、PersistencyKeyValueDataElement | - | 定义操作接口
配置映射关系，包括操作端口、可执行程序、进程设计、应用进程信息的配置以及PortPrototype与KeyValueDatabase的映射。 | KeyValueStorage、Process、PortPrototype、Executable、ProcessDesign | PersistencyKeyValueDatabase、Process、RootSwComponentPrototype、PortPrototype | 配置映射关系
父主题： KeyValueStorage配置示例


定义数据类型

配置Key-Value文件的持久化时，需先定义Key-Value数据的Value值所对应的数据类型。本文以文本型的Value为例，介绍String数据类型的创建。

前提条件

已创建工程名称为Per的工程，具体操作请参见“创建AUTOSAR工程”章节。

操作步骤

  1. 在“MMC Explorer”视图中，右键单击目标工程，在快捷菜单中选择“Modular Configurator”。
  2. 在“Modular Configurator”界面中，单击“Core Types”模块的“Select”按钮，进入基础数据类型模块配置界面。

  3. 创建数据类型String。

    1. 在元素管理窗口中，选择“DataType > StdCppImplementationDataType > STRING”，并单击上方 [image] 。

    2. 在“Select ARPackage”弹窗中，选择目标工程下的ARPackage，例如“Per/default.arxml/HuaweiMDC”，并单击“OK”。

    3. 在元素配置窗口中，设置“Short Name”为String。

父主题： KeyValueStorage配置示例


定义Key-Value数据库

  1. 返回“Modular Configurator”界面，单击“Persistency”模块的“Select”按钮，进入持久化模块配置界面。

  2. 创建Key-Value数据库。

    1. 在元素管理窗口中，选择“Persistency > PersistencyKeyValueDatabase”，并单击上方 [image] 。

      也支持通过在元素管理窗口选择目标元素，单击鼠标右键，选择“Add”来新增目标元素。

    2. 在“Select ARPackage”弹窗中，选择目标工程下的ARPackage，例如“Per/default.arxml/HuaweiMDC/Persistency”，并单击“OK”。
    3. 在元素配置窗口完成以下配置。

      属性

      说明

      示例

      Short Name

      输入Key-Value数据库简称。

      KeyValueDatabase

      Maximum Allowed Size

      （可选）设置最大可用磁盘空间。

      此处示例为0，表示不限制大小。

      0

      Uri

      设置KV文件保存路径。

      /home/mdc/Per/KeyValueDatabase.json

      Original File Path

      （可选）设置初始化文件路径。

      /home/mdc/Per/originalfile/

      Backup File Path

      （可选）设置备份文件路径。

      /home/mdc/Per/

  3. （可选）在“RedundancyHandlings”区域，单击 [image] ，依次设置完整性校验规则、可成功恢复文件的最小有些备份数以及备份个数。

    属性

    说明

    子属性

    示例

    PersistencyRedundancyCrc

    设置完整性校验规则。

    目前仅支持32位的CRC32校验算法。

    Algorithm Family

    CRC32

    Length

    32

    PersistencyRedundancyMOutOfN

    设置可以成功恢复文件的最小有效备份数“M”。

    M

    2

    设置备份的个数“N”。

    N

    3

  4. 设置Key-Value数据。

    1. 在“Key Value Pairs”区域，单击 [image] ，设置Key-Value数据的Key值，并关联已创建的数据类型。

      属性

      说明

      示例

      Short Name

      输入Key-Value数据的Key值。

      key_string

      Value Data Type

      引用已创建的数据类型。

      String
    2. 选择已创建的Key值，单击 [image] ，选择“TextValueSpecification”，设置Key-Value数据的Value值。

      属性

      说明

      示例

      Value

      输入Key-Value数据的Value值。

      test

父主题： KeyValueStorage配置示例


定义操作接口

  1. 在元素管理窗口中，选择“PortInterface > PersistencyKeyValueDatabaseInterface ”，并单击上方 [image] 。
  2. 在“Select ARPackage”弹窗中，选择目标工程下的ARPackage，例如“Per/default.arxml/HuaweiMDC/PortInterface”，并单击“OK”。
  3. 配置操作接口。

    1. 在元素配置窗口完成以下配置。

      属性

      说明

      示例

      Short Name

      输入操作接口的简称。

      KeyValueDatabaseInterface

      Redundancy

      （可选）设置是否启动冗余备份功能。

      REDUNDANT

      Data Type For Serializations

      （可选）选取需要序列化的数据类型。

      String
    2. 在“Date Elements”区域，单击 [image] ，配置所生成KV文件的Key-Value数据元素。

      属性

      说明

      示例

      Short Name

      输入Key-Value数据元素的简称。

      说明：

      此属性的配置依赖PersistencyKeyValuePair，需与Key-Value数据的Key值保持一致。

      key_string

      Type

      引用已定义的value的类型。

      String

父主题： KeyValueStorage配置示例


配置映射关系

完成操作接口创建后，需配置操作端口、可执行程序、进程设计以及应用进程信息，并完成PortPrototype与KeyValueDatabase的映射。

前提条件

已完成Machine的创建，并为其配置Processor、ModeDeclarationGroup等EM相关的必配元素，关于EM的更多信息，请参见《平台开发指南》的“EM开发指南”章节。

操作步骤

  1. 配置操作端口。

    1. 在“PER Designer（Per）”界面的元素管理窗口中，选择“Application > AdaptiveApplicationSwComponentType”，并单击上方 [image] 。
    2. 在“Select ARPackage”弹窗中，选择目标工程下的ARPackage，例如“Per/default.arxml/HuaweiMDC/Application”，并单击“OK”。
    3. 在元素配置窗口，“Short Name”输入应用组件的简称Per。
    4. 在“Ports”下，单击 [image] 按钮，然后选择“Add PPort”，为组件添加发送端口，并完成如下配置。

      属性

      说明

      示例值

      Short Name

      发送端的端口简称。

      KeyValueStoragePort

      Port Interface

      引用已定义的操作接口。

      KeyValueDatabaseInterface

  2. 配置可执行程序。

    1. 在元素管理窗口中，选择“Application > Executable”，并单击上方 [image] 。
    2. 在“Select ARPackage”弹窗中，选择目标工程下的ARPackage，例如“Per/default.arxml/HuaweiMDC/Application”，并单击“OK”。
    3. 完成以下配置，创建可执行程序。

      配置区域

      属性

      说明

      示例

      Configurating Executable

      Short Name

      输入可执行程序的简称。

      Per

      Root Sw Component Prototype

      Short Name

      父类组件类型的简称。

      Per

      Application Type

      引用已定义的应用组件。

      Per

  3. 创建进程设计，并引用对应的可执行程序。

    1. 在元素管理窗口中，选择“Application > ProcessDesign”，并单击上方 [image] 。
    2. 在“Select ARPackage”弹窗中，选择目标工程下的ARPackage，例如“Per/default.arxml/HuaweiMDC/ProcessDesign”，并单击“OK”。
    3. 完成如下配置，创建进程设计的元素。

    配置区域

    属性

    说明

    示例

    Configurating ProcessDesign

    Short Name

    进程设计的简称。

    PerProcessDesign

    Executable

    引用已创建的可执行程序。

    Per

  4. 配置应用进程信息。

    1. 在元素管理窗口中，选择“ProcessManifest > Process ”，并单击上方 [image] 。
    2. 在“Select ARPackage”弹窗中，选择目标工程下的ARPackage，例如“Per/default.arxml/HuaweiMDC/Process”，并单击“OK”。
    3. 在“Configurating Process”区域，完成以下配置。

      属性

      说明

      示例

      Short Name

      可执行程序的进程简称。

      PerProcess

      Executable

      引用与进程关联的可执行程序。

      Per

      Design

      引用与进程关联的进程设计。

      PerProcessDesign

    4. 在“Process State Machine”区域，完成以下配置，设置进程状态。

      属性

      说明

      示例

      Short Name

      进程状态的简称。

      PerProcessState

      Type

      引用已创建的进程状态。

      PerProcessState
    5. 在“State Dependent Startup Configs”区域，为进程配置启动项，并配置进程所依赖的功能组状态。

  5. 将可执行程序映射到Machine。

    1. 在元素管理窗口中，选择“ProcessManifest > ProcessToMachineMappingSet ”，并单击上方 [image] 。
    2. 在“Select ARPackage”弹窗中，选择目标工程下的ARPackage，例如“Per/default.arxml/HuaweiMDC/Process”，并单击“OK”。
    3. 配置“Short Name”为ProcessToMachineMappingSet。
    4. 在元素配置窗口的“Process To MachineMappings”下，单击 [image] ，完成以下配置，创建进程到Machine的映射。

      属性

      说明

      示例

      Short Name

      进程与Machine的映射的简称。

      ProcessToMachineMapping

      Machine

      引用与进程关联的Machine。

      Host0DPMachine

      Process

      引用已创建的进程。

      PerProcess

  6. 配置PortPrototype与KeyValueDatabase的映射关系。

    1. 在元素管理窗口中，选择“PersistencyMapping > PersistencyPortPrototypeToKeyValueDatabaseMapping ”，并单击上方 [image] 。
    2. 在“Select ARPackage”弹窗中，选择目标工程下的ARPackage，例如“Per/default.arxml/HuaweiMDC/PersistencyMapping”，并单击“OK”。
    3. 在元素配置窗口完成以下配置。

      属性

      说明

      示例

      Short Name

      输入PersistencyPortPrototypeToKeyValueDatabaseMapping的简称。

      KeyValueDatabaseMapping

      Key Value Storage

      引用已定义的Key-Value数据库。

      KeyValueDatabase

      Process

      引用已定义的应用进程。

      PerProcess
    4. “Port Prototype”下，完成以下配置。

      属性

      说明

      示例

      Context Root Sw Component Prototype

      引用已定义的可执行程序。

      Per

      Target Port Prototype

      引用已定义的操作端口。

      KeyValueStoragePort

后续操作

  1. 完成上述操作后，请参见“全量校验”章节对工程进行校验。
  2. 工程校验通过后，请参见“导出全量配置文件”导出配置文件用于后续开发。
父主题： KeyValueStorage配置示例


FileStorage配置示例

  • 配置流程
  • 定义文件夹
  • 定义持久化文件
  • 定义操作接口
  • 配置映射关系
父主题： 持久化（PER）


配置流程

普通文件的持久化配置流程涵盖文件夹、持久化文件、操作接口定义以及映射关系配置等步骤，图1为计算平台推荐的普通文件持久化配置流程，当前MMC工具仅支持模块化配置。

图1 FileStorage配置流程
表1 FileStorage配置流程说明
任务描述 | 定义元素 | 关联元素 | 模块化界面配置流程
定义文件夹，包括冗余备份策略以及普通文件保存路径。 | PersistencyFileArray、Maximum Allowed Size、Uri、PersistencyRedundancyCrc、PersistencyRedundancyMOutOfN | - | 定义文件夹
定义持久化文件。 | PersistencyFileArray | - | 定义持久化文件
定义操作接口，并配置启动冗余备份功能。 | PersistencyFileProxyInterface、Redundancy | - | 定义操作接口
配置映射关系，包括操作端口、可执行程序、进程设计、应用进程信息的配置以及PortPrototype与FileArray的映射。 | Persistency File Array、Process、PortPrototype、Executable、ProcessDesign | PersistencyFileArray、Process、RootSwComponentPrototype、PortPrototype | 配置映射关系
父主题： FileStorage配置示例


定义文件夹

前提条件

已创建工程名称为Per的工程，具体操作请参见“创建AUTOSAR工程”章节。

操作步骤

  1. 在“MMC Explorer”视图中，右键单击目标工程，在快捷菜单中选择“Modular Configurator”。
  2. 在“Modular Configurator”界面中，单击“Persistency”模块的“Select”按钮，进入持久化模块配置界面。
  3. 配置普通文件持久化的文件夹。

    1. 在元素管理窗口中，选择“Persistency > PersistencyFileArray ”，并单击上方 [image] 。
    2. 在“Select ARPackage”弹窗中，选择目标工程下的ARPackage，例如“Per/default.arxml/HuaweiMDC/Persistency”，并单击“OK”。
    3. 在元素配置窗口完成以下配置。

      属性

      说明

      示例

      Short Name

      输入文件夹的简称。

      FileArray

      Maximum Allowed Size

      （可选）设置最大可用磁盘空间。

      此处示例为0，表示不限制大小。

      0

      Uri

      设置普通文件的保存路径。

      /home/mdc/Per

      Original File Path

      （可选）设置初始化文件路径。

      /home/mdc/Per/originalfile/

      Backup File Path

      （可选）设置备份文件路径。

      /home/mdc/Per/

  4. （可选）在“RedundancyHandlings”区域，单击 [image] ，依次设置完整性校验规则、可成功恢复文件的最小有些备份数以及备份个数。

    属性

    说明

    子属性

    示例

    PersistencyRedundancyCrc

    设置完整性校验规则。

    目前仅支持32位的CRC32校验算法。

    Algorithm Family

    CRC32

    Length

    32

    PersistencyRedundancyMOutOfN

    设置可以成功恢复文件的最小有效备份数“M”。

    M

    2

    设置备份的个数“N”。

    N

    3

父主题： FileStorage配置示例


定义持久化文件

  1. 在元素管理窗口中，选择“Persistency > PersistencyFileArray ”，在“Files”区域，单击 [image] ，配置持久化文件。

    属性

    说明

    示例

    Short Name

    输入持久化文件的简称。

    file1

    File Name

    输入文件名。

    file1.txt

  2. （可选）重复1的操作，配置多个持久化文件。

父主题： FileStorage配置示例


定义操作接口

  1. 在元素管理窗口中，选择“PortInterface > PersistencyFileProxyInterface”，并单击上方 [image] 。
  2. 在“Select ARPackage”弹窗中，选择目标工程下的ARPackage，例如“Per/default.arxml/HuaweiMDC/PortInterface”，并单击“OK”。
  3. 在元素配置窗口完成以下配置。

    属性

    说明

    示例

    Short Name

    输入操作接口的简称。

    FileArrayInterface

    Redundancy

    设置是否启动冗余备份功能。

    REDUNDANT

  4. 在“Files Proxies”区域，单击 [image] ，配置应用运行时的持久化文件。

    属性

    说明

    示例

    Short Name

    输入应用运行时持久化文件的简称。

    file1

    File Name

    输入文件名。

    file1.txt

  5. （可选）重复4的操作，配置多个持久化文件。

父主题： FileStorage配置示例


配置映射关系

完成操作接口创建后，需配置操作端口、可执行程序、进程设计以及应用进程信息，并完成PortPrototype与FileArray的映射。

前提条件

已完成Machine的创建，并为其配置Processor、ModeDeclarationGroup等EM相关的必配元素，关于EM的更多信息，请参见《平台开发指南》的“EM开发指南”章节。

操作步骤

  1. 配置操作端口。

    1. 在“PER Designer（Per）”界面的元素管理窗口中，选择“Application > AdaptiveApplicationSwComponentType”，并单击上方 [image] 。
    2. 在“Select ARPackage”弹窗中，选择目标工程下的ARPackage，例如“Per/default.arxml/HuaweiMDC/Application”，并单击“OK”。
    3. 在元素配置窗口，“Short Name”输入应用组件的简称Per。
    4. 在“Ports”下，单击 [image] 按钮，然后选择“Add PPort”，为组件添加发送端口，并完成如下配置。

      属性

      说明

      示例值

      Short Name

      发送端的端口简称。

      FileStoragePort

      Port Interface

      引用已定义的操作接口。

      FileArrayInterface

  2. 配置可执行程序。

    1. 在元素管理窗口中，选择“Application > Executable”，并单击上方 [image] 。
    2. 在“Select ARPackage”弹窗中，选择目标工程下的ARPackage，例如“Per/default.arxml/HuaweiMDC/Application”，并单击“OK”。
    3. 完成以下配置，创建可执行程序。

      配置区域

      属性

      说明

      示例

      Configurating Executable

      Short Name

      输入可执行程序的简称。

      Per

      Root Sw Component Prototype

      Short Name

      父类组件类型的简称。

      Per

      Application Type

      引用已定义的应用组件。

      Per

  3. 创建进程设计，并引用对应的可执行程序。

    1. 在元素管理窗口中，选择“Application > ProcessDesign”，并单击上方 [image] 。
    2. 在“Select ARPackage”弹窗中，选择目标工程下的ARPackage，例如“Per/default.arxml/HuaweiMDC/ProcessDesign”，并单击“OK”。
    3. 完成如下配置，创建进程设计的元素。

    配置区域

    属性

    说明

    示例

    Configurating ProcessDesign

    Short Name

    进程设计的简称。

    PerProcessDesign

    Executable

    引用已创建的可执行程序。

    Per

  4. 配置应用进程信息。

    1. 在元素管理窗口中，选择“ProcessManifest > Process ”，并单击上方 [image] 。
    2. 在“Select ARPackage”弹窗中，选择目标工程下的ARPackage，例如“Per/default.arxml/HuaweiMDC/Process”，并单击“OK”。
    3. 在“Configurating Process”区域，完成以下配置。

      属性

      说明

      示例

      Short Name

      可执行程序的进程简称。

      PerProcess

      Executable

      引用与进程关联的可执行程序。

      Per

      Design

      引用与进程关联的进程设计。

      PerProcessDesign

    4. 在“Process State Machine”区域，完成以下配置，设置进程状态。

      属性

      说明

      示例

      Short Name

      进程状态的简称。

      PerProcessState

      Type

      引用已创建的进程状态。

      PerProcessState
    5. 在“State Dependent Startup Configs”区域，为进程配置启动项，并配置进程所依赖的功能组状态。

  5. 将可执行程序映射到Machine。

    1. 在元素管理窗口中，选择“ProcessManifest > ProcessToMachineMappingSet ”，并单击上方 [image] 。
    2. 在“Select ARPackage”弹窗中，选择目标工程下的ARPackage，例如“Per/default.arxml/HuaweiMDC/Process”，并单击“OK”。
    3. 配置“Short Name”为ProcessToMachineMappingSet。
    4. 在元素配置窗口的“Process To MachineMappings”下，单击 [image] ，完成以下配置，创建进程到Machine的映射。

      属性

      说明

      示例

      Short Name

      进程与Machine的映射的简称。

      ProcessToMachineMapping

      Machine

      引用与进程关联的Machine。

      Host0DPMachine

      Process

      引用已创建的进程。

      PerProcess

  6. 配置PortPrototype与FileArray的映射关系。

    1. 在元素管理窗口中，选择“PersistencyMapping＞PersistencyPortPrototypeToFileArrayMapping”，并单击上方 [image] 。
    2. 在“Select ARPackage”弹窗中，选择目标工程下的ARPackage，例如“Per/default.arxml/HuaweiMDC/PersistencyMapping”，并单击“OK”。
    3. 在元素配置窗口完成以下配置。

      属性

      说明

      示例

      Short Name

      输入PersistencyPortPrototypeToFileArrayMapping的简称。

      FileArrayMapping

      Persistency File Array

      引用已定义的普通文件持久化的文件夹。

      FileArray

      Process

      引用已定义的应用进程。

      PerProcess

  7. 在“Port Prototype”下，完成以下配置。

    属性

    说明

    示例

    Context Root Sw Component Prototype

    引用已定义的可执行程序。

    Per

    Target Port Prototype

    引用已定义的操作端口。

    FileStoragePort

后续操作

  1. 完成上述操作后，请参见“全量校验”章节对工程进行校验。
  2. 工程校验通过后，请参见“导出全量配置文件”导出配置文件用于后续开发。
父主题： FileStorage配置示例


配置MCU的数据通路

本章节介绍如何使用MMC配置MCU的CANFD通路的数据透传，仅MDC 610产品支持此功能。

  • MMC工具自带各配置项默认参数值，可修改的参数值双击输入行即可编辑。
  • 右键单击元素行选择“Expand All”，可将选中元素下所有信息展开。
  • 通用配置流程
  • 配置CanFd数据通路
父主题： MDC Manifest Configurator 使用指南


通用配置流程

图1 通用配置总流程图

图1展示了向MCU下发配置好的通路配置的通用流程，具体配置方法如表1所示。

表1 向MCU下发通路配置通用流程
任务项 | 使用软件/硬件 | 子任务描述 | 备注
配置ARXML文件 | MMC | 步骤一：新建AUTOSAR工程。 | 右键单击“MMC Explorer”视图空白处，并选择“New > AUTOSAR Project”。
 |  | 步骤二：根据实际业务需求完成所需通路配置。 | CANFD：参考配置CanFd数据通路。
 |  | 步骤三：导出ARXML文件“mdc610_mcu_data.arxml”。 | 右键单击“MMC Explorer”视图中目标ARXML文件，并选择“Export...”。
生成JSON配置文件 | MDS | 步骤四：新建MDC工程。 | 参考《MDC Development Studio 使用指南》的“创建MDC工程”章节。
 |  | 步骤五：将ARXML配置文件“mdc610_mcu_data.arxml”导入新建的MDC工程，并生成JSON配置文件“mcu_canfdbus_config.json”。 | 参考《MDC Development Studio 使用指南》的“生成代码和配置文件”章节。
 |  | 步骤六：导出JSON配置文件“mcu_canfdbus_config.json”文件。 | 参考《MDC Development Studio 使用指南》的“导出文件”章节。
向MCU下发通路配置 | SSH客户端 | 步骤七：参考《调测指南》“配置MCU侧的CAN通路”章节，将文件“mcu_canfdbus_config.json”拷贝至MDC 610系统环境的“/opt/platform/mdc_platform/runtime_service/devmc/conf”目录下。 | -
 |  | 步骤八：在MDC 610系统环境任意目录下执行命令mdc-tool devm set-dev-cfg 2，使用mdc-tool下发通路配置。 | 执行完观察回显，若回显信息包含“SetDevCfg CanFdBusFile info success!”，则配置下发成功。
生效通路配置 | MDC 610 | 步骤九：断电重启计算平台设备，使通路配置生效。 | -
父主题： 配置MCU的数据通路


配置CanFd数据通路

本节介绍如何使用MMC的MCU Designer功能配置CanFd通路，用于数据透传。

操作步骤

下文以MMC中已存在名为Demo的AUTOSAR工程为例进行操作指导。

  1. 在“MMC Explorer”视图中，右键单击创建的AUTOSAR工程，从快捷菜单中选择“MCU Designer > MDC 610”，打开对应版本的MCU Designer编辑器。

  2. 在“MCU Designer”编辑器左侧单击配置类别“CanFd Bus”，打开“CanFd Bus”配置页面。

    单击“CanFd Bus”后若出现如下提示框，单击“OK”即可。

    若有已配置好的“mcu_canfdbus_config.json”文件，单击“OK”新建配置，且新建的配置一旦下发成功，此新建配置生成的配置文件将覆盖原配置文件。

  3. 在右侧“Configuring CanFdBusConfigFunParam”元素配置栏中配置2通路的参数。

    单击各通路所含元素左侧 [image] 按钮显示如图1所示参数列表，对参数进行配置。
    图1 通路参数列表

    具体的参数配置说明可参考《SoC软件接口说明书》的“CAN通路配置项”章节。

  4. （可选）根据实际业务需求，在右下方“Configuring RxFilterFunParam”和“Configuring McuSendMsgFunParam”元素配置栏下，通过新增按钮和删除按钮 [image] 分别对RxFilterFunParam（接受过滤配置项）和McuSendMsgFunParam（下发过滤配置项）元素进行管理。

    • 下文具体的参数配置说明可参考《SoC软件接口说明书》的“CAN通路配置项”章节。
    • 下文以RxFilterFunParam元素为例介绍配置方法，McuSendMsgFunParam元素配置方法同理。
    1. 单击“Configuring RxFilterFunParam”栏中 [image] ，新增RxFilterFunParam.RxFilterFunInfoElem。
    2. 下拉展开新增RxFilterFunInfoElem的配置列表，依据已配置的通路，输入对应通路ID值（“ChannelId”），此处以ID为0的通路为例。
    3. 配置RxFilterFunParam.RxFilterFunInfoElem.RxIdListParam元素。
      1. 下拉展开RxIdListParam元素配置列表，选中子元素RxIdElmParam，通过 [image] 按钮可以添加多个子节点元素（RxIdElmElem），也可通过更改“Validsize”参数决定RxldElmElem数量。“Validsize”属性值随子节点元素个数变化而变化。

      2. 下拉子节点元素RxldElmElem，进行参数配置。

  5. （可选）若需要删除以上CanFd Bus数据透传的配置，在视图中选中并删除如图2所示的“CanfdBusPPort”、“CanbusMapping”、“CanFdBus”和“CanfdBusDatabaseInterface”元素。

    图2 删除CanFd Bus数据透传配置

父主题： 配置MCU的数据通路


配置网络通信

MMC工具提供图形化界面方式配置整车EE（Electronic Engineering，电子电气）网络架构，可直观显示计算平台系统与传感器以及其他ECU设备的连接关系，并且支持生成计算平台系统的网络资源管理（简称NRM）配置文件并导出，简化通信网络的配置操作。

MMC工具仅支持MDC 610和MDC 210的部分版本，具体以MDC平台系统实际发布的功能为准。

本章节以MDC 610的配置为例，介绍配置网络通路的相关操作。

本章节仅介绍网络资源参数的配置操作，参数的详细说明，请对应设备的《产品文档》中《SoC软件接口说明书》的“网络管理”章节。

  • 概述与须知
  • 常用快捷操作
  • 网络配置流程
  • 创建网络配置工程
  • 配置计算平台设备属性
  • 配置以太网络
  • 配置LVDS网络
  • 配置CAN网络
  • 配置UART网络
  • 校验网络配置工程
  • 生成网络配置文件
  • 网络配置工程常见报错
  • 快速修复校验错误
父主题： MDC Manifest Configurator 使用指南


概述与须知

在配置整车网络之前需要了解NRM工程配置功能和基本的界面操作要素。

功能概述

整车EE网络架构按照通信类型分为以太网络、CAN网络、UART网络以及LVDS总线四种类型。

整车网络的物理拓扑均可在VehicleNetwork界面中完成配置。其界面如图1所示。

图1 整车EE架构配置界面

MMC工具软件中默认嵌入的网络模型，已经自带计算平台设备模型，右边工具栏中提供传感器或者其他ECU设备、外部端口以及物理连接等部件图标，可通过单击或者拖拽的操作方式在界面中完成创建。

完成网络配置后，MMC支持生成配置文件，将配置文件导入计算平台设备即可完成网络修改。

安全声明

MMC工具内嵌有网络配置需要的三个元模型：传感器元模型（sensorpackage）、网络端口元模型（networkportpackage）和网络配置元模型（nrmconfig）。在网络配置工程模型xml文件中（model.nrmconfig）可查看三个元模型的调用URI：

  • http://com.huawei.mdc.nrm/sensorpackage
  • http://com.huawei.mdc.nrm/networkportpackage
  • http://com.huawei.mdc.nrm/nrmconfig

这三个URI仅仅为MMC工具包内部三个元模型的调用路径，并非可访问网址。

父主题： 配置网络通信


常用快捷操作

在网络配置界面中，MMC工具提供了快捷操作与提示信息，了解后会有助于提升操作的便捷性。

  • 快速创建传感器等ECU设备

    在“VehicleNetwork”界面空白处，鼠标静置时会自动弹出可创建的传感器或者其他ECU设备类型，选择需要创建的部件图标，即可对新建设备配置名称等基本信息。

  • 快速创建传感器等ECU设备的端口

    将鼠标静置在待创建端口的传感器或者ECU设备上，会自动弹出当前设备支持的端口类型，根据类型提示信息单击对应的端口，即可在弹出的窗口中设置端口基本信息。

  • 参数帮助信息

    设置参数时，将鼠标放置在其后的 [image] 图标上，可获取该参数的解释以及配置参考信息。

  • 参数输入即时校验

    MMC工具提供了参数配置的即时校验功能，有两种报错形式：

    • 对于在Properties界面中配置的参数，当输入值不合法时，工具会弹窗上报错误。
    • 对于在弹窗类设置窗框中的参数，当输入值不合法时，设置框前会有 [image] ，鼠标放置其上，即可获取具体错误信息。
  • 配置变更提示与保存

    当配置画布中有变更时，画布名称栏会有*提醒有变更，可用Ctrl+S键盘快捷键方式保存，MMC工具也支持一定时间内自动保存。保存后*会消失。

  • 整车网络界面中隐藏指定网络

    整车网络中含有多种类型网络，当需要只显示指定类型网络，隐藏不需要的网络类型时，可在工具栏过滤功能键右边下拉菜单中选择需隐藏的网络类型。

  • 切换网络配置界面

    MMC工具提供了（VehicleNetwork）、MDC以太网（Ethernet）、MDC CAN/Uart网络（CanAndUart）和全局VLAN网络（VLAN-global）四个网络配置界面，当需要在不同界面中切换时，可以在界面空白处的右键菜单中选择“Open”，从下拉菜单中选择需要打开的其他网络界面。

父主题： 配置网络通信


网络配置流程

车载EE架构网络配置流程主要包括配置整车拓扑、配置计算平台设备以及配置不同类型网络的相关信息。

通常的车载EE架构网络配置流程如图1所示。

图1 网络配置流程图

每个配置任务的详细信息如表1所示。

表1 网络工程配置流程
序号 | 任务 | 说明
1 | 创建网络配置工程 | 支持创建新工程或者导入原有的工程。
2 | 配置计算平台设备属性 | 配置计算平台设备的基本属性，包括部署方式、盒子身份以及诊断IP地址等信息。
3 | 配置以太网络 | 可创建以太网通信的传感器、ECU设备以及网关等设备，基于设备配置以太端口信息、网卡信息、防火墙、ARL、QoS策略和时间同步信息等，MMC工具也支持基于VLAN子网卡配置VLAN子网相关信息。
 | 配置LVDS网络 | 可创建MDC系统支持的摄像头模组，并配置适配的模组信息、端口信息等LVDS网络参数。
 | 配置CAN网络 | 可创建CAN传感器/ECU设备，并配置外部CAN端口、计算平台设备的SoC/MCU内CAN设备信息和时间同步信息。
 | 配置UART网络 | 可创建UART端口设备，并配置外部UART端口和计算平台设备SoC内UART设备信息。
4 | 校验网络配置工程 | 校验工程，确保网络模型合法有效。
5 | 导出NRM配置文件 | 导出网络配置相关的*.json文件，传输至计算平台设备相应的目录即可完成修改。
父主题： 配置网络通信


创建网络配置工程

MMC工具的网络配置工程（简称NRM工程）嵌入了设备默认的网络模型，创建NRM工程时即可打开网络模型。

MMC工具支持导入NRM工程，其导入操作可参考导入工程。

操作步骤

  1. 打开MMC工具后，在顶部菜单栏，选择“File > New > NrmConfig Project”。
  2. 在“New Example”弹窗完成工程名、工程路径与模型文件的配置。

    表1 New Example参数说明

    参数

    说明

    Project name

    NRM工程的名称。

    • 可在创建完后修改该配置。
    • 支持英文字母、数字和下划线。

    Use default location

    是否使用默认的路径作为NRM工程的路径。

    • （默认）勾选：使用。
    • 去勾选：不使用，则需点击右侧“Browse”自定义路径。

    Use default configuration

    是否使用MMC工具内嵌的默认配置模型。

    • （默认）勾选：使用默认的系统配置。MMC内嵌有多个设备类型的默认系统配置，可通过Version参数进行选择。
    • 去勾选：需选择指定的网络模型文件。
      说明：

      工程内必须包含“.project”、“.aird”和“.nrmconfig”格式的3个文件。

    Version

    MMC工具集成NRM工程所属的设备类型。

    • 610
    • 210

    当选择MMC工具集成的默认配置模型时，即勾选Use default configuration，可通过Version参数切换NRM工程默认配置文件的版本。

    当采用其他配置模型，则该选项自动置灰不可配置。

  3. 单击“Finish”。
  4. 在“MMC Explorer”视图中单击工程目录下的model.nrmconfig，编辑区域会加载并显示模型文件中的整车网络架构。

  5. （可选）关闭VehicleNetwork界面后需重新打开界面。

    右键单击工程目录下的model.nrmconfig，选择Open Diagram。

父主题： 配置网络通信


配置计算平台设备属性

在整车EE架构中，需要配置每个设备的基本属性。

前提条件

已创建网络配置工程。

操作步骤

  1. 在“MMC Explorer”视图中单击工程目录下的“model.nrmconfig”，打开“VehicleNetwork”界面。

    如果不是第一次打开工程界面，则需要右键单击“model.nrmconfig”，选择“Open Diagram”。

  2. 选中设备（MDC 610），在“Properties”视图中，查看或修改以下计算平台设备的基本属性。

    参数

    说明

    Name

    设备名称，由工程中的已有模型配置决定，不可配置。

    Id

    设备ID。

    MDC Style

    设备部署模式。

    • single：单盒子模式
    • double：双盒子模式

    Master Slave

    双盒子模式中的设备身份，仅当双盒子模式下该参数可配置，单盒子模式下默认为master。

    • master：A设备。
    • slave：B设备。

    Diagnostics Ip

    诊断IP地址。

    下拉菜单中有本设备所有网卡的IP地址，按照规划从列表中选择诊断IP地址。

父主题： 配置网络通信


配置以太网络

  • 功能概述
  • 配置任务总览
  • 基于物理连接配置以太网
  • 基于VLAN配置以太网
  • 配置全局属性
父主题： 配置网络通信


功能概述

MMC工具支持物理连接配置以太网和基于VLAN配置整车以太网络。

基于物理连接配置以太网

基于物理连接配置以太网的功能包括配置整车以太网络拓扑以及全局以太网参数、以太设备以太端口、网卡和VLAN子网卡的配置。

  • 配置整车以太网络
    • 在整车以太网络中可以创建以太传感器、网关或者其他以太ECU设备。
    • 可以创建设备之间的物理连接。
    • 可以配置整车以太网络的防火墙白名单、DNS、协议参数、QoS调度参数等全局参数。
  • 配置计算平台设备的以太网属性
    • MMC工具提供独立的计算平台设备配置界面，从整车网络进入MDC内部以太网后，即可见计算平台设备的默认以太网络模型。下图仅为示例，具体以版本软件实际配置为准。

      默认模型中可查看SoC上的网卡，不同颜色标识直连外部端口的网卡（蓝色）和通过LSW交换模块连接外部端口的网卡（黄色），每个网卡上默认配置的VLAN。

    • 在MDC计算平台以太网属性包括外部端口属性、SoC网卡属性以及VLAN子网卡属性，不可配置项在界面中会置灰。
    • 支持配置SOC网卡业务数据流。
  • 配置以太传感器、网关或者其他以太ECU设备

    MMC支持配置以太传感器的外部端口、网卡与VLAN子网卡的属性，也支持配置网卡的业务数据流。

基于VLAN配置以太网

MMC工具提供基于整车以太的VLAN子网的配置功能。

  • 在整车VLAN网络界面中可以查看所有VLAN子网以及子网卡，可以避免VLAN ID重复，也可以查看每个VLAN ID业务流。
  • 在该界面中可查看已有的VLAN子网。
  • 支持创建与配置VLAN子网与子网卡，子网卡需选择整车网络中的设备上已经创建的子网卡。
  • 在两种配置方式中均可以配置VLAN子网卡和业务数据流，效果等同并且支持同步。

层次化的配置界面

MMC工具提供整车网络、单个设备内部网络、单个端口、VLAN子网卡以及网卡的数据流不同层级的配置界面，可以完成所有以太网的参数配置，并支持不同界面之间的切换。

父主题： 配置以太网络


配置任务总览

以太网络配置通常遵循先基于物理连接配置各个设备的以太网属性，再基于VLAN进行查看或者调整部分网络属性的顺序。

配置任务总览为通常采用的配置流程。

图1 整车以太配置流程图
表1 以太网配置任务说明
注释 | 配置方式 | 任务 | 子任务 | 说明
① | 基于物理连接配置以太网 | 配置计算平台设备以太网属性 | 配置以太网端口 | 包含面板以太网端口的使能、速率、主从模式以及时间同步等参数。
 |  |  | 配置ARL列表 | 配置端口的ARL列表。
 |  |  | 配置SoC网卡 | 配置SoC网卡的基本属性（网卡名、MAC地址等）和高级属性（队列优先级、路由表和ARP表项等）。
 |  |  | 配置VLAN子网卡 | 可创建VLAN子网卡，并配置子网卡的基本属性和高级属性。
 |  |  | 配置SoC网卡/VLAN子网卡业务数据流 | 可配置业务数据流的源端口和目的端口信息，限速开关等ACL（Access Control List）信息。
② |  | 配置传感器/ECU以太网属性 | 创建以太传感器/ECU设备 | 创建与计算平台设备待连接的传感器（如Lidar）和其他以太网端口的ECU设备。
 |  |  | 配置以太网端口 | 创建并配置传感器/ECU设备的以太网端口信息，包括端口名称、主从模式和速率等信息。
 |  |  | 配置网卡 | 配置传感器/ECU设备的网卡的名称，端口使能，主从模式等信息。
 |  |  | 配置VLAN子网卡 | 可创建VLAN子网卡，并配置子网卡的基本属性和高级属性。
 |  |  | 配置网卡/VLAN子网卡业务数据流 | 可配置业务数据流的源端口和目的端口信息，限速开关等ACL（Access Control List）信息。
③ |  | 配置网关 | 创建网关设备 | 网关是计算平台设备连接外网的互联设备。
 |  |  | 配置网关端口 | 网关可支持配置交换端口和传感器端口。
④ |  | 连接以太网设备 |  | 物理连接的两端端口需要确保传输类参数信息一致或者匹配，例如速率一致，主从模式匹配等。
⑤ | 基于VLAN配置以太网 | 查看全局VLAN子网 |  | 可在界面中查看所有VLAN子网以及每个子网包含的设备VLAN子网卡。
 |  | 创建VLAN子网 |  | 可在界面中创建新的VLAN子网。
 |  | 配置VLAN子网卡 |  | 可在新建的VLAN子网中创建网卡，网卡需从整车以太网的已存在设备端口和网卡中选择。
 |  | 配置业务数据流 |  | 可配置所有VLAN子网卡的业务数据流。
⑥ | 基于物理连接配置以太网/基于VLAN配置以太网 | 配置全局以太网属性 |  | 在整车EE架构界面和全局VLAN界面中均可配置以太网的全局属性，包括防火墙开关、DNS信息以及TCP保活参数等。
父主题： 配置以太网络


基于物理连接配置以太网

基于物理连接配置以太网是指按照物理组网逐个配置每个以太网设备，包括外部端口、网卡和业务数据流。

  • 配置计算平台设备以太网属性
  • 配置以太网传感器\ECU设备
  • 配置以太网网关设备
  • 建立以太网物理连接
父主题： 配置以太网络


配置计算平台设备以太网属性

默认的以太网配置模型（包括MMC工具内嵌的模型和MDC SDK包提供的模型）提供计算平台设备基本配置，可以基于实际业务需求进行调整。

  • 配置计算平台的面板端口
  • 配置ARL
  • 配置计算平台网卡
父主题： 基于物理连接配置以太网


配置计算平台的面板端口

计算平台设备提供以太网外部面板端口，可配置面板端口的使能、主从模式、速率以及ARL（Address Resolution List）等信息。

前提条件

  • 已创建网络资源配置工程。
  • 已了解以太网面板端口配置参数的含义与约束限制，请参见适配设备的《产品文档》中《SoC软件接口说明书》的“以太网网络”章节。

背景信息

在计算平台设备的硬件架构中，一部分以太网面板端口直连SoC网卡，一部分通过内部交换模块（LSW）连接SoC网卡。在界面中可直观查看端口连接情况，以图1为示例。

图1 计算平台面板端口与网卡

蓝色SoC网卡是直连外部端口（A3，A4和B4），黄色SoC网卡是通过交换模块（LSW）连接外部端口（A1，A2，B1-B3）。两种外部端口配置时会有差异。

操作步骤

  1. 在“MMC Explorer”视图中单击工程目录下的“model.nrmconfig”，打开“VehicleNetwork”界面。

    如果不是第一次打开工程界面，则需要右键单击“model.nrmconfig”，选择“Open Diagram”。

  2. （可选）在“VehicleNetwork”界面中单击MDC 610，右键菜单选择“Enter”>“Ethernet”，进入“MdcEthernet”界面。

  3. 单击选择计算平台设备的面板以太端口。

    可以在整车网络“VehicleNetwork”界面中直接选择计算平台设备的外部车载以太网面板端口进行配置操作。

  4. 在“Properties”视图中配置已选择面板端口对应的信息。

    详细描述如表1所示。

    表1 计算平台以太网面板端口参数

    参数

    说明

    Enable

    端口使能开关。

    • disable：禁止。
    • enable：使能。

    Port Type

    端口类型。

    每个面板端口支持的端口类型不一样，每种端口类型支持的配置属性有差异。具体以界面提示信息为准。

    Speed

    端口速率。单位：Mbit/s。

    端口速率不支持配置时，参数项会自动置灰。

    AutoNeg

    自协商工作模式。仅供查看，不支持配置。

    • disAutoNeg：非自协商。
    • autoNeg：自协商。

    MasterSlave

    端口主从模式。端口的主从模式需要与连接对端端口匹配。

    取值范围：

    • master：主端口
    • slave：从端口

    TsyncMode

    时钟同步模式。端口的时钟模式需要与连接对端端口匹配。

    取值范围：

    • master：主模式，表示本端口是端口连接链路的时间源。
    • slave：从模式，表示本端口时钟同步于连接链路对端端口时钟。

    TsyncDomainId

    时间同步功能。

    • 0：同步数据面时间
    • 1：同步管理面时间
    • 其他：关闭时间同步功能

    VlanList

    VLAN列表。配置操作参见5。

    • 当端口类型为sensorPort和debugPort时，VLAN List不可配置。
    • 仅支持配置1个Untag类型的VLAN ID。

    InQueue

    入报文队列的优先级。仅当Vlan类型为Untag时有效。

    取值范围：0-7，0为最低优先级，7为最高优先级，默认取值为0。

  5. 配置端口的VLANList信息，主要包括新增、修改和删除：

    • 新增：单击“add”后，在弹窗中定义“VlanId”。
    • 修改：选中VLAN ID后，单击“modify”，在弹窗中修改“VlanId”。
    • 删除：选中VLAN ID后，单击“delete”。
    • 更改“Port Type”为sensorPort或debugPort时，原有端口上配置的VLAN ID会被清除，若恢复至默认配置端口类型时，面板端口会同步恢复原有默认配置的VLAN ID。
    • 直连SoC网卡的面板端口VLAN ID会同步于其直连的SoC网卡VLAN ID信息。连接LSW的面板端口VLAN ID会同步于其关联的VLAN子网卡。

父主题： 配置计算平台设备以太网属性


配置ARL

连接LSW的以太网外部端口支持配置ARL（Address Resolution List）功能，可以实现报文的路由转发。

前提条件

  • 已了解ARL各项参数解释与约束，参见适配设备的《产品文档》中《SoC软件接口说明书》的“静态ARL条目配置项”章节。
  • 已进入“MdcEthernet”配置界面。

操作步骤

  1. 在“MdcEthernet”界面选中面板端口后，在“Properties”-“ARL Config”配置MAC地址自学习功能（“MacLearnEnable”）。

    • disable：关闭端口的MAC地址自学习功能。
    • enable：开启端口的MAC地址自学习功能。

  2. 自动生成或者删改已有的Arl表项。

    • 自动生成：单击“generate”，将自动生成以太网网络中已存在的符合该端口的Arl表项。

      仅当端口MAC地址自学习功能关闭时自动生成功能获取的ARL表项才有效。

      修改“Arl List”后，如果再单击“generate”，不会清除已添加的ARL，仅新增适配该端口的ARL表项。

    • 删除：选中Arl表项后，单击“delete”。
    • 修改：单击“modify”，可进入“PanelPortImpl”界面根据需要修改。参见步骤3。

  3. 手动新增、修改和删除Arl表项。

    1. 右键单击面板端口，选择“Enter > Open Arl Operate Table”。

      进入面板端口的ARL表项配置界面（“PanelPortImpl”）。

    2. 新增ARL表项。

      在界面任一位置右键菜单选择“ARLEntery”，即可新增Arl表项。

    3. 选择新增的“ARLEntery”，在“Properties”中配置VLAN ID、多播MAC地址和单播MAC地址。

    4. 修改Arl表项。

      可选择需要修改的表项，在“Properties”界面中修改参数。

    5. 删除Arl表项。

      选中待删除项，右键菜单选择Delete line。

父主题： 配置计算平台设备以太网属性


配置计算平台网卡

计算平台设备网络模型中包括SoC物理网卡和VLAN子网卡。可根据业务需要，配置SoC网卡和增删VLAN子网卡。

  • 配置SoC物理网卡
  • 创建计算平台的VLAN网卡
  • 配置计算平台的VLAN网卡
  • 关联计算平台的虚拟网卡与面板端口
  • 配置网卡/VLAN子网卡业务数据流
父主题： 配置计算平台设备以太网属性


配置SoC物理网卡

SoC物理网卡配置信息包括基本属性和高级属性。

前提条件

  • 已了解网卡配置项含义与限制，参见适配设备的《产品文档》的《SoC软件接口说明书》的“以太网网络”章节。
  • 已进入“MdcEthernet”配置界面。

操作步骤

  1. 在“MdcEthernet”界面选择需配置的SoC物理网卡。

  2. 在“Properties”中配置SoC物理网卡基本属性，包括网卡名和MAC地址。

    参数

    说明

    Name

    物理网卡的名称。

    Mac

    物理网卡的MAC地址。

    连接LSW的物理网卡不支持配置MAC地址。

    Soc Port

    网卡所在的SoC物理端口号。

    取决于硬件，仅供查询。

  3. 在高级属性（Advanced configuration）区域中配置单播IP地址、多播IP地址以及路由信息。

    1. 配置单播IP地址（“Unicast IP List”）。

      可单击右侧的“add”、“modify”以及“delete”新增、修改和删除对应的单播IP地址。

    2. 配置多播IP地址（“Multicast IP List”）。

      可单击右侧的“add”、“modify”以及“delete”新增、修改和删除对应的多播IP地址。

    3. 配置路由信息表。
      • 可单击右侧“generate”，根据已配置传感器、ECU设备等路由信息自动生成该端口的路由表信息。

        “generate”自动生成功能会覆盖之前手动修改的内容，且无法回退。

        • 如果与该网卡连接的传感器的指定IP设置为了上网网关IP，“generate”自动生成功能会获取默认网关IP路由表项和主机IP的路由表项。

          配置上网网关的操作，请参见配置全局属性。

      • 可单击右侧add、modify和delete进行路由信息表的增加、修改和删除等操作。

  4. 在高级属性（Advanced configuration）区域中配置端口静态ARP表项。

    • 当完成了外部以太传感器或者ECU设备和计算平台设备的配置时，点击“generate”可自动提取信息并生成网卡的ARP表项。

      “generate”自动生成功能会覆盖之前手动修改的内容，且无法回退。

    • 可以点击右侧“add”、“modify”和“delete”进行ARP表项的增加、修改和删除等操作。

    一个网卡的ARP表项不能超过256个，系统会自动忽略超出数量的配置项。

父主题： 配置计算平台网卡


创建计算平台的VLAN网卡

当现有的物理网卡无法满足实际业务需求时，可创建VLAN网卡（也称为虚拟网卡），以进一步扩展网络资源。

背景信息

  • 在计算平台系统的默认配置网络模型中，“eth0”网卡和“ethg0”网卡上已经配置VLAN网卡。
  • 单个物理网卡上最多可创建15个虚拟网卡。

前提条件

  • 已创建网络资源配置工程。
  • 已了解以太网面板端口配置参数的含义与约束限制，请参见适配设备的《产品文档》中《SoC软件接口说明书》的“以太网网络”章节。

操作步骤

  1. 在“VehicleNetwork”界面中单击MDC 610，右键菜单选择“Enter”>“Ethernet”，进入“MdcEthernet”界面。

  2. 在“MdcEthernet”画布右侧工具栏中，先单击 [image] ，再单击画布中SoC的网卡，创建虚拟网卡。

    创建虚拟网卡时，请勿使用系统预置的“Vlan ID”。否则，当面板端口的“Port Type”发生变更时，原预置Vlan ID的虚拟网卡会被删除。

    配置面板端口的更多信息，请参见配置计算平台的面板端口。

    配置后即可在网卡中查看到创建的虚拟网卡。

父主题： 配置计算平台网卡


配置计算平台的VLAN网卡

VLAN网卡配置信息包括网卡名称、VLAN ID等基本信息以及队列优先级、路由信息等高级属性。

前提条件

  • 已创建虚拟网卡，或创建工程时使用的网络模型含虚拟网卡。
  • 已进入“MdcEthernet”配置界面。
  • 已了解以太网面板端口配置参数的含义与约束限制，请参见适配设备的《产品文档》中《SoC软件接口说明书》的“以太网网络”章节。

操作步骤

  1. 在“MdcEthernet”画布中单击需要配置的虚拟网卡。
  2. 在“Properties”视窗的“VirtualNetworkInterfaceCard”区域，配置虚拟网卡的以下信息。

  3. 在高级属性（Advanced configuration）区域中配置队列优先级策略。

    1. 配置网卡输入方向报文队列序号（“In Queue”）。
    2. 配置网卡输出方向报文队列优先级（“Egress Priority”）。

      出队列优先级策略即指队列调度优先级（“Skb Priority”）与VLAN优先级（“VLAN Priority”）的映射关系。

      • 可单击右侧“add”，新增出队列优先级策略。

      • 可选择已配置的优先级策略，单击右侧modify和delete进行修改或者删除操作。

  4. 在高级属性（Advanced configuration）区域中配置单播IP地址、多播IP地址以及路由信息。

    1. 配置单播IP地址（“Unicast IP List”）。

      可单击右侧的“add”、“modify”以及“delete”新增、修改和删除对应的单播IP地址。

    2. 配置多播IP地址（“Multicast IP List”）。

      可单击右侧的“add”、“modify”以及“delete”新增、修改和删除对应的多播IP地址。

    3. 配置路由信息表。
      • 可单击右侧“generate”，根据已配置传感器、ECU设备等路由信息自动生成该端口的路由表信息。

        “generate”自动生成功能会覆盖之前手动修改的内容，且无法回退。

        • 如果与该网卡连接的传感器的指定IP设置为了上网网关IP，“generate”自动生成功能会获取默认网关IP路由表项和主机IP的路由表项。

          配置上网网关的操作，请参见配置全局属性。

      • 可单击右侧add、modify和delete进行路由信息表的增加、修改和删除等操作。

  5. 在高级属性（Advanced configuration）区域中配置端口静态ARP表项。

    • 当完成了外部以太传感器或者ECU设备和计算平台设备的配置时，点击“generate”可自动提取信息并生成网卡的ARP表项。

      “generate”自动生成功能会覆盖之前手动修改的内容，且无法回退。

    • 可以点击右侧“add”、“modify”和“delete”进行ARP表项的增加、修改和删除等操作。

    一个网卡的ARP表项不能超过256个，系统会自动忽略超出数量的配置项。

父主题： 配置计算平台网卡


关联计算平台的虚拟网卡与面板端口

连接LSW的物理网卡上的虚拟网卡才需要配置与面板端口的关联关系，直连SoC物理网卡上的虚拟网卡无需配置关联关系。

前提条件

  • 已创建虚拟网卡，并配置面板端口，且面板端口类型不能为sensorPort和debugPort。
  • 已进入“MdcEthernet”配置界面。

注意事项

  • 当面板端口配置了与某个已存在的虚拟网卡相同的VLAN ID时，面板端口会自动与该虚拟网卡关联，无需手动连线。
  • 端口和VLAN网卡的关联会影响端口VLAN ID信息：
    • 建立或取消面板端口和VLAN网卡时，面板端口会自动添加或删除对应的VLAN ID。
    • 在面板端口删除VLAN ID时，会删除对应的关联关系，不会删除已存在的VLAN网卡。
    • 如果面板端口同时关联多个相同VLAN ID的虚拟网卡，只有所有相同VLAN ID的网卡与面板端口的关联关系均被删除时，面板端口才会自动删除对应的VLAN ID。
  • 对于未配置VLAN子网卡的物理网卡，默认与所有未配置VLAN的非直连面板端口相通，故无需关联。

操作步骤

  1. 在“MdcEthernet”画布的右侧工具栏中，单击 [image] 。
  2. 先单击需要关联的面板端口，再单击待关联的虚拟网卡。

    连线完成后，面板端口属性中的Vlan list中会生成对应的VLAN ID。

父主题： 配置计算平台网卡


配置网卡/VLAN子网卡业务数据流

MMC工具支持对SoC网卡和VLAN网卡配置业务数据流，包括协议类型、限速开关，速率以及源端口和目的端口IP与端口号。

前提条件

  • 已进入“MdcEthernet”配置界面。
  • 已了解参数解释和约束限制，详情请参见对应设备的《产品文档》中《SoC软件接口说明书》的“防火墙配置”中表 AclCfgEntry配置项说明。

背景信息

业务数据流的ACL规则是基于全局以太网有效，不仅限于当前端口。为了便于观测各个网卡的业务部署，建议分别在各个网卡配置各自的业务数据流。

操作步骤

  1. 进入SoC物理网卡或者VLAN网卡的业务配置界面。

    单击……

    右键菜单选择……

    SoC物理网卡

    “Enter>NetworkInterfacedCard”

    VLAN网卡

    “Enter>VirtualNetworkInterfacedCard”

  2. （可选）进入业务数据流配置界面，单击第一行，在“Properties”视图中，可配置网卡属性。

    下图以SoC物理网卡界面为例。

    该界面配置网卡属性方法和参数解释与“MdcEthernet”画布中配置方法相同，且数据同步更新。

  3. 右键单击界面任一空白处，选择“ServiceEntry”即可新增业务数据。

  4. 选择新增业务，在“Properties”视图中配置业务信息。

    参数

    说明

    Description

    配置项描述。

    Protocol

    协议类型。

    目前仅支持ARP、TCP、UDP、ICMP以及IGMP。

    Priority

    优先级。

    LimitEnable

    限速开关。

    • disable：关闭。
    • enable：开启。

    Rate

    限制速率。

    取值范围：(0,1048575]，单位：KB/s。

    当开启LimitEnable时，必须配置，且不能为0。

    SourceIpS

    源IP。

    SourcePorts

    源端口号。

    DestIPs

    目的IP地址。

    DestPorts

    目的端口号。

父主题： 配置计算平台网卡


配置以太网传感器\ECU设备

MMC工具提供MDC计算平台系统支持的传感器元模型和网关等其他ECU设备元模型，并支持在VehicleNetwork界面中创建并配置，便于视图展示EE架构的网络拓扑。

所有传感器和ECU设备的属性仅用于展示网络规划，将不会呈现在最终生成的网络配置文件中。

  • 创建以太传感器/ECU设备
  • 配置传感器/ECU设备以太端口
  • 配置传感器/ECU设备的网卡
  • 配置以太传感器/ECU网卡业务数据流
父主题： 基于物理连接配置以太网


创建以太传感器/ECU设备

根据网络规划，可创建传感器或其他ECU设备，例如激光雷达、智能座舱、组合定位等。

前提条件

已创建网络资源配置工程。

操作步骤

  1. 在“MMC Explorer”视图中单击工程目录下的“model.nrmconfig”，打开“VehicleNetwork”界面。

    如果不是第一次打开工程界面，则需要右键单击“model.nrmconfig”，选择“Open Diagram”。

  2. 在“Sensor Tool”中选择目标设备图标，以Lidar为例，选择 [image] 拖拽至“VehicleNetwork”界面中。

  3. 选中已创建的设备，在Properties页签中配置设备属性。

    1. Name：设备名称，修改后画布中设备名称自动同步。
    2. Vendor：传感器设备所属厂家信息，下拉菜单列表中有计算平台适配的所有厂家型号，可根据传感器实际类型进行选择。
    3. Location：传感器安装方位，下拉菜单列表中有可选的方位参数值。

      参数值

      fc

      fr

      fl

      rc

      rr

      rl

      tp

      位置

      前向

      右前

      左前

      后向

      右后

      左后

      车顶
    4. Diagnostics IP：诊断IP地址，仅激光雷达传感器需要配置，需从激光雷达已经配置的IP地址列表中选择。

      仅支持在ECU端口的单播IP中选择Diagnostic IP。

  4. 在右侧工具栏中，选择 [image] 并将其拖拽至已创建的传感器或者ECU设备上，创建外部端口。
  5. 在弹出的对话框中，完成如下配置。

    表1 ECU端口基本信息的参数说明

    参数

    说明

    Name

    端口的名称。

    取值长度不超过32个字符。

    EthName

    端口内物理网卡的名称。

    取值长度不超过32个字符。

父主题： 配置以太网传感器\ECU设备


配置传感器/ECU设备以太端口

Lidar传感器和其他ECU设备上的以太端口的配置方法相同，本文以Lidar传感器为例，介绍配置ECU端口的操作步骤。

前提条件

已创建设备。具体操作，请参见创建以太传感器/ECU设备。

操作步骤

  1. 在“VehicleNetwork”画布中，选中已创建的ECU端口。

  2. 在“Properties”视图中，参考下表，配置以下信息。

    表1 以太端口参数说明

    参数

    说明

    Name

    端口名称。

    取值长度不超过32个字符。

    Enable

    使能开关。

    • disable：禁止端口
    • enable：使能端口

    TsyncDomainId

    时间同步功能。

    • 0：同步数据面时间
    • 1：同步管理面时间
    • 其他：关闭时间同步功能

    TsyncMode

    时钟同步模式。

    Speed

    端口速率。

    单位：Mbit/s

    MasterSlave

    端口主从模式。

    • master：主模式
    • slave：从模式

    VlanList

    端口VLAN ID列表。操作步骤可参见3。

  3. 配置端口的VLANList信息，主要包括新增、修改和删除：

    • 新增：单击“add”后，在弹窗中定义“VlanId”。
    • 修改：选中VLAN ID后，单击“modify”，在弹窗中修改“VlanId”。
    • 删除：选中VLAN ID后，单击“delete”。

    在列表内添加、修改或删除VLAN后，将为端口所含的物理网卡自动创建、修改或删除对应VLAN ID的虚拟网卡。

父主题： 配置以太网传感器\ECU设备


配置传感器/ECU设备的网卡

MMC工具支持在界面上配置以太传感器/ECU设备的物理网卡和VLAN网卡。

前提条件

已经创建设备并完成设备属性和端口的配置。

操作步骤

  1. 在“VehicleNetwork”画布中单击以太端口端口，右键菜单选择“Enter > ElectronicControlUnitEthernetPort”。

  2. （可选）在弹窗中，定义当前端口的网卡配置窗口的名称，再单击“OK”。

    为了便于识别配置窗口，可将传感器/ECU设备端口内网卡配置界面做可明显识别的命名。仅在第一次打开端口配置界面时才会弹出界面命名设置界面。

  3. 进入网卡配置界面，选中物理网卡，然后在“Properties”视图中，根据业务需要配置物理网卡信息。

    参数

    说明

    Eth Name

    物理网卡名称。

    取值长度不超过32个字符。

    Mac

    ECU端口的MAC地址。

    仅支持单播MAC地址，不设置该参数，则使用全球唯一MAC地址。

    TsyncDomainId

    时间同步功能。

    • 0：同步数据面时间
    • 1：同步管理面时间
    • 其他：关闭时间同步功能

    TsyncMode

    时钟同步模式。端口的时钟模式需要与连接对端端口匹配。

    取值范围：

    • master：主模式，表示本端口是端口连接链路的时间源。
    • slave：从模式，表示本端口时钟同步于连接链路对端端口时钟。

    IP List

    物理网卡的IP列表。

    • 新增：单击“add”后，在弹窗中输入“IP”和“Mask”。
    • 修改：选中指定的IP表项，单击“modify”，在弹窗中修改对应的参数值。
    • 删除：选中指定的IP表项，单击“delete”。

  4. （可选）创建VLAN网卡。

    1. 将右侧工具栏的 [image] 拖拽至网卡，设置VLAN ID。

    2. 单击VLAN网卡，可在Properties窗口中修改VLAN ID和配置单播IP地址。其余参数均只读。

父主题： 配置以太网传感器\ECU设备


配置以太传感器/ECU网卡业务数据流

MMC工具支持对以太传感器/ECU设备的物理网卡和VLAN网卡配置业务数据流，包括协议类型、限速开关，速率以及源端口和目的端口IP与端口号。

前提条件

已进入传感器/ECU设备网卡配置界面。

操作步骤

  1. 进入设备的物理网卡或者VLAN网卡的业务配置界面。

    单击……

    右键菜单选择……

    物理网卡

    “Enter>ElectronicControlUnitEthernetPort”

    VLAN网卡

    “Enter>VirtualNetworkInterfacedCard”

  2. （可选）进入业务数据流配置界面，单击第一行，在“Properties”视图中，可配置网卡属性。

    下图以SoC物理网卡界面为例。

    该界面配置网卡属性方法和参数解释与“MdcEthernet”画布中配置方法相同，且数据同步更新。

  3. 右键单击界面任一空白处，选择“ServiceEntry”即可新增业务数据。

  4. 选择新增业务，在“Properties”视图中配置业务信息。

    参数

    说明

    Description

    配置项描述。

    Protocol

    协议类型。

    目前仅支持ARP、TCP、UDP、ICMP以及IGMP。

    Priority

    优先级。

    LimitEnable

    限速开关。（存疑：物理网卡的线束）

    • disable：关闭。
    • enable：开启。

    Rate

    限制速率。

    取值范围：(0,1048575]，单位：KB/s。

    当开启LimitEnable时，必须配置，且不能为0。

    SourceIpS

    源IP。

    SourcePorts

    源端口号。

    DestIPs

    目的IP地址。

    DestPorts

    目的端口号。

父主题： 配置以太网传感器\ECU设备


配置以太网网关设备

车载以太网网关用于连接计算平台和其他以太网车载设备并进行业务数据的交换，也用于连接外网。

  • 创建网关
  • 查看网关的交换端口
父主题： 基于物理连接配置以太网


创建网关

“VehicleNetwork”中仅支持创建1个网关，其表示1个或多个网关的集合。

前提条件

已创建网络资源配置工程。

操作步骤

  1. 在“MMC Explorer”视图中单击工程目录下的“model.nrmconfig”，打开“VehicleNetwork”界面。

    如果不是第一次打开工程界面，则需要右键单击“model.nrmconfig”，选择“Open Diagram”。

  2. 在打开的“VehicleNetwork”画布的右侧工具栏中，将 [image] 拖拽至画布空白处。
  3. 在弹出的对话框中，为网关定义名称，例如Gateway。
  4. 将“Node Tool”工具栏中的“Switch Port”图标拖拽至网关上，即可创建交换端口，例如SP1和SP2。

  5. （可选）对于具备实际业务处理能力的网关，可参照传感器的方式创建CAN端口或者Ethernet端口。

    CAN端口和Ethernet端口的配置、网卡配置均和传感器的方式一致。

父主题： 配置以太网网关设备


查看网关的交换端口

创建网关后，可根据业务需要，为其创建交换端口或ECU端口。完成物理网络连线后，交换端口的属性实现同步，可查看交换端口的属性，为后续的网络开发提供准备。

前提条件

已创建网关。

操作步骤

  1. 在“VehicleNetwork”画布中，选中已创建的交换端口。

  2. 在“Properties”视图中，查看交换端口的信息。

    表1 交换端口配置的参数说明

    参数

    说明

    Name

    交换端口名称。

    取值长度不超过32个字符。

    Enable

    使能开关。

    • disable：关闭
    • enable：启用

    固定设置disable，不可配置。

    TsyncDomainId

    时间同步功能。只读，不可配置。

    TsyncMode

    时钟同步模式。只读，不可配置。

    Speed

    端口速率，单位：Mbit/s。

    只读，不可配置。

    VlanList

    VLAN列表。配置方法可参见3。

  3. （可选）配置端口的VLANList信息，主要包括新增、修改和删除：

    • 新增：单击“add”后，在弹窗中定义“VlanId”。
    • 修改：选中VLAN ID后，单击“modify”，在弹窗中修改“VlanId”。
    • 删除：选中VLAN ID后，单击“delete”。

父主题： 配置以太网网关设备


建立以太网物理连接

在整车网络配置界面中可通过创建以太网物理连接将所有以太网设备连接起来。

前提条件

已创建网络资源配置工程。

背景信息

建立以太网物理链路后，连接的两端端口的部分属性将实现同步。

  • 同步的属性包括：“Enable”、“TsyncDomainId”、“MasterSlave”、“TsyncMode”和“Speed”、“VlanList”。

    如果计算平台面板端口的“Speed”属性不可配，则对应的属性不支持同步。

  • 进行连接时，需注意：
    • 连接ECU端口与计算平台面板端口时，同步的属性以先选择的端口属性为准。
    • 连接交换端口与其他端口时，同步的属性以非交换端口属性为准。
  • 完成连接后，在一端修改支持同步的属性，另一端同步更新对应属性。

操作步骤

  1. 在“VehicleNetwork”画布中，选中工具栏中的 [image] ，依次单击已创建的ECU设备以太端口和网关端口，例如ecu_ethernet和SP2，建立ECU设备与交换机的物理连接。
  2. 连接交换端口和计算平台面板端口，例如B4和SP2，完成网络的物理连接。
  3. 连接Lidar与计算平台面板端口。

父主题： 基于物理连接配置以太网


基于VLAN配置以太网

基于VLAN查看和配置以太网VLAN网卡和业务可以更直观查看业务数据流的路径和属性。

  • 创建VLAN网络
  • 配置VLAN网卡
  • 配置业务数据流
父主题： 配置以太网络


创建VLAN网络

可在VLAN配置界面中新建VLAN子网。

背景信息

默认的MDC计算平台以太网模型中已经配置VLAN子网，可以依据实际环境进行调整。

操作步骤

  1. 在“VehicleNetwork”任一空白处，单击右键，选择“Enter > Vlan”进入VLAN配置界面。
  2. 单击上方工具栏的“Arrange All”图标，以整理界面中已存在的VLAN网络图形组件。

  3. 在界面中可查看当前所有的VLAN子网以及每个子网覆盖的各个以太网设备的网卡。

    单击任一个VLAN网卡，在Properties窗口中可查看该网卡属性，包括其所属设备、物理网卡以及VLAN子网卡名字以及队列优先级等高级属性。

    在此界面中可以修改每个VLAN网卡的属性参数，其效果和基于端口配置是一样的。

  4. 在右侧工具栏中，选择 [image] 并将其拖拽至界面空白处，创建VLAN网络。
  5. 在弹窗中，为VLAN网络定义名称和VLAN ID。

    需要确保VlanId的值全网唯一。

    创建完成后，画布展示该虚拟网络图形，示例如下。

  6. （可选）如需修改网络的名称，可选中网络后，在“Properties”窗口中修改。

父主题： 基于VLAN配置以太网


配置VLAN网卡

创建VLAN网络后，可为其添加虚拟网卡，并完成对应的配置。

前提条件

  • 已经完成以太网设备、端口和物理网卡的配置。
  • 已经完成VLAN子网创建。

操作步骤

  1. 在“Vlan”画布右侧工具栏中，选择 [image] 并将其拖拽至指定VLAN网络，为该网络添加网卡。
  2. 在弹窗中，完成以下配置。

    参数

    说明

    ECU

    VLAN网卡所在的设备。

    EthernetPort

    VLAN网卡所属的外部端口。

    Nic

    VLAN网卡所属的物理网卡。

  3. 单击OK，完成创建。

    创建完成后，虚拟网络内将出现该虚拟网卡，同时与此VLAN网卡所在物理端口相连的对端端口同步创建相同VLAN的子网卡。同步机制说明，请参见整车以太网端口属性同步机制。

  4. 在虚拟网络中，选中虚拟网卡，然后在“Properties”视图中完成以下配置。

    各种虚拟网卡的配置方法相同，下文以计算平台物理网卡上的非预置虚拟网卡为例，介绍配置的方法。

    • 所有类型的虚拟网卡均不支持修改“Name”和“Location”。
    • 若修改了“Vlan ID”，当前虚拟网络下的虚拟网卡将消失，画布将在对应VLAN ID的虚拟网络内生成虚拟网卡。
    • 不同类型的虚拟网卡可配的属性不同，具体以配置窗口为准。
    • MDC虚拟网卡参数说明，请对应设备的《产品文档》中《SoC软件接口说明书》的“网络管理”章节。。

父主题： 基于VLAN配置以太网


配置业务数据流

在VLAN配置界面中可配置基于全局的以太网业务数据流。

添加的业务数据流是基于全局以太网络，不仅限于当前端口。

前提条件

已经完成VLAN网络创建和VLAN网卡的创建。

操作步骤

  1. 在“Vlan”画布中，右键单击已添加的虚拟网卡，选择“Enter > VirtualNetworkInterfaceCard”，进入VLAN网卡业务流的配置界面。

  2. 在“VirtualNetworkInterfaceCardImpl”界面中，选中第一行后，在“Properties”视图中可配置虚拟网卡。

    同一张虚拟网卡的属性在不同的画布的“Properties”视图中修改后，会保持同步。

  3. 右键单击界面任一空白处，选择“ServiceEntry”即可新增业务数据。

  4. 选择新增业务，在“Properties”视图中配置业务信息。

    参数

    说明

    Description

    配置项描述。

    Protocol

    协议类型。

    目前仅支持ARP、TCP、UDP、ICMP以及IGMP。

    Priority

    优先级。

    LimitEnable

    限速开关。

    • disable：关闭。
    • enable：开启。

    Rate

    限制速率。

    取值范围：(0,1048575]，单位：KB/s。

    当开启LimitEnable时，必须配置，且不能为0。

    SourceIpS

    源IP。

    SourcePorts

    源端口号。

    DestIPs

    目的IP地址。

    DestPorts

    目的端口号。

父主题： 基于VLAN配置以太网


配置全局属性

MMC工具支配置整车以太网通用全局属性。

前提条件

  • 已完成传感器、网关或计算平台端口的ARL配置单播IP。具体操作，请参见配置传感器/ECU设备以太端口、查看网关的交换端口和配置计算平台的面板端口。
  • 已为网卡配置单播IP和ACL。具体操作，请参见配置SoC物理网卡和配置计算平台的VLAN网卡。

操作步骤

整车网络“VehicleNetwork”界面和VLAN界面均支持配置全局以太网属性，以下任务以整车网络“VehicleNetwork”界面配置为例。

  1. 在“MMC Explorer”视图中单击工程目录下的“model.nrmconfig”，打开“VehicleNetwork”界面。

    如果不是第一次打开工程界面，则需要右键单击“model.nrmconfig”，选择“Open Diagram”。

  2. 在“VehicleNetwork”画布中，单击空白处，在“Properties”视图中，配置以下整车以太网的SoC网络内核参数。

    SoC网络内核参数的相关说明，请参见开源社区。

父主题： 配置以太网络


配置LVDS网络

LVDS网络配置内容主要包括Camera设备和LVDS端口以及MDC计算平台设备的LVDS端口属性参数。

  • 配置计算平台设备LVDS端口
  • 配置H.265编码策略
  • 创建摄像头设备
  • 配置摄像头设备
  • 创建摄像头的LVDS端口
  • 建立LVDS物理连接
父主题： 配置网络通信


配置计算平台设备LVDS端口

不同硬件版本的计算平台设备LVDS端口配置项会有差异。

操作步骤

  1. 在“MMC Explorer”视图中单击工程目录下的“model.nrmconfig”，打开“VehicleNetwork”界面。

    如果不是第一次打开工程界面，则需要右键单击“model.nrmconfig”，选择“Open Diagram”。

  2. 单击选择计算平台设备的LVDS端口，即可在“Properties”视窗中配置端口属性。

    表1 参数说明表

    参数

    说明

    SlotId

    端口的槽位号，不可配置。

    GmslVersiona

    GMSL协议版本号。

    • GMSL1
    • GMSL2

    Ratea

    GMSL传输速率，单位：bit/s。

    • 3G
    • 6G

    VideoModeb

    GMSL视频输出方式。

    • video out：视频输出
    • video av：视频环出
    • video loop：视频硬件环出
    • a：不同硬件版本的计算平台设备各个LVDS端口支持的协议版本不同。端口的GMSL和Rate配置需要和与其连接的摄像头保持一致。
    • b：video av和video loop是由计算平台硬件决定，具体以实际发布版本为准。

父主题： 配置LVDS网络


配置H.265编码策略

配置各个摄像头模组属性之前，需要先配置各个LVDS通道所需的H.265编码策略。

前提条件

需了解整车EE架构中每个LVDS通道规划。

操作步骤

  1. 在“MMC Explorer”视图中单击工程目录下的“model.nrmconfig”，打开“VehicleNetwork”界面。

    如果不是第一次打开工程界面，则需要右键单击“model.nrmconfig”，选择“Open Diagram”。

  2. 单击“VehicleNetwork”任一空白处，在“Properties”视图的“Venc”页签中配置所有通道需要用到的H.265编码策略。

  3. 单击“add”，在弹窗中添加编码策略。

    表1 编码参数说明

    参数名

    说明

    Venc Enable

    H.265编码功能开关。

    • false：关闭
    • true：开启

    Bit Rate

    编码比特率（kbps）。

    取值范围：不超过614400，建议小于32000，默认10240。

    Fps

    编码输出帧率（fps）。

    取值范围：大于5，且小于等于当前通路配置的帧率。

    Res Width

    编码模块输出分辨率。

    取值范围：小于等于当前通路配置的分辨率。

    其中，width的取值为16的倍数，height的取值为8的倍数。

    Res Height

  4. 选择策略列表中的项目，单击modify或者delete，即可修改或者删除选中的项目。

父主题： 配置LVDS网络


创建摄像头设备

在整车EE架构组网图中可创建摄像头设备。

前提条件

已经创建网络配置工程。

操作步骤

  1. 在“MMC Explorer”视图中单击工程目录下的“model.nrmconfig”，打开“VehicleNetwork”界面。

    如果不是第一次打开工程界面，则需要右键单击“model.nrmconfig”，选择“Open Diagram”。

  2. 在“Sensor Tool”中选择Camera设备图标 [image] 拖拽至“VehicleNetwork”界面中。

  3. 在弹窗中设置设备名称，完成设备创建。
父主题： 配置LVDS网络


配置摄像头设备

完成设备创建后需要根据网络规划完成摄像头模组的各项参数配置。

前提条件

  • 已经完成设备创建。
  • 已经完成全局VENC配置。

操作步骤

  1. 单击选择需要配置的摄像头设备，即可在“Properties”视窗中的“Camera Sensor”页签内逐一配置参数。
  2. （可选）修改设备名称（“Name”）。
  3. 配置摄像头模组型号。

    在参数下拉框中选择设备的模组型号，下图仅作示例展示，具体支持的模组以实际发布版本为准。

  4. 配置摄像头的“FOV”（Field of View，摄像头的广角度数）值。

    在参数下拉框中选择模组FOV值。

    如果没有适配的值，可以选择“other”，并在下一行中自行输入具体的参数值。

  5. 配置帧率（“Fps”）。

    在参数下拉框中选择当前模组适配的帧率值。

  6. 配置Gmsl信息，分别在参数下拉框中选择Gmsl协议版本（“Gmsl Version”）和传输速率（“Gmsl Rate”）。

  7. 配置分辨率（“Res”）。

    在下拉框中选择模组适配的分辨率值（width×height）。

  8. 配置视频数据H.265编码功能“Venc”。

    从下拉框中选择该模组适配的编码模式。

    需确保已经配置全局Venc编码模式，若没有配置，单个模组的“Venc”参数会显示置灰不可配置。

  9. 配置畸变矫正功能。

    1. 选择是否采用内参模式畸变矫正功能（“Warp Input”）。
      • “true”：开启内参模式畸变矫正功能，需配置内置畸变矫正参数项。
      • “false”：关闭内参模式畸变矫正功能，可配置映射表畸变矫正。
    2. 配置内置畸变矫正参数（“Ldc Param”）。
      • 单击“add”和“modify”可在弹窗中设置或者修改内参畸变矫正参数。

        表1 参数说明表

        注释号

        说明

        ①

        光学中心坐标（X轴和Y轴）。

        ②

        基于焦距坐标进行的畸变调整量（横向和纵向）。

        ③

        非鱼眼畸变调整参数。

        ④

        畸变调整参数。

        ⑤

        畸变调整时的图片分辨率大小（宽度和高度）。

        ⑥

        摄像头类型：鱼眼和非鱼眼
      • 单击“delete”，即可删除已设置的内参畸变矫正参数。
    3. 配置映射表畸变矫正。
      • 单击“add”和“modify”可在弹窗中设置或者修改映射表畸变矫正参数。

        表2 参数说明表

        注释号

        说明

        ①

        映射表畸变矫正开关。

        • false：关闭
        • true：开启

        ②
        • 经映射表处理后的文件所在路径。
        • 仅当开启映射表畸变矫正开启时，才可以配置该文件路径。
      • 单击“delete”，即可删除已设置的内参畸变矫正参数。

  10. 开启或者关闭RAW数据发布（“Raw Pub”）。

    • false：关闭
    • true：开启

  11. 配置采集图像是否翻转。

    表3 翻转参数说明

    参数名

    说明

    flip

    画面垂直翻转。

    • false：不翻转，默认值。
    • true：翻转

    mirror

    水平翻转。

    • false：不翻转，默认值。
    • true：翻转

  12. 配置摄像头的位置（pqVersion），仅限针对同时具备侧视和前视能力的摄像头。

    在下拉框中选择位置，不配置时摄像头厂家默认的位置为准。

父主题： 配置LVDS网络


创建摄像头的LVDS端口

前提条件

  • 已进入整车网络配置界面。
  • 已创建摄像头设备。

操作步骤

  1. 在“Port Tool”中选择“LVDS Port”图标，拖拽至目标设备上。
  2. 在弹窗中设置端口的槽位号（“Slot Id”）。
  3. 单击“OK”。

  4. 单击LVDS端口，在Properties视图中配置端口参数。

    表1 LVDS端口参数

    参数

    说明

    SlotId

    创建端口在摄像头设备上的槽位号。

    GmslVersion

    GMSL协议版本号。

    不可配置，自动读取摄像头设备属性中配置值。

    Rate

    GMSL传输速率。

    不可配置，自动读取摄像头设备属性中配置值。

    VideoMode

    端口视频输出模式。

    • video out：视频输出。
    • video av：视频环出，由硬件决定，不可配置。
    • video loop：硬件环出，由硬件决定，不可配置。

父主题： 配置LVDS网络


建立LVDS物理连接

连接摄像头设备和计算平台设备可在整车EE架构图上查看设备关联情况。

前提条件

已创建摄像头设备和LVDS端口。

注意事项

当MDC计算平台设备与摄像头设备的LVDS端口相连时，计算平台设备端口的“GMSLVersion”和“Rate”需要与摄像头设备保持一致，否则会弹窗提醒且连线失败。

操作步骤

  1. 进入“VehicleEthernet”画布。
  2. 单击“Physical Connection”中的“LVDS Relation”。
  3. 选择需要连接的设备端口。

父主题： 配置LVDS网络


配置CAN网络

MMC工具提供支持计算平台的CAN通信参数配置、校验以及生成配置文件，也支持整车CAN网络拓扑的视图配置。

  • 创建CAN设备
  • 创建CAN设备端口
  • 配置计算平台设备CAN通信参数
  • 连接CAN设备
  • 连接CAN总线
父主题： 配置网络通信


创建CAN设备

在网络资源管理的工程里可配置计算平台与整车架构中的CAN通信传感器或其他ECU设备之间的物理拓扑视图。

注意事项

整车架构拓扑视图仅用于展示计算平台与ECU设备之间的连接关系，暂不支持对传感器或者其他ECU设备的下发配置。

操作步骤

  1. 在“MMC Explorer”视图中单击工程目录下的“model.nrmconfig”，打开“VehicleNetwork”界面。

    如果不是第一次打开工程界面，则需要右键单击“model.nrmconfig”，选择“Open Diagram”。

  2. 在“Sensor Tool”中选择目标设备图标，以Radar为例，拖拽至“VehicleEthernet”画布中。
  3. 在弹出的设置框设置创建设备名字。

  4. 选中传感器设备，在Properties页签中配置设备属性。

    1. 在Name中可修改设备名称，修改后画布中设备名称自动同步。
    2. 在Vendor一栏设置传感器设备所属厂家信息。
    3. 在Location中设置传感器安装方位。

      参数选项

      fc

      fr

      fl

      rc

      rr

      rl

      tp

      位置

      前向

      右前

      左前

      后向

      右后

      左后

      车顶

父主题： 配置CAN网络


创建CAN设备端口

前提条件

已经创建CAN口设备。

操作步骤

  1. 在“Port Tool”中选择“CAN Port”图标，拖拽至目标设备上。
  2. 在弹出的设置框中设置端口的名字。
  3. 单击OK。

  4. 选择创建的CAN口，在Properties视图界面中配置CAN端口属性。

    传感器CAN设备的CAN端口属性仅支持配置CAN端口名称和CAN总线ID（CanIdList）。

父主题： 配置CAN网络


配置计算平台设备CAN通信参数

MMC工具提供计算平台设备侧的CAN通信参数界面化配置功能，并可生成配置文件。

  • CAN通路介绍
  • 配置CAN端口
  • 配置SoC侧CAN设备类属性
  • 配置MCU侧CAN设备类属性
父主题： 配置CAN网络


CAN通路介绍

计算平台设备对外提供12路CAN端口，3路连接设备内MCU模块，5路连接设备内SoC模块，4路双接MCU和SoC两个模块。

图1 CAN端口

配置计算平台设备的CAN通信参数主要包括外部CAN口、SoC侧和MCU侧的CAN设备类参数。

父主题： 配置计算平台设备CAN通信参数


配置CAN端口

面板CAN端口信息主要包括端口ID、CAN模式、错误上报以及比特时序参数。

操作步骤

  1. 在“MMC Explorer”视图中单击工程目录下的“model.nrmconfig”，打开“VehicleNetwork”界面。

    如果不是第一次打开工程界面，则需要右键单击“model.nrmconfig”，选择“Open Diagram”。

  2. 在VehicleNetwork界面中打开配置计算平台的CAN网络配置界面。

  3. 在CanAndUart界面中选择需要配置的CAN面板端口。

  4. 在Properties视窗中配置端口对应的CAN模式与总线错误上报开关。

  5. 配置仲裁段比特时序参数。

    1. 删除已有配置。

      单击“clear”即可清空原有的比特时序参数。

    2. 新增比特时序参数，根据需求选择简单或者复杂的配置方式，分别参见图1和图2。
      图1 Simple配置方式
      图2 Complicated方式
    3. 修改当前的配置。

      单击“modify”，在弹出的设置框中修改可配置参数。

  6. 配置数据段比特时序参数DBitTiming，该参数仅对CanFD模式有效。

    配置操作方式与仲裁段比特时序参数相同。

父主题： 配置计算平台设备CAN通信参数


配置SoC侧CAN设备类属性

SoC侧包含9路CAN设备，每路CAN设备属性主要包含设备名、全局CAN设备ID和CAN报文过滤规则。

前提条件

已经进入CanAndUart界面。

操作步骤

  1. 在SoC侧选择需要配置的CAN设备。
  2. 在Properties窗口中配置CAN设备名称。

    名称的最大长度不超过10个字符。

  3. 在Properties窗口中配置CAN标识列表。

    1. 单击右侧add，弹窗中增加CAN总线ID。

      CAN总线ID需全局唯一，鼠标放置于 [image] ，可查看取值范围。

    2. 单击右侧modify和delete可修改和删除CAN ID信息。

  4. 在Properties窗口中配置报文过滤规则列表。

    1. 单击右侧add，弹窗中设置CAN总线ID和CAN掩码。

    2. 选中需要修改或者删除的过滤列表，单击右侧modify或者delete即可进行配置。

父主题： 配置计算平台设备CAN通信参数


配置MCU侧CAN设备类属性

MCU侧提供多个CAN设备，其属性主要包括设备名称、上行过滤配置表、下行过滤配置表和下行维稳功能开关。

前提条件

已经进入CanAndUart界面。

操作步骤

  1. 在MCU侧选中需要配置的CAN设备。
  2. 在Properties窗口中配置设备名称。

    名称的最大长度不超过10个字符。

  3. 配置上行通道参数。

    1. 新增过滤表

      1. 鼠标放置于 [image] ，可查看每项参数的释义和取值范围。
      2. CanType的类型决定了Canid和Datalength的取值范围。
    2. 选择需要修改或者删除的条目，单击右侧的modify或者delete，可修改配置。

  4. 配置下行维稳功能开关。

  5. 在“TxIdParamList”视窗内配置下行通道。

    1. 单击右侧的add，增加下行通道配置表项。
      • 每一项参数的具体解释与取值可以通过 [image] 查看释义和取值参考。
      • CanType的类型决定了Canid和Datalength的取值范围。
      • 发送初始报文（InitValue）为可选设置选项。
    2. 选择某一条配置表项，单击右侧的modify或者delete可进行修改或者删除。

      删除时，至少保留一项列表，否则无法删除。

父主题： 配置计算平台设备CAN通信参数


连接CAN设备

连接CAN设备和计算平台设备可在整车EE架构图上查看设备关联情况。

前提条件

已创建CAN传感器设备和端口。

操作步骤

  1. 进入“VehicleEthernet”画布。
  2. 单击“Physical Connection”中的“CAN Relation”。
  3. 选择需要连接的设备端口。

父主题： 配置CAN网络


连接CAN总线

当多个CAN设备需要连接到同一个CAN通道时，需要创建并连接CAN总线。

前提条件

已经完成CAN传感器或者其他CAN ECU设备的配置。

操作步骤

  1. 在“VehicleEthernet”界面中单击右侧工具栏“Bus Tool”中的“CAN Bus”，并拖拽至界面空白处。
  2. 在弹窗“Create CAN Bus”中设置CAN总线号。

  3. 单击右侧“Physical Connection”中的“CAN Relation”。
  4. 先单击“CANBus”，再单击待连接的CAN设备的CAN端口，即可连接CAN设备与CANBus。

父主题： 配置CAN网络


配置UART网络

  • 创建UART设备
  • 创建传感器UART端口
  • 配置计算平台UART端口
  • 连接UART设备
父主题： 配置网络通信


创建UART设备

MMC工具支持在视图中创建UART设备，并与计算平台设备的UART端口连接。

操作步骤

  1. 在“MMC Explorer”视图中单击工程目录下的“model.nrmconfig”，打开“VehicleNetwork”界面。

    如果不是第一次打开工程界面，则需要右键单击“model.nrmconfig”，选择“Open Diagram”。

  2. 在“Sensor Tool”中选择目标设备图标，拖拽至“VehicleEthernet”画布中，设置设备名称。

  3. 选中已创建的UART设备，可修改名称，并配置设备厂家型号。

父主题： 配置UART网络


创建传感器UART端口

传感器UART端口参数主要包括端口名称、端口速率、数据位宽与校验位等。

操作步骤

  1. 在“Port Tool”中选择“UART Port”图标，拖拽至目标设备上。
  2. 在弹出的设置框中设置端口名称，完成端口创建。

  3. 选择端口，在Properties视图界面中配置Uart端口属性。

父主题： 配置UART网络


配置计算平台UART端口

MDC 610提供2路UART端口，名称固定为GPS_232和Lidar_12V，可配置其端口速率、数据位宽与校验位等信息。

操作步骤

  1. 在“MMC Explorer”视图中单击工程目录下的“model.nrmconfig”，打开“VehicleNetwork”界面。

    如果不是第一次打开工程界面，则需要右键单击“model.nrmconfig”，选择“Open Diagram”。

  2. 在VehicleNetwork界面中打开配置计算平台的CanAndUart网络配置界面。

  3. 在CanAndUart界面中选择GPS_232端口。

  4. 在Properties视窗中可根据参数项的帮助信息配置各项端口属性。

父主题： 配置UART网络


连接UART设备

连接UART设备和计算平台设备可在整车EE架构图上查看设备关联情况。

前提条件

已创建传感器设备上的UART端口。

操作步骤

  1. 进入“VehicleEthernet”画布。
  2. 单击“Physical Connection”中的“UART Relation”。
  3. 分别单击计算平台设备上的GPS_232端口和传感器的UART端口，完成连接。

父主题： 配置UART网络


校验网络配置工程

网络资源配置过程中或完成后，需按网络类别进行校验。

前提条件

已完成NRM工程的部分或者全部的配置。

背景信息

根据校验的内容，MMC工具为网络配置提供参数输入校验和模型校验。

  • 参数输入校验：当配置某个参数时，MMC工具会对输入值进行实时校验，如果不符合规则，输入框前方会出现 [image] 图标，提醒及时修改。
  • 模型校验：MMC工具提供对网络模型进行整体校验，可在Validation视窗中查看具体的错误信息。

    模型校验有两种方式：实时校验和手动校验，错误信息均可在Validation视窗中查看。

参数输入校验是工具自带，无需进行操作。本操作指导主要介绍模型校验的操作方法。

操作步骤

  1. 单击工具栏 [image] 按钮可启动实时校验功能。

    • 开启或关闭实时校验功能，将作用于MMC工具内已存在的所有工程。
    • 如果模型配置项比较复杂，导致模型文件偏大，开启实时校验功能可能会影响MMC工具运行性能，单击 [image] 按钮即可关闭该功能。
    • 当开启实时校验后，配置工程过程中，模型中导致错误的元素位置会出现 [image] 图标。

  2. 完成配置后，可手动启动模型校验功能。

    在MdcEthernet网络或CanandUart网络配置界面的空白处，在右键菜单中选择“Validate Diagram”，即可启动模型校验。

  3. 根据“Validation”视图中的报错信息和模型中带 [image] 报错标志的元素，修正错误。

    • 在“Validation”视图查看校验结果时，若手误关闭该视图，可选择“Window > Show View > Other > Validation”重新打开。
    • “Validation”视图相关操作说明，请参考Validation视图使用。

  4. 完成修正后，重新再进行校验，直至无报错。
父主题： 配置网络通信


生成网络配置文件

完成网络配置后需导出配置文件，便于将配置文件上传至计算平台系统，使网络配置生效。

前提条件

  • 已完成整车网络的配置。
  • 已校验网络配置。

操作步骤

  1. 在“MMC Explorer”视图中，右键单击工程下的“model.nrmconfig”。
  2. 在右键菜单中，选择“Generate Configs Files”。

  3. 等待工具生成配置文件，直至弹出如下窗口，单击“OK”。

    导出完成后，在工程下自动生成“SystemConfiguration”文件夹。

  4. 展开文件结构，查看生成的配置文件。

    导出的配置文件需上传至MDC系统相应的位置，以实现对应的网络配置。

    • 导出文件和MMC支持的网络配置功能相关，图中列表仅以当前版本为例，具体以实际交付功能为准。
    • 每种网络配置文件的功能和上传计算平台系统的具体位置，请参考《SoC软件接口说明书》和《MCU软件接口说明书》相应的介绍。
    • 如果手动修改过计算平台系统上的网络配置文件，建议在MMC工具网络配置工程中做同步修改，确保MMC导出的配置文件涵盖原有的手动修改内容。

父主题： 配置网络通信


网络配置工程常见报错

在配置NRM工程时，配置项不符合业务或规范时，将出现英文提示信息，本文介绍常见的英文报错、产生报错的可能原因，以及对应的解决方法。

报错信息

The subNetwork is associated with a unified panelPort, and other subNetwork under the same physical NIC are not synchronized with the MAC address of the sub-NIC.

可能原因

在该虚拟网卡关联的面板端口上，同时关联了另一张或多张虚拟网卡，且这些虚拟网卡属于同一张物理网卡，而这些虚拟网卡的MAC地址不同步。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 修改虚拟网卡的MAC地址，使这些虚拟网卡的MAC地址保持同步，或将这些虚拟网卡关联在不同的面板端口上。

报错信息

The MAC address of the physical NIC conflicts with that of another MAC address.

可能原因

该物理网卡的MAC地址，与虚拟网卡（不含该物理网卡上的虚拟网卡）的MAC地址冲突。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 修改物理网卡的MAC地址，使其不同于虚拟网卡（不含该物理网卡上的虚拟网卡）的MAC地址。

报错信息

The MAC address of the subnetwork adapter conflicts with that of another MAC address.

可能原因

该虚拟网卡的MAC地址，与其他物理网卡上的虚拟网卡或其他物理网卡的MAC地址冲突。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 修改虚拟网卡的MAC地址，使其不同于其他物理网卡或其他物理网卡的虚拟网卡的MAC地址。
父主题： 配置网络通信


快速修复校验错误

MMC工具对于部分配置错误可提供一键式快速修复功能（Quick Fix）。

前提条件

已经完成网络配置的Validate校验。

背景信息

当前版本仅针对如下配置错误：

一个面板以太网物理端口同时连接一个物理网卡上的多个VLAN网卡时，连接VLAN网卡的MAC地址不一致。

操作步骤

  1. 从“Window”菜单栏进入“Problem”界面。

  2. 在“Problem”界面中选中需要修复的配置错误项进入“Quick Fix”界面。

  3. 选择需要修复的错误和修复方案，单击“Finish”。

  4. 在弹窗中选择需要保留的MAC地址。

    修复后，Validation和Problem中的错误信息会即时清除。

父主题： 配置网络通信


配置ADSFI工程

MMC工具为基于MBD的ADSFI框架提供了可视化操作功能，协助用户快速构建智能驾驶应用服务。用户可创建ADSFI工程，完成应用服务的配置。本文仅介绍在MBD式ADSFI工程开发过程中，MMC工具可提供的功能及其对应的操作流程。详细的操作步骤，请参见《智能驾驶应用算法开发指南》的“智能驾驶应用算法开发流程”章节。

背景信息

ADSFI工程具备以下特点：

  • 提供用于开发智能驾驶服务的数据结构与元模型。
  • 以可视化的操作界面，通过拖拽的方式构建应用拓扑关系。

下文从以下三个方面，介绍MMC工具的ADSFI工程的三大功能。

创建工程

  1. 设置SCFI环境变量：使用工具开发前，需先设置环境变量。
  2. 启动MMC工具。
  3. 创建工程：根据业务需要，可直接创建工程，也可导入已创建的工程。
    • 创建ADSFI工程。
    • 导入工程。

搭建节点通讯框架

  1. 创建虚拟传感器：在画布中，创建虚拟传感器，并为其定义简称。
  2. 创建应用节点：通过ADSFI内置模型，创建应用节点。
  3. 自定义通讯数据：根据业务需要，可以通过操作发送端口（PPort）和对应的Interface，自定义通讯数据。
  4. 部署节点：将创建的检测模型拖入对应的Machine中，完成节点部署。
  5. 验证模型：工程配置完成后，通过验证模型功能，确保配置的准确性。
  6. 导出配置：将导出的配置，用于在MDS工具中进行后续开发。

工程升级

当SDK版本变化或路径变化时，可通过工程升级功能，实现对ADSFI工程的“mdc_sdk_llvm/manifest”路径的更新。具体操作，请参见《智能驾驶应用算法开发指南》中的升级MMC创建的ADSFI工程。

父主题： MDC Manifest Configurator 使用指南


配置诊断文件

MMC工具提供诊断功能，用以配置诊断服务所需的DID、DTC、EVENT或ROUTINE参数，并生成诊断配置文件。

  • 配置流程
  • 导入SDK配置文件
  • 配置DID
  • 配置DTC
  • 配置EVENT
  • 配置ROUTINE
  • 校验
父主题： MDC Manifest Configurator 使用指南


配置流程

图1 诊断文件配置流程
表1 诊断文件配置流程说明
序号 | 任务 | 描述
1 | 创建工程 | 创建用于配置诊断文件的工程。
2 | 导入SDK配置文件 | 导入平台基础配置文件。
3 | 配置DID/配置DTC/配置EVENT/ 配置ROUTINE | 根据实际需求配置DID、DTC、EVENT或ROUTINE。
4 | 校验 | 校验元素是否漏配或配置错误。
5 | 导出配置文件 | 将配置文件导出，可用于导入MDS工具进行后续开发。
父主题： 配置诊断文件


导入SDK配置文件

  1. 在“MMC Explorer”视图中，右键单击目标工程，选择“Import...”。
  2. 在“Import”弹窗中选择“General > File System”。

  3. 单击“Next >”，在出现的新窗口中完成如下操作：

    1. 单击“Browse...”，选择“mdc_sdk_llvm/manifest”目录。
    2. 在文件选择框中勾选所有ARXML文件。
      ├── manifest
│   ├── common
│   │   ├── data_type
│   │   ├── mode_declaration
│   │   ├── service_interface
│   │   └── diagnostic_interface
│   │       └── diagnostic_interface.arxml DoIP接口配置
│   ├── develop
│   ├── machine
│   ├── deploy
        └── platform
               ├── diag_extract.arxml   诊断协议配置
               └── software_cluster.arxml 软件簇配置（诊断地址和DoIP关联）
    3. 单击“Finish”，完成导入。

父主题： 配置诊断文件


配置DID

  1. 在“MMC Explorer”视图中，右键单击目标工程，在快捷菜单中选择“Modular Configurator”。
  2. 在“Modular Configurator”界面中，单击“Diagnostic”模块的“Select”，进入诊断配置界面。

  3. 在“Select ARPackage”弹窗中选择需配置DID的ARPackage，单击“OK”。

    • 若无可选的ARPackage，可单击 [image] 新建。
    • 单击“DIAG Designer”界面左上方的 [image] ，可重新选择ARPackage。

  4. 在“DIAG Designer”界面左侧，选择“DID”选项，在“Diagnostic Configuration”界面，配置DID相关参数。

    1. 单击 [image] ，新增DID列表。
    2. 配置DID参数。

      表1 DID参数说明

      参数项

      约束

      说明

      Did

      必配

      DID值。

      • 两字节16进制数字，形式上需要带0x，如0x1234，需要前导零。
      • APP配置内不能有重复的DID值，APP配置中的DID值也不能和dm_server中的DID值重复。

      Did Size

      必配

      DID长度。

      • 单位：字节
      • 取值：(0,232)

      Readability

      必配

      是否可读。

      • TRUE：是
      • FALSE：否

      Read Permission

      选配

      选择访问权限。详细说明请参见工具适配的MDC计算平台设备对应产品文档中《基础特性开发指南》的“诊断二次开发指南 > 配置诊断ARXML文件”章节。

      • Readability为FALSE时，此参数无效，可不选。
      • Readability为TRUE时，此参数必选。

      Writability

      必配

      是否可写。

      • TRUE：是
      • FALSE：否

      Write Permission

      选配

      选择访问权限。详细说明请参见工具适配的MDC计算平台设备对应产品文档中《基础特性开发指南》的“诊断二次开发指南 > 配置诊断ARXML文件”章节。

      • Writability为FALSE时，此参数无效，可不选。
      • Writability为TRUE时，此参数必选。

      Controlability

      必配

      是否可控。

      • TRUE：可控，需配置可控项。
        • Freeze Current State：冻结当前DID的值，取值为TRUE或FALSE。
        • Short Term Adjustment：短期控制DID值，取值为TRUE或FALSE。
        • Reset To Default：设置默认值，取值为TRUE或FALSE。
      • FALSE：不可控

      Control Permission

      选配

      选择访问权限。详细说明请参见工具适配的MDC计算平台设备对应产品文档中《基础特性开发指南》的“诊断二次开发指南 > 配置诊断ARXML文件”章节。

      • Controlability为FALSE时，此参数无效，可不选。
      • Controlability为TRUE时，此参数必选。

      Application Type

      必配

      选择关联APP应用。

      该应用由用户自行创建，详细开发流程请参考“AP配置示例”。

      若无可关联的APP应用时，请先留空，待创建完APP应用后，重新关联。

      PPort Name

      必配

      DID的标识符，即InstanceSpecifier，后续编码阶段创建DID服务实例需下发给诊断。

      • 标识符仅包含字母、数字、下划线，且不能以数字开头。
      • 标识符长度取值范围：[2,127]。
      • InstanceSpecifier=/PPort Name
      • 一个instance_specifier可以对应多个DID。
      • instance_specifier在APP内可以重复。
      • APP配置的instance_specifier取值不能和server的instance_specifier取值重复。
    3. （可选）管理DID配置。
      • 复制：选中DID行，单击 [image] ，复制DID配置。
      • 删除：选中DID行，单击 [image] ，删除该DID配置。

父主题： 配置诊断文件


配置DTC

  1. 在“DIAG Designer”界面左侧，选择“DTC”选项。
  2. 在“Diagnostic Configuration”界面，配置DTC相关参数。

    1. 单击 [image] ，新增DTC列表。
    2. 配置DTC参数。

      表1 DTC参数说明

      参数项

      约束

      说明

      Dtc Number

      必配

      DTC值。

      • 三字节16进制数字，形式上需要带0x，如0x123456，需要前导零。
      • APP配置内不能有重复的DTC值，APP配置中的DTC值也不能和dm_server中的DTC值重复。

      Snapshot

      必配

      数组。

      单击 [image] ，选择配置DID中已创建的DID或导入的DID。

      冻结帧的DID个数限制255个。

      Dtc Group Number

      必配

      DTC组。

      单击 [image] ，在“Config DTC Group”窗口选择DTC组。

      • Config Group：选择或创建DTC组，组号为三字节16进制数字，形式上需要带0x，如0x123456，需要前导零。

        DTC组号既不能与APP配置内的DTC值重复，也不能和dm_server中的DTC值重复。

      • Empty Group：DTC组置空。
    3. （可选）管理DTC配置。
      • 复制：选中DTC行，单击 [image] ，复制DTC配置。
      • 删除：选中DTC行，单击 [image] ，删除该DTC配置。

父主题： 配置诊断文件


配置EVENT

  1. 在“DIAG Designer”界面左侧，选择“EVENT”选项。
  2. 在“Diagnostic Configuration”界面，配置EVENT相关参数。

    1. 单击 [image] ，新增Event列表。
    2. 配置Event参数。

      表1 Event参数说明

      参数项

      约束

      说明

      Event Name

      必配

      Event名称。

      • 字符仅包含字母、数字、下划线，且不能以数字开头。
      • 字符长度取值范围：[2,127]。
      • APP配置内不能有重复的event_name值，APP配置中的event_name值也不能和dm_server中的event_name值重复。

      DTC

      必配

      选择该Event对应已配置的用户自定义DTC值。

      Application Type

      必配

      选择关联故障上报应用。

      该应用由用户自行创建，详细开发流程请参考“AP配置示例”。

      若无可关联的APP应用时，请先留空，待创建完APP应用后，重新关联。

      RPort Name

      必配

      Event的标识符，即instance_specifier。后续编码阶段创建DTC服务实例需下发给诊断。

      • 标识符仅包含字母、数字、下划线，且不能以数字开头。
      • 标识符长度取值范围：[2,127]。
      • instance_specifier=/RPort Name
      • event配置的instance_specifier不能和APP重复，也不能和dm_server重复。
      • 一个instance_specifier只能对应一个event。
    3. 管理Event配置。
      • 复制：选中Event行，单击 [image] ，复制Event配置。
      • 删除：选中Event行，单击 [image] ，删除该Event配置。

父主题： 配置诊断文件


配置ROUTINE

  1. 在“DIAG Designer”界面左侧，选择“ROUTINE”选项。
  2. 在“Diagnostic Configuration”界面，配置ROUTINE相关参数。

    1. 单击 [image] ，新增ROUTINE列表。
    2. 配置ROUTINE参数。

      表1 ROUTINE参数说明

      参数项

      约束

      说明

      RID

      必配

      RID值。

      • 两字节16进制数字，形式上需要带0x，如0x1234，需要前导零。
      • APP配置内不能有重复的RID值，APP配置中的RID值也不能和dm_server中的RID值重复。配置重复时，配置生成工具会报错，需按照提示修改。

      Start Routine

      必配

      是否开始例程。

      自动配置为TRUE，不支持修改。

      Stop Routine

      必配

      是否停止例程。

      • TRUE：是
      • FALSE：否

      Request Result

      必配

      是否请求例程结果。

      • TRUE：是
      • FALSE：否

      Access Permission

      必配

      选择访问权限。

      详细说明请参见《产品文档》中《基础特性开发指南》的“诊断二次开发指南 > 配置诊断ARXML文件”章节。

      Application Type

      必配

      选择关联APP应用。

      该应用由用户自行创建，详细开发流程请参考“AP配置示例”。

      若无可关联的APP应用时，请先留空，待创建完APP应用后，重新关联。

      PPort Name

      必配

      Routine的标识符，即instance_specifier。后续编码阶段创建Routine服务实例需下发给诊断。

      • 标识符仅包含字母、数字、下划线，且不能以数字开头。
      • 标识符长度取值范围：[2,127]。
      • instance_specifier=/PPort Name
      • APP配置的instance_specifier取值不能和server的instance_specifier取值相同。
    3. （可选）管理ROUTINE配置。
      • 复制：选中ROUTINE行，单击 [image] ，复制ROUTINE配置。
      • 删除：选中ROUTINE行，单击 [image] ，删除该ROUTINE配置。

父主题： 配置诊断文件


校验

诊断项配置完成后，单击“DIAG Designer”界面左上方的 [image] ，校验元素是否漏配或配置错误，根据报错修改问题，直至校验无误。报错说明可参考“Constraints错误”章节。

父主题： 配置诊断文件


AP常见报错处理

  1. 个别Warning由相关联的Error引起，请先处理Error，再处理Warning。
  2. 在使用MMC配置的过程中进行Model校验；在ARXML文件配置完成后进行Schema校验。
  • Constraints错误
  • Schema告警
父主题： MDC Manifest Configurator 使用指南


Constraints错误

  • 自定义规约
  • 标准规约
父主题： AP常见报错处理


自定义规约

报错信息

[mdc_constr_1100] Referrable ('shortNameA')', the 'ShortName' value must start with a letter and contain a string of 1 to 128 letters, digits, or underscores(_).

可能原因

目标“Referrable.shortName”不满足条件：以字母开头，取值仅限字母、数字和下划线，且总的字符长度在[1,128]。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 修改“Referrable.shortName”属性值，保证其值以字母开头，只含字母、数字或下划线，且总字符长度在[1,128]。
  3. 保存修改。

报错信息

[mdc_constr_1101] For all StdCppImplementationDataType configuration items with same namespaces or without any namespaces, the value of the StdCppImplementationDataType.shortName attribute must be unique.

可能原因
  1. 存在多个设置了相同namespaces属性（即所有namespaces的shortName值及shortName的显示顺序完全相同）的“StdCppImplementationDataType”元素，并且这些元素的shortName值都相同。
  2. 存在多个未设置namespaces属性的“StdCppImplementationDataType”元素，且这些元素的shortName相同。
    说明：
    • namespaces值不区分大小写。
    • 除float和Float（封装）、double和Double（封装）外，“StdCppImplementationDataType”元素shortName不区分大小写。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 根据报错提示找到所有shortName值相同的“StdCppImplementationDataType”元素，并修改其shortName值，保证所有“StdCppImplementationDataType”元素的shortName值唯一，保存修改。

报错信息

[mdc_constr_1102] For all CustomCppImplementationDataType configuration items with same namespaces or without any namespaces, the value of the CustomCppImplementationDataType.shortName attribute must be unique.

可能原因
  1. 存在多个设置了相同namespaces属性（即所有namespaces的shortName值及shortName的显示顺序完全相同）的“CustomCppImplementationDataType”元素，并且这些元素的shortName值都相同。
  2. 存在多个未设置namespaces属性的“CustomCppImplementationDataType”元素，且这些元素的shortName值相同。
    说明：
    • namespaces值不区分大小写。
    • “CustomCppImplementationDataType”元素的shortName不区分大小写。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 根据错误提示找到所有shortName值相同的“CustomCppImplementationDataType”元素，并修改其shortName值，保证所有“CustomCppImplementationDataType”元素的shortName值唯一，保存修改。

报错信息

[mdc_constr_1103] For all ServiceInterface configuration items with same namespaces or without any namespaces, the value of the ServiceInterface.shortName attribute must be unique.

可能原因
  1. 存在多个设置了相同namespaces属性（即所有namespaces的shortName值及shortName的显示顺序完全相同）的“ServiceInterface”元素，并且这些元素的shortName值相同。
  2. 存在多个未设置namespaces属性的“ServiceInterface”元素，并且这些元素的shortName值都相同。
    说明：
    • namespaces值不区分大小写。
    • “ServiceInterface”元素的shortName不区分大小写。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 根据错误提示找到所有shortName值相同的“ServiceInterface”元素，并修改其shortName值，保证所有“ServiceInterface”元素的shortName值唯一，保存修改。

报错信息

[mdc_constr_1104] For all ApApplicationErrorDomain configuration items with same namespaces or without any namespaces, the value of the ApApplicationErrorDomain.shortName attribute must be unique.

可能原因
  1. 存在多个设置了相同namespaces属性（即所有namespaces的shortName值及shortName的显示顺序完全相同）的“ApApplicationErrorDomain”元素，并且这些元素的shortName值都相同。
  2. 存在多个未设置namespaces属性的“ApApplicationErrorDomain”元素，且这些元素的shortName相同。
    说明：
    • namespaces值不区分大小写。
    • “ApApplicationErrorDomain”元素的shortName不区分大小写。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 根据错误提示找到所有shortName值相同的“ApApplicationErrorDomain”元素，并修改其shortName值，保证所有“ApApplicationErrorDomain”元素的shortName值唯一，并保存修改。

报错信息

[mdc_constr_1105] For all DdsProvidedServiceInstance.serviceInterface attributes that reference the same ServiceInterfaceDeployment, the value of the DdsProvideServiceInstance serviceInstanceId attribute must be unique.

可能原因
  • 存在多个“DdsProvideServiceInstance”元素的serviceInterface属性引用同一个“DdsServiceInterfaceDeployment”元素。
  • 存在多个“DdsProvideServiceInstance”引用了serviceInterface和serviceInterfaceId属性值相同的不同“DdsServiceInterfaceDeployment”，且这几个“DdsProvideServiceInstance”元素的serviceInstanceId属性值相同。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 按照如下对应方案解决：
    • 修改报错“DdsProvideServiceInstance”的serviceInterface属性引用值，保证各“DdsProvideServiceInstance.serviceInterface”属性引用不同的“DdsServiceInterfaceDeployment”元素，并保存修改。
    • 根据错误提示找到所有serviceInstanceId属性值相同的“DdsProvidedServiceInstance”元素，并修改其serviceInstanceId值，保证所有“DdsProvidedServiceInstance”元素的serviceInstanceId属性值唯一，并保存修改。

报错信息

[mdc_constr_1106] For all ProvidedSomeipServiceInstance.serviceInterface attributes that reference the same ServiceInterfaceDeployment, the value of the ProvidedSomeipServiceInstance serviceInstanceId attribute must be unique.

可能原因
  • 存在多个“ProvidedSomeipServiceInstance”元素的serviceInterface属性引用同一个“SomeipServiceInterfaceDeployment”元素。
  • 存在多个“ProvidedSomeipServiceInstance”引用了serviceInterface和serviceInterfaceId属性值相同的不同“SomeipServiceInterfaceDeployment”类型，且这几个“ProvidedSomeipServiceInstance”元素的serviceInstanceId属性值相同。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 按照如下对应方案解决：
    • 修改报错“ProvidedSomeipServiceInstance”的serviceInterface属性引用值，保证各“ProvidedSomeipServiceInstance.serviceInterface”属性引用不同的“SomeipServiceInterfaceDeployment”元素，并保存修改。
    • 根据错误提示找到所有serviceInstanceId属性值相同的“ProvidedSomeipServiceInstance”元素，并修改其serviceInstanceId属性值，保证所有“ProvidedSomeipServiceInstance”元素的serviceInstanceId属性值唯一，并保存修改。

报错信息

[mdc_constr_1107] The value of the SomeipServiceInterfaceDeployment.serviceInterfaceId '12' attribute must be unique.

可能原因

存在多个设置了相同serviceInterfaceId属性值（12，MMC会根据所配置的实际值刷新提示）的“SomeipServiceInterfaceDeployment”元素。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 根据错误提示找到所有serviceInterfaceId属性值相同的“SomeipServiceInterfaceDeployment”元素，并修改其serviceInterfaceId属性值，保证所有“SomeipServiceInterfaceDeployment”元素的serviceInterfaceId属性值唯一，并保存修改。

报错信息

[mdc_constr_1108] The value of the DdsServiceInterfaceDeployment.serviceInterfaceId '22' attribute must be unique.

可能原因

存在多个设置了相同serviceInterfaceId属性值（22，MMC会根据所配置的实际值刷新提示）的“DdsServiceInterfaceDeployment”元素。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 根据错误提示找到所有serviceInterfaceId属性值相同的“DdsServiceInterfaceDeployment”元素，并修改其serviceInterfaceId属性值，保证所有“DdsServiceInterfaceDeployment”元素的serviceInterfaceId属性值唯一，并保存修改。

报错信息

[mdc_constr_1109] The value of the topicName 'mdc' attribute must be unique for the Event, Field, and Rpc roles under DdsServiceInterfaceDeployment.

可能原因

同一个“DdsServiceInterfaceDeployment”元素下的子元素“Event”的“Topic Name”、“Field”子元素“Notifier”的“Topic Name”、rpc中的“Reply Topic Name”和“Request Topic Name”存在重复的属性值（mdc，即Topic Name的属性值完全相同，包括大小写相同。MMC会根据所配置的实际值刷新提示）。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 根据具体业务需求将“DdsServiceInterfaceDeployment”的子元素event、field、rpc对应的“Topic Name”属性都设置为不同的值，并保存修改。

报错信息

[mdc_constr_1110] The shortName of current type element must be unique in the project.

可能原因

在该AUTOSAR工程内，存在相对路径相同（即ARPakcage层级及名称相同），且shortName值也相同的同类元素。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 根据具体业务需求选择如下解决方案，并保存修改。
    • 对应顶级元素：修改报错元素所属ARPakcage包名，保证元素的相对路径唯一。
    • 对于非顶级元素：修改报错元素的shortName值，保证同一父元素下shortName值的唯一性。

报错信息

[mdc_constr_1112] The object referenced by ServiceInterfaceDeploymentRef in DdsRequiredServiceInstance or in DdsProvidedServiceInstance must be of the DdsServiceInterfaceDeployment type.

可能原因

在“DdsProvidedServiceInstance”或“DdsRequiredServiceInstance”中绑定的通信协议与“ServiceInterfaceDeploymentRef”中引用的“ServiceInterfaceDeployment”所定义的通信协议不一致。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 根据业务需求，将“ServiceInterfaceDeploymentRef”中引用的“ServiceInterfaceDeployment”所定义的通信协议与“ServiceInstance”绑定的通信协议保持一致，并保存修改。

报错信息

[mcd_constr_1113] The object referenced by ServiceInterfaceDeploymentRef in RequiredSomeipServiceInstance or in ProvidedSomeipServiceInstance must be of the SomeipServiceInterfaceDeployment type.

可能原因

在“RequiredSomeipServiceInstance”或“ProvidedSomeipServiceInstance”中绑定的通信协议与“ServiceInterfaceDeploymentRef”中引用的“ServiceInterfaceDeployment”所定义的通信协议不一致。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 根据业务需求，将“ServiceInterfaceDeploymentRef”中引用的“ServiceInterfaceDeployment”所定义的通信协议“ServiceInstance”绑定的通信协议保持一致，并保存修改。

报错信息

[mcd_constr_1114] The object referenced by ServiceInstanceRefs in DdsServiceInstanceToMachineMapping must be of the DdsProvidedServiceInstance or DdsRequiredServiceInstance type.

可能原因

“DdsServiceInstanceToMachineMapping”中绑定的通信协议与“ServiceInstanceRefs”中引用的“ServiceInstance”所定义的通信协议不一致。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 根据业务需求，将“ServiceInstanceRefs”中所引用的“ServiceInstance”所定义的通信协议与“DdsServiceInstanceToMachineMapping”绑定的通信协议保持一致，并保存修改。

报错信息

[mcd_constr_1115] The object referenced by ServiceInstanceRefs in SomeipServiceInstanceToMachineMapping must be of the ProvidedSomeipServiceInstance or RequiredSomeipServiceInstance type.

可能原因

“SomeipServiceInstanceToMachineMapping”中绑定的通信协议与“ServiceInstanceRefs”中引用的“ServiceInstance”所定义的通信协议不一致。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 根据业务需求，将“ServiceInstanceRefs”中所引用的“ServiceInstance”所定义的通信协议与“SomeipServiceInstanceToMachineMapping”绑定的通信协议保持一致，并保存修改。

报错信息

[mdc_constr_1116] The ShortName 'event1' of VariableDataPrototype must be unique in the same namespace.

[mdc_constr_1116] The ShortName 'method1' of ClientServerOperation must be unique in the same namespace.

[mdc_constr_1116] The ShortName 'field1' of Field must be unique in the same namespace.

可能原因

配置了同一命名空间（namespace）的“ServiceInterface”下“VariableDataPrototype”、“ClientServerOperation”、“Field”元素存在同名。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 修改存在同名的“VariableDataPrototype”、“ClientServerOperation”、“Field”元素的shortName属性值，保证各元素shortName属性值唯一，并保存修改。

报错信息

[mdc_constr_1117] The FragSize and ListSize must exist or exist at the same time.

可能原因

“DdsServiceInterfaceDeployment”的属性fragSize和listSize，只配置了其中一个。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 根据业务需求修改“DdsServiceInterfaceDeployment”下的fragSize或listSize属性值，保证fragSize和listSize属性同时设置或都不设置，并保存修改。

报错信息[1]

[mdc_constr_1118] For a DdsProvidedServiceInstance.transportPlugins, the value of TransportPlugins cannot contain plugin other than ICC, UDP, SHM, DSHM, NDSHM and FSHM.

报错信息[2]

[mdc_constr_1118] For a DdsProvidedServiceInstance.transportPlugins, the values of Transport Plugins cannot contain any two of SHM, DSHM, NDSHM and FSHM at the same time.

报错信息[3]

[mdc_constr_1118] If DdsProvidedServiceInstance contains the methodQosProps or fieldQosProps sub-element, the value of transportPlugins must be ICC, SHM, UDP, or their combination.

报错信息[4]

[mdc_constr_1118] If event defining the data type RAWBUFFER exists under a DdsProvidedServiceInstance, the value of transportPlugins must be DSHM or NDSHM.

报错信息[5]

[mdc_constr_1118] If eventQosPropst defining the data type RAWBUFFER exists under a DdsProvidedServiceInstance, methodQosProps or fieldQosProps cannot be configured under the DdsProvidedServiceInstance.

可能原因
  • [1]：“DdsProvidedServiceInstance.transportPlugins”属性值包含除了“ICC”、“UDP”、“SHM”、“DSHM”、“NDSHM”和“FSHM”以外的值。
  • [2]：“DdsProvidedServiceInstance.transportPlugins”属性值同时包含“DSHM”、“SHM”、“NDSHM”和“FSHM”中的任意两个或以上的值。
  • [3]：当“DdsProvidedServiceInstance”下存在子元素methodqosprops和fieldqosprops，“DdsProvidedServiceInstance.transportPlugins”取值不为“ICC”、“SHM”、“UDP”或其组合。
  • [4]：“DdsProvidedServiceInstance”下存在引用了rawbuffer数据类型的子元素eventqosprops，但“DdsProvidedServiceInstance.transportPlugins”取值非“DSHM”和“NDSHM”。
  • [5]：“DdsProvidedServiceInstance”下存在引用了rawbuffer数据类型的子元素eventqosprops，且同时存在methodqosprops或fieldqosprops。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 根据实际报错原因选择如下解决方案，并保存修改。
    • [1]：删除“DdsProvidedServiceInstance.transportPlugins”中除了“ICC”、“UDP”、“SHM”、“DSHM”、“NDSHM”和“FSHM”以外的取值。
    • [2]：删除“DdsProvidedServiceInstance.transportPlugins”中的属性值“DSHM”、“SHM”、“NDSHM”和“FSHM”，并确保只有此四个值中的一个值。
    • [3]：将“DdsProvidedServiceInstance.transportPlugins”中的属性值设置为“ICC”、“SHM”、“UDP”或其组合。
    • [4]：将“DdsProvidedServiceInstance.transportPlugins”属性值配置为仅包含“DSHM”或“NDSHM”。
    • [5]：删除“DdsProvidedServiceInstance”下的子元素methodqosprops或fieldqosprops。

报错信息[1]

[mdc_constr_1119] field:'field' cannot reference the data type RAWBUFFER.

报错信息[2]

[mdc_constr_1119] method.argument:'method' cannot reference the data type RAWBUFFER.

可能原因
  • [1]：“Serviceinterface”下“的VariableDataPrototype.type”取值引用了“StdCppImplementationDataType.category”为“RAWBUFFER”的元素。
  • [2]：“Serviceinterface.ClientServerOperation.argumentDataPropotype.type”引用了“StdCppImplementationDataType.category”为“RAWBUFFER”的元素。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 根据实际业务需求选择如下解决方案，并保存修改。
    • 修改field或method引用的数据类型（“StdCppImplementationDataType”）。
    • 修改field或method引用的“StdCppImplementationDataType”元素下的category属性值为非“RAWBUFFER”。

报错信息[1]

[mdc_constr_1120] The value of transportPlugins cannot contain combination of DSHM and other plugin.

报错信息[2]

[mdc_constr_1120] The value of transportPlugins must be a subset of the transportPlugins:'[UDP]' of the DdsProvidedServiceInstance corresponding to the DdsRequiredServiceInstance.

报错信息[3]

[mdc_constr_1120] The value of transportPlugins cannot contain plugin other than ICC, UDP, SHM, DSHM，NDSHM and FSHM.

报错信息[4]

[mdc_constr_1120] The value of transportPlugins cannot contain combination of NDSHM and other plugin.

报错信息[5]

[mdc_constr_1120] The value of transportPlugins cannot contain combination of ICC and other plugin.

报错信息[6]

[mdc_constr_1120] The value of TransportPlugins cannot contain both SHM and FSHM.

可能原因
  • [1]：“DdsRequiredServiceInstance.transportPlugins”取值为“DSHM”的同时，还包含其他值，如“SHM”、“UDP”等。
  • [2]：“DdsRequiredServiceInstance”与“DdsProvidedServiceInstance”具有通信关系（引用了同一个“DdsServiceinterfaceDeployment”，且“ServiceInstanceId”相同），但配置的“DdsRequiredServiceInstance.transportPlugins”属性值却不属于对应的“DdsProvidedServiceInstance. transportPlugins”的子集。
  • [3]：“DdsRequiredServiceInstance.transportPlugins”属性值包含除了“ICC”、“UDP”、“SHM”、“DSHM”、“NDSHM”和“FSHM”以外的值。
  • [4]：“DdsRequiredServiceInstance.transportPlugins”取值包含“NDSHM”的同时，还包含其他值，如“SHM”、“UDP”等。
  • [5]：“DdsRequiredServiceInstance.transportPlugins”取值包含“ICC”的同时，还包含其他值，如“SHM”、“UDP”等。
  • [6]: “DdsRequiredServiceInstance.transportPlugins”取值同时包含“SHM”和“FSHM”。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 根据实际报错原因选择如下解决方案，并保存修改。
    • [1]：删除“DdsRequiredServiceInstance.transportPlugins”中除“DSHM”之外的值。
    • [2]：将“DdsRequiredServiceInstance.transportPlugins”属性值配置为对应的“DdsProvidedServiceInstance. transportPlugins”的子集。
    • [3]：将“DdsRequiredServiceInstance.transportPlugins”属性值修改为符合上述要求的值。
    • [4]：删除“DdsRequiredServiceInstance.transportPlugins”中除“NDSHM”之外的值。
    • [5]：删除“DdsRequiredServiceInstance.transportPlugins”中除“ICC”之外的值。
    • [6]： 删除“DdsRequiredServiceInstance.transportPlugins”中的“SHM”或“FSHM”，保留其中一个。

报错信息

[mdc_constr_1121] When there are multiple event, method, and field entries in the same service, the event ID (event),method ID (method), as well as notifier ID, setterID, and getterID (field), must be unique within the service.

可能原因
  1. “SomeipServiceInterfaceDeployment.SomeipEventDeployment”下存在相同的eventId值。
  2. “SomeipServiceInterfaceDeployment.SomeipMethodDeployment”下存在相同的methodId值。
  3. 存在多个“SomeipEventDeployment”引用了serviceInterface和serviceInterfaceId属性值相同的不同“SomeipServiceInterfaceDeployment”，且其eventid或methodid属性值相同。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 根据业务需求，修改eventid或methodid属性值，保证各eventid或methodid属性值的唯一值，并保存修改。

报错信息

[mdc_constr_1122] The 'DataID' of 'End2EndEventProtectionProps_shortName' must be unique on the same communication network.

可能原因
  1. 在同一个通信网络中，存在多个“End2EndEventProtectionProps”，它们配置的dataID相同。
  2. 在不同通信协议（DDS/SOMEIP）的同一通信网络下，存在“ServiceInstance”引用了相同的dataID。
    • DDS：在同一个通信网络（相同单播ip+相同domainId）中，两个及以上的“DdsProvidedServiceInstance”或“DdsRequiredServiceInstance”配置了相同的“End2EndEventProtectionProps.dataID”。
    • SOME/IP：在同一个通信网络（相同多播ip+相同服务发现端口）中，两个及以上的“ProvidedSomeipServiceInstance”或“RequiredSomeipServiceInstance”配置了相同的“End2EndEventProtectionProps.dataID”。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 根据业务需求，修改报错的“End2EndEventProtectionProps.dataId”属性值，保证同一通信网络内各“ServiceInstance”引用的dataID互不相同，并保存修改。

报错信息

[mdc_constr_1123] When the associated e2eProfileConfiguration.profileName is set to 'PROFILE_04', 'PROFILE_05', 'PROFILE_06', 'PROFILE_07', 'PROFILE_11', 'PROFILE_22' or 'PROFILE_04m', the value range of 'dataIds' in 'End2EndEventProtectionProps' cannot exceed dataIdMaxRange.

可能原因

“End2EndEventProtectionProps.dataIds”值超出如下e2eProfileConfiguration.profileName（Profile_X）值对应要求的范围。

  • PROFILE_04：[0,4294967295（UINT32_MAX）]
  • PROFILE_05：[0,65535（UINT16_MAX）]
  • PROFILE_06：[0,65535（UINT16_MAX）]
  • PROFILE_07：[0,4294967295（UINT32_MAX）]
  • PROFILE_11：[0,65535（UINT16_MAX）]
  • PROFILE_22：[0,255（UINT8_MAX）]
  • PROFILE_04m：[0,4294967295（UINT32_MAX）]

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 根据业务需求，修改目标dataId值至对应要求范围内，并保存修改。

报错信息

[mdc_constr_1124] When the associated e2eProfileConfiguration.profileName is set to 'ROFILE_04', 'PROFILE_05', 'PROFILE_06', 'PROFILE_07', 'PROFILE_11', 'PROFILE_22' or 'PROFILE_04m', the quantity of 'dataIds' in 'e2eProps' must meet the requirement.

可能原因

e2eProfileConfiguration.profileName.dataIds配置的个数不符合如下e2eProfileConfiguration.profileName值对应的要求。

  • PROFILE_04：1
  • PROFILE_05：1
  • PROFILE_06：1
  • PROFILE_07：1
  • PROFILE_11：1
  • PROFILE_22：16
  • PROFILE_04m：1

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 根据业务需求，修改dataId 配置的个数，满足对应要求，并保存修改。

报错信息

[mdc_constr_1125] When the associated e2eProfileConfiguration.profileName is set to 'PROFILE_04', The value range of  'minDataLength' in 'e2eProps' is [minDataLength, maxDataLength], and the value range of maxDataLength is [minDataLength, maxDataLength].

可能原因

“End2EndEventProtectionProps”下的minDataLength或maxDataLength值超出如下e2eProfileConfiguration.profileName值对应要求的范围。

  • PROFILE_04：minDataLength = [12*8, 4096*8(4kb)]，maxDataLength = [minDataLength, 4096*8(4kb)]
  • PROFILE_06：minDataLength = [5*8 , 4096*8(4kb)]，maxDataLength = [minDataLength, 4096*8(4kb)]
  • PROFILE_07：minDataLength = [20*8, 4096*1024*8]，maxDataLength = [minDataLength, 4096*1024*8]
  • PROFILE_04m：minDataLength = [16*8, 4096*8(4kb)]，maxDataLength = [minDataLength, 4096*8(4kb)]

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 根据业务需求，修改目标 minDataLength 或 maxDataLength的值至对应要求范围内，并保存修改。

报错信息

[mdc_constr_1126] When the associated e2eProfileConfiguration.profileName is set to "PROFILE_05", "PROFILE_11" or "PROFILE_22", the value range of 'dataLength' in 'End2EndEventProtectionProps_shortName' is [minDataLength, maxDataLength].

可能原因

“End2EndEventProtectionProps.dataLength”值超出如下e2eProfileConfiguration.profileName值对应要求的范围。

  • PROFILE_05：[3*8,4096*8]
  • PROFILE_11：[2*8,30*8]
  • PROFILE_22：[2*8,30*8]

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 根据业务需求，修改目标dataLength的值至对应要求范围内，并保存修改。

报错信息

[mdc_constr_1127] The ''profileName'' of ''{0}'' can only be set to ''PROFILE_04'', ''PROFILE_05'', ''PROFILE_06'', ''PROFILE_07'', ''PROFILE_11'', ''PROFILE_22'' or ''PROFILE_04m'' (case-sensitive). Profile_04m is used only for End2EndMethodProtectionProps.

可能原因

e2eProfileConfiguration.profileName配置的值不在指定范围内。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 根据业务需求，将目标fileName值修改为“PROFILE_04”、“PROFILE_05”、“PROFILE_06”、“PROFILE_07”、“PROFILE_11”、“PROFILE_22”或“PROFILE_04m”（“PROFILE_04m”只能用于“End2EndMethodProtectionProps”），并保存修改。

报错信息

[mdc_constr_1128] When the associated e2eProfileConfiguration.profileName is set to PROFILE_04/ PROFILE_05/ PROFILE_06/ PROFILE_07/ PROFILE_11/ PROFILE_22/PROFILE_04m, the value range of 'maxDeltaCounter' in 'End2EndEventProtectionProps_shortName' is [1, MaxDeltaCounter].

可能原因

e2eProfileConfiguration.maxDeltaCounter值超出如下e2eProfileConfiguration.profileName值对应要求的范围。

  • PROFILE_04：[1,65535（UINT16_MAX）]
  • PROFILE_05：[1,255（UINT8_MAX）]
  • PROFILE_06：[1,255（UINT8_MAX）]
  • PROFILE_07：[1,4294967295（UINT32_MAX）]
  • PROFILE_11：[1,255（UINT8_MAX）]
  • PROFILE_22：[1,255（UINT8_MAX）]
  • PROFILE_04m：[1,65535（UINT16_MAX）]

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 根据业务需求，修改目标maxDeltaCounter的值至对应要求范围内，并保存修改。

报错信息

[mdc_constr_1129] When the value of E2EProfileConfiguration.profileName is set to 'Profile_11', the 'dataIdMode' of 'E2EProfileConfiguration_shortName' must be set to 'ALL-16-BIT' or 'LOWER-12-BIT'.

可能原因

当e2eProfileConfiguration.profileName值为“PROFILE_11”时，对应e2eProfileConfiguration下的dataIdMode值不为“ALL-16-BIT”或“LOW-12-BIT”。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 根据业务需求，将目标dataIdMode 值修改为“ALL-16-BIT”或“LOW-12-BIT”，并保存修改。

报错信息

[mdc_constr_1130] In the 'E2EProfileConfiguration_shortName' area, all attributes except 'dataIdMode', 'profileName', and 'maxDeltaCounter' are state machine attributes which must be configured or left blank at the same time.

可能原因

E2E属性只配置了部分状态机属性。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 根据业务需求，选择如下解决方案，并保存修改。
    • 不配置任何E2E属性。
    • 在“E2EProfileConfiguration”下，将除了“dataIdMode”、“profileName”和“maxDeltaCounter”的所有属性都配置完整。

报错信息

[mdc_constr_1131] The attribute 'serviceInterface' of 'DdsServiceInterfaceDeployment/SomeipServiceInterfaceDeployment-shortName' must be set.

可能原因

没有配置“DdsServiceInterfaceDeployment”或“SomeipServiceInterfaceDeployment”的“ServiceInterface”属性。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 根据业务需求，完成“DdsServiceInterfaceDeployment”或“SomeipServiceInterfaceDeployment”的serviceInterface属性值的配置，并保存修改。

报错信息

[mdc_constr_1132] The attribute 'ddsRpcService' of 'DdsMethodDeployment-shortName' must be set.

可能原因

没有配置“DdsMethodDeployment.ddsRpcService”。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 根据业务需求，完成“DdsMethodDeployment.ddsRpcService”属性值的配置，并保存修改。

报错信息[1]

[mdc_constr_1133] When ClientServerOperation.FireAndForget associated with DdsRpcServiceDeployment ('shortName') is set to 'true',  'requestTopicName' attributes of 'rpcDeployment' must be configured.

报错信息[2]

[mdc_constr_1133] When ClientServerOperation.FireAndForget associated with DdsRpcServiceDeployment ('shortName') is set to 'false', the 'requestTopicName' and 'replyTopicName' attributes of 'rpcDeployment_02' must be configured.

可能原因
  • [1]：当“DdsRpcServiceDeployment”关联的“ClientServerOperation”的属性“FireAndForget”配置为“true”时，没有配置“DdsRpcServiceDeployment.requestTopicName”。
  • [2]：当“DdsRpcServiceDeployment”关联的“ClientServerOperation”的属性“FireAndForget”配置为“false”（若没配置，默认为“false”）时，没有配置“DdsRpcServiceDeployment.requestTopicName”或“DdsRpcServiceDeployment.replyTopicName”。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 按照如下对应方案解决：
    • [1]：完成“DdsRpcServiceDeployment.requestTopicName”属性配置，并保存修改。
    • [2]：完成“DdsRpcServiceDeployment”下的requestTopicName和replyTopicName属性配置，并保存修改。

报错信息[1]

[mdc_constr_1134] When DdsEventDeployment ('shortNameA') is referenced by DdsFiledDeployment.notify, the 'event' attribute of the 'shortNameA' must not be configured.

报错信息[2]

[mdc_constr_1134] When DdsEventDeployment ('shortNameA') is referenced by DdsServiceInterfaceDeployment, the 'event' attribute of the 'shortNameA' must be configured.

可能原因
  • [1]：被“DdsServiceInterfaceDeployment.ddsFieldDeployment.notifier”引用的“DdsEventDeployment”配置了event属性。
  • [2]：被“DdsServiceInterfaceDeployment”引用的“DdsEventDeployment”没有配置event属性。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 按照如下对应方案解决：
    • [1]：删除被引用“DdsEventDeployment”中的event属性配置，并保存修改。
    • [2]：完成“DdsEventDeployment.event”属性的配置，并保存修改。

报错信息[1]

[mdc_constr_1135] When DdsMethodDeployment ('methodDeployment') is referenced by DdsFiledDeployment.get or DdsFiledDeployment.set, the 'method' attribute of the 'methodDeployment' must not be configured.

报错信息[2]

[mdc_constr_1135] When DdsMethodDeployment ('methodDeployment') is referenced by DdsServiceInterfaceDeployment, the 'method' attribute of the 'methodDeployment' must be configured.

可能原因
  • [1]：被“DdsServiceInterfaceDeployment.ddsFieldDeployment”下的set或get引用的“DdsMethodDeployment”配置了method属性。
  • [2]：被“DdsServiceInterfaceDeployment.ddsMethodDeployment”引用的“DdsEventDeployment”没有配置method属性。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 按照如下对应方案解决：
    • [1]：删除被引用“DdsMethodDeployment”中的method属性配置，并保存修改。
    • [2]：完成“DdsEventDeployment.method”属性的配置，并保存修改。

报错信息

[mdc_constr_1136] The attribute 'serviceInterfaceDeployment' of 'DdsProvidedServiceInstance/DdsRequiredServiceInstance(shortName)' must be set.

可能原因

没有配置“DdsProvidedServiceInstance”或“DdsRequiredServiceInstance下的serviceInterfaceDeployment”属性。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 根据业务需求，完成“DdsProvidedServiceInstance”或“DdsRequiredServiceInstance”下的serviceInterface属性值的配置，并保存修改。

报错信息

[mdc_constr_1137] The attribute 'serviceInterfaceDeployment' of 'ProvidedSomeipServiceInstance/RequiredSomeipServiceInstance (shortName)' must be set.

可能原因

没有配置“ProvidedSomeipServiceInstance”或“RequiredSomeipServiceInstance”下的serviceInterfaceDeployment属性。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 根据业务需求，完成“ProvidedSomeipServiceInstance”或“RequiredSomeipServiceInstance”下的serviceInterface属性值的配置，并保存修改。

报错信息

[mdc_constr_1138] The attribute 'requiredServiceInstanceId' of 'RequiredSomeipServiceInstance(shortName)' must be set.

可能原因

没有配置“RequiredSomeipServiceInstance.requiredServiceInstanceId”。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 根据业务需求，完成“RequiredSomeipServiceInstance.requiredServiceInstanceId”属性值的配置 ，并保存修改。

报错信息

[mdc_constr_1139] The attribute 'communicationConnector' of 'DdsServiceInstanceToMachineMapping(shortName)/SomeipServiceInstanceToMachineMapping(shortName)' must be set.

可能原因

没有配置“DdsServiceInstanceToMachineMapping”或“SomeipServiceInstanceToMachineMapping”下的communicationConnector属性。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 根据业务需求，完成“DdsServiceInstanceToMachineMapping”或“SomeipServiceInstanceToMachineMapping”下communicationConnector属性值的配置，并保存修改。

报错信息

[mdc_constr_1140] The attribute 'process' of 'ServiceInstanceToPortPrototypeMapping(shortName)' must be set.

可能原因

没有配置“ServiceInstanceToPortPrototypeMapping.process”。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 根据业务需求，完成“ServiceInstanceToPortPrototypeMapping.process”属性值的配置，并保存修改。

报错信息

[mdc_constr_1141] The attribute 'serviceInstance' of 'ServiceInstanceToPortPrototypeMapping(shortName)' must be set.

可能原因

没有配置“ServiceInstanceToPortPrototypeMapping.serviceInstance”。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 根据业务需求，完成“ServiceInstanceToPortPrototypeMapping.serviceInstance”属性值的配置，并保存修改。

报错信息

[mdc_constr_1142] The attribute 'executable' of 'ProcessDesign' must be set.

可能原因

没有配置“ProcessDesign.executable”。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 根据业务需求，完成“ProcessDesign.executable”属性值的配置，并保存修改。

报错信息

[mdc_constr_1143] The attribute 'design' of 'Process' must be set.

可能原因

没有配置“Process.design”。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 根据业务需求，完成“Process.design”属性值的配置，并保存修改。

报错信息

[mdc_constr_1144] When StdCppImplementationDataType.category is set to VALUE, the value of 'shortName' can be bool, double, float, int16_t, int32_t, int64_t, int8_t, uint16_t, uint32_t, uint64_t, uint8_t, or RawMemory.

可能原因

“StdCppImplementationDataType.category”属性配置为“VALUE”时，其简称（shortName）不在取值范围（“bool”、“double”、“float”、“int16_t”、“int32_t”、“int64_t”、“int8_t”、“uint16_t”、“uint32_t”、“uint64_t”、“uint8_t”或“RawMemory”）内。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 根据业务需求，修改报错的StdCppImplementationDataType的shortName属性值，保证其值在取值范围（“bool”、“double”、“float”、“int16_t”、“int32_t”、“int64_t”、“int8_t”、“uint16_t”、“uint32_t”、“uint64_t”、“uint8_t”或“RawMemory”）内，并保存修改。

报错信息

[mdc_constr_1145] When the 'category' attribute of StdCppImplementationDataType ('shortNameA') is set to 'ARRAY', the 'arraySize' attribute must be set to an integer greater than or equal to 0.

可能原因

“StdCppImplementationDataType”的category属性配置为“ARRAY”时，没有配置arraySize属性或arraySize属性值小于0。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 根据业务需求，将“StdCppImplementationDataType.arraySize”属性值配置为大于等于0的数值，并保存修改。

报错信息

[mdc_constr_1146] When the 'category' attribute of StdCppImplementationDataType ('type_ref') is set to 'TYPE_REFERENCE', the 'typeReference' attribute must be configured.

可能原因

“StdCppImplementationDataType”的category属性配置为“TYPE_REFERENCE”时，没有配置typeReference属性。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 根据业务需求，完成“StdCppImplementationDataType.typeReference”属性值的配置，并保存修改。

报错信息

[mdc_constr_1147] The 'upperLimit' and 'LowerLimit' values under the same CompuScale ('shortNameA')  element must be the same, and the 'Text' attribute must be configured.

可能原因
  1. 没有配置“CompuScale.text”。
  2. 没有配置“CompuScale”的upperLimit和LowerLimit属性。
  3. 配置了“CompuScale”的upperLimit和LowerLimit属性，但两者的属性值不相同。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 根据业务需要，选择如下对应方案解决：
    • 配置“CompuScale.text”属性值，并保存修改。
    • 配置目标“CompuScale”下的upperLimit和LowerLimit属性值，且保证两个属性值相同，并保存修改。

报错信息

[mdc_constr_1148] The DdsServiceInterfaceDeployment ('shortNameA') element must have the Event, Method, and Field settings of its associated ServiceInterface ('shortNameB') element, and must not have others 'method' settings not available under the 'shortNameB' element.

可能原因

“DdsServiceInterfaceDeployment”中的协议配置项没有与关联的ServiceInterface中所有的Event、Method或Field属性配置逐一对应。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 对照关联“ServiceInterface”中的Event、Method或Field属性配置，为目标“DdsServiceInterfaceDeployment”配置对应的eventDeployment、fieldDeployment或methodDeployment属性，并保存修改。

报错信息

[mdc_constr_1149] The SomeipServiceInterfaceDeployment ('shortNameA') element must have the Event, Method, and Field settings of its associated ServiceInterface ('shortNameB') element, and must not have others 'method' settings not available under the 'shortNameB' element.

可能原因

“SomeipServiceInterfaceDeployment”中的协议配置项没有与关联的“ServiceInterface”中所有的Event、Method或Field配置逐一对应。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 对照关联“ServiceInterface”中的Event、Method或Field属性配置，为目标“SomeipServiceInterfaceDeployment”配置对应的eventDeployment、fieldDeployment或methodDeployment属性，并保存修改。

报错信息[1]

[mdc_constr_1150] The 'eventQosProps' must uniquely correspond to 'DdsEventDeployment' in DdsServiceInterfaceDeployment ('ShortName').

报错信息[2]

[mdc_constr_1150] The 'methodQosProps' must uniquely correspond to 'DdsMethodDeployment' in DdsServiceInterfaceDeployment ('ShortName').

报错信息[3]

[mdc_constr_1150] The 'fieldGetSetQosProps' must uniquely correspond to 'DdsFieldDeployment' in DdsServiceInterfaceDeployment ('ShortName').

报错信息[4]

[mdc_constr_1150] The 'fieldNotifierQosProps' must uniquely correspond to 'DdsFieldDeployment' in DdsServiceInterfaceDeployment ('ShortName').

可能原因
  • “DdsRequiredServiceInstance”或“DdsProvidedServiceInstance”中存在“DdsEventQosPros”、“DdsMethodQosPros”、“DdsFieldGetSetQosPros”或“DdsFieldNotifierQosPros”重复关联了同一个“DdsEventDeployment”、“DdsMethodDeployment”或“DdsFieldDeployment”。
  • 目标“DdsFieldDeployment”没有配置get或set，但配置了fieldGetSetQosProps。
  • 目标“DdsFieldDeployment”没有配置notifier，但配置了fieldNotifierQosProps。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 按照如下对应方案解决：
    • 修改“DdsRequiredServiceInstance”或“DdsProvidedServiceInstanc”下的所有关联重复项的“DdsEventQosPros”、“DdsMethodQosPros”、“DdsFieldGetSetQosPros”或“DdsFieldNotifierQosPros”属性配置，保证都关联不同的“DdsEventDeployment”、“DdsMethodDeployment”或“DdsFieldDeployment”，并保存修改。
    • 在目标“DdsFieldDeployment”元素中配置get或set（对应fieldGetSetQosProps），或删除fieldGetSetQosProps配置。
    • 在目标“DdsFieldDeployment”元素中配置notifier（对应fieldNotifierQosProps），或删除fieldNotifierQosProps配置。

报错信息

[mdc_constr_1151] All DdsEventDeployment attributes configured in DdsProvidedServiceInstance.serviceInterface ('ShortNameA') must have only one corresponding 'eventQosProps' attribute.

可能原因

不是所有的“ServiceInterface.DdsEventDeployment”都在“DdsProvidedServiceInstance”或“DdsRequiredServiceInstance的eventQosPros”属性中逐一关联了。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 配置目标“DdsProvidedServiceInstance”或“DdsRequiredServiceInstance”下的eventQosPros属性，引用对应“ServiceInterface.DdsEventDeployment”，并保存修改。

报错信息

[mdc_constr_1152] All DdsMethodDeployment attributes configured in DdsProvidedServiceInstance.serviceInterface ('ShortNameA') must have only one corresponding 'methodQosProps' attribute.

可能原因

不是所有的“ServiceInterface.DdsMethodDeployment”都在“DdsProvidedServiceInstance”或“DdsRequiredServiceInstance”的methodQosProps属性中逐一关联了。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 配置目标“DdsProvidedServiceInstance”或“DdsRequiredServiceInstance”下的methodQosPros属性，保证逐一关联到所有“ServiceInterface.DdsMethodDeployment”，并保存修改。

报错信息

[mdc_constr_1153] All DdsFieldDeployment.Get/Set attributes configured in {1}.serviceInterface ('{0}') must have the corresponding 'fieldGetSetQosProps' attribute.

可能原因

不是所有的“ServiceInterface.DdsFieldDeployment”都在“DdsProvidedServiceInstance”或“DdsRequiredServiceInstance”的fieldGetSetQosPros属性中逐一关联了。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 配置目标“DdsProvidedServiceInstance”或“DdsRequiredServiceInstance”下的fieldGetSetQosProps属性 ，保证逐一关联到所有“ServiceInterface.DdsFieldDeployment”，并保存修改。

报错信息

[mdc_constr_1154] All DdsFieldDeployment.Notify attributes configured in {1}.serviceInterface ('{0}') must have the corresponding 'fieldNotifierQosProps' attribute.

可能原因

不是所有的“ServiceInterface.DdsFieldDeployment”都在“DdsProvidedServiceInstance”或“DdsRequiredServiceInstance”的fieldNotifierQosProps属性中逐一关联了。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 配置目标“DdsProvidedServiceInstance”或“DdsRequiredServiceInstance”下的fieldNotifierQosProps属性，保证逐一关联到所有“ServiceInterface.DdsFieldDeployment”，并保存修改。

报错信息

[mdc_constr_1156] The value of End2EndMethodProtectionProps.sourceId is a 28-bit unsigned integer and ranges from 0 to 268435455.

可能原因

“End2EndMethodProtectionProps.sourceId”不在取值范围[0,268435455]内。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 根据业务需求，将目标“End2EndMethodProtectionProps.sourceId”值修改至[0,268435455]范围内，并保存配置。

报错信息

[mdc_constr_1158] The value of ProvidedSomeipServiceInstance.serviceInstanceId must be in the range of 0..65534.

可能原因

“ProvidedSomeipServiceInstance.serviceInstanceId”取值超过取值范围[0,65534]。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 根据业务需求，修改目标“ProvidedSomeipServiceInstance.serviceInstanceId”值，保证取值在[0,65534]范围内，并保存修改。

报错信息

[mdc_constr_1159] Set the 'RequiredServiceInstanceId' attribute under 'DdsRequiredServiceInstance' to a value ranging from 0 to 65534 or 'any' (case-insensitive).

可能原因

“DdsRequiredServiceInstance.RequiredServiceInstanceId”取值不在[0,65534]内，且不为“any”（不区分大小写）。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 根据业务需求，修改目标“DdsRequiredServiceInstance.RequiredServiceInstanceId”值在取值范围[0,65534]内或配置为“any”，并保存修改。

报错信息

[mdc_constr_1160] Set the 'RequiredServiceInstanceId' attribute under 'RequiredSomeipServiceInstance' to a value ranging from 0 to 65534 or 'any' (case-insensitive).

可能原因

“RequiredSomeipServiceInstance.RequiredServiceInstanceId”取值不在[0,65534]范围内，且不为“any”（不区分大小写）。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 根据业务需求，修改目标“RequiredSomeipServiceInstance.RequiredServiceInstanceId”值在取值范围[0,65534]内或配置为“any”，并保存修改。

报错信息

[mdc_constr_1161] The attribute 'serviceInstances' of ServiceInstanceToMachineMapping ('shortName') must be set.

可能原因

未配置“ServiceInstanceToMachineMapping.serviceInstances”。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 为“ServiceInstanceToMachineMapping”的属性serviceInstances，设置至少一个值，然后保存配置。

报错信息

[mdc_constr_1162] A unicast IP address must be configured for the CommunicationConnector associated with a DdsServiceInstanceToMachineMapping or SomeipServiceInstanceToMachineMapping.

可能原因

“ServiceInstanceToMachineMapping”关联的“CommunicationConnector”没有配置单播IP。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 根据报错提示，找到“ServiceInstanceToMachineMapping”后，跳转到其属性“CommunicationConnector”，查看“CommunicationConnector”的属性“Unicast Network Endpoint”是否引用了“NetworkEndPoint”，如果未引用，则添加并配置单播IP，如果已引用，则为该引用的元素配置单播IP。
  3. 保存配置。

报错信息

[mdc_constr_1163] If a CommunicationConnector is configured with a unicast IP and referenced by a ServiceInstanceToMachineMapping, other CommunicationConnectors cannot have the same IP address and VLAN (VLAN is 0 by default) as this CommunicationConnector.

可能原因

关联到 “ServiceInstanceToMachineMapping”的“CommunicationConnector”，配置了与其他“CommunicationConnector”相同IP和VLAN（VLAN默认为0）。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 根据业务需要，选择解决方法：
    • 找到“ServiceInstanceToMachineMapping”（shortName）后，跳转到其属性“CommunicationConnector”，查看“CommunicationConnector”的属性“Unicast Network Endpoint”引用的“NetworkEndPoint”，修改“NetworkEndPoint”中的IP或Vlan，直至IP和Vlan的配置与其他“CommunicationConnector”不相同。
    • 找到“ServiceInstanceToMachineMapping”（shortName）后，跳转到其属性“CommunicationConnector”，删除该重复的“CommunicationConnector”，并在“ServiceInstanceToMachineMapping”中引用同一个“CommunicationConnector”。
  3. 保存配置。

报错信息

[mdc_constr_1164] For all SomeipServiceInstances that reference the same CommunicationConnector, the Tcp Ports or Udp Ports with which they are associated through a SomeipServiceInstanceToMachineMapping shall be unique.

可能原因

引用同一个“CommunicationConnector”的所有“SomeipServiceInstance”，通过“SomeipServiceInstanceToMachineMapping”关联的tcpPort或udpPort重复了。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 根据报错提示，根据“SomeipServiceInstanceToMachineMapping”（shortName）引用的“SomeipServiceInstance”情况，执行对应的解决方法。
    • 如果“SomeipServiceInstanceToMachineMapping”引用了多个“SomeipServiceInstance”，则删除多余的，仅保留一个。并根据业务需要，使每个“SomeipServiceInstance”都有一个对应的“SomeipServiceInstanceToMachineMapping”，并确保其tcpPort或udpPort不相同。
    • 如果“SomeipServiceInstanceToMachineMapping”仅引用一个“SomeipServiceInstance”，则根据业务需求，修改“SomeipServiceInstanceToMachineMapping”引用的“CommunicationConnector”或tcpPort或udpPort，确保同一个“CommunicationConnector”被关联的每个“SomeipServiceInstance”的tcpPort或udpPort都不相同。
  3. 然后保存配置。

报错信息

[mdc_constr_1165] When the Category of an StdCppImplementationDataType is set to ASSOCIATIVE_MAP, at least two CppTemplateArguments shall be configured for this StdCppImplementationDataType.

可能原因

当“StdCppImplementationDataType”的“Category”设置为“ASSOCIATIVE_MAP”时，最多只配置了一个“CppTemplateArgument”。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 根据报错提示找到在“StdCppImplementationDataType”，并为该元素配置至少两个“CppTemplateArgument”，然后保存配置。

报错信息

[mdc_constr_1168] If ServiceInstanceToPortPrototypeMapping and Service InstanceToMachineMapping reference the same ServiceInstance, then the Executable associated with ServiceInstanceToPortPrototypeMapping shall be referenced by the Process associated with the Machine corresponding to the Machine Design associated with ServiceInstanceToMachineMapping.

可能原因

“ServiceInstanceToPortPrototypeMapping”和“Service InstanceToMachineMapping”引用相同的“ServiceInstance”，“ServiceInstanceToPortPrototypeMapping”关联的“Executable”，未被“ServiceInstanceToMachineMapping”关联的“Machine Design”对应的“Machine”关联的“Process”引用。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置（“Process”）。
  2. 配置“Process”通过“processToServiceInstanceMapping”和通过“ServiceInstanceToPortPrototypeMapping”关联的“Machine”一致，并保存修改。

报错信息

[mdc_constr_1169] The value of ServiceInterface corresponding to the Executable associated with ServiceInstanceToPortPrototypeMapping must be the same as the value of ServiceInterface corresponding to the ServiceInstance referenced by ServiceInstanceToPortPrototypeMapping.

可能原因

“ServiceInstanceToPortPrototypeMapping”关联的“Executable”对应的“ServiceInterface”没有与其引用的“ServiceInstance”所对应的“ServiceInterface”保持一致。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置（“ServiceInstanceToPortPrototypeMapping”）。
  2. 配置“ServiceInstanceToPortPrototypeMapping”关联的“Executable”对应的“ServiceInterface”与其引用的“ServiceInstance”所对应的“ServiceInterface”保持一致，并保存修改。

报错信息

[mdc_constr_1170] ProvidedServiceInstance.SericeInterfaceDeployment.ServiceInterface shall be associated with the AdaptiveApplicationSwComponentType.PPortPrototype. RequiredServiceInstance.SericeInterfaceDeployment.ServiceInterface shall be associated with the AdaptiveApplicationSwComponentType.RPortPrototype.

可能原因
  • “ProvidedServiceInstance.SericeInterfaceDeployment.ServiceInterface”未关联“AdaptiveApplicationSwComponentType.PPortPrototype”。
  • “RequiredServiceInstance.SericeInterfaceDeployment.ServiceInterface”未关联“AdaptiveApplicationSwComponentType.RPortPrototype”。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置（“ProvidedServiceInstance”）。
  2. 根据业务需求，选择解决方法，并保存修改。
    • “ProvidedServiceInstance.SericeInterfaceDeployment.ServiceInterface”关联“AdaptiveApplicationSwComponentType.PPortPrototype”。
    • “RequiredServiceInstance.SericeInterfaceDeployment.ServiceInterface”关联“AdaptiveApplicationSwComponentType.RPortPrototype”。

报错信息

[mdc_constr_1175] The values of the Distributed attribute of the SomeipServiceInstances associated with the same Process and EthernetPhysicalChannel are different.

可能原因

关联至同一“EthernetPhysicalChannel”（通过“SomeipServiceInstanceToMachineMapping.CommunicationConnector.UnicastNetworkEndpoint”关联至同一“EthernetPhysicalChannel”），且关联到同一“Process”（通过“ServiceInstanceToPortPrototypeMapping”关联到同一个“ProcessDesign”）的“RequiredSomeipServiceInstance”和“ProvidedSomeipServiceInstance”，其“Distributed”属性值不同。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置（“RequiredSomeipServiceInstance”/“ProvidedSomeipServiceInstance”）。
  2. 修改“Distributed”的属性值，确保“RequiredSomeipServiceInstance”/“ProvidedSomeipServiceInstance”的“Distributed”参数配置均为“true”或者均为“false”，并保存修改。

报错信息

[mdc_constr_1176] Under the same Machine, the SomeipServiceInstances associated with the same EthernetPhysicalChannel and the same tcp/udp port through SomeipServiceInstanceToMachineMapping should be associated with the same process if the Distributed value of any of them is set to true.

可能原因

在同一“Machine”下，通过“SomeipServiceInstanceToMachineMapping”关联到同一“EthernetPhysicalChannel”和相同的tcp port或udp port的“RequiredSomeipServiceInstance”和“ProvidedSomeipServiceInstance”，若其中存在instance的“Distributed”属性配置为“true”，则这些instance未关联到同一“Process”。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置（“RequiredSomeipServiceInstance”/“ProvidedSomeipServiceInstance”）。
  2. 添加或者修改“SomeipServiceInstanceToPortPrototypeMapping”，确保所有“RequiredSomeipServiceInstance”/“ProvidedSomeipServiceInstance”关联到同一个“Process”，并保存修改。

报错信息

[constr_1620] If the value of attribute StartupConfig.schedulingPolicy is set to SchedulingPolicyFifo or SchedulingPolicyRoundRobin, the value of attribute StartupConfig.schedulingPriority must be set.

可能原因

在同一个“StartupConfig”下，其属性schedulingPolicy配置为“SCHEDULING_POLICY_FIFO”或“SCHEDULING_POLICY_ROUND_ROBIN”时，没有配置属性schedulingPriority。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 根据业务需求，将“StartupConfig.schedulingPolicy”值修改为“SCHEDULING-POLICY-OTHER”或在目标“StartupConfig”下配置schedulingPriority属性，并保存修改。

报错信息

[mdc_constr_1173] When DdsProvidedServiceInstance.DdsEventQos.reliability_kind is set to RELIABLE, DdsRequiredServiceInstance.DdsEventQos.reliability_kind must be set to RELIABLE or BEST_EFFORT. When DdsProvidedServiceInstance.DdsEventQos.reliability_kind is set to BEST_EFFORT, DdsRequiredServiceInstance.DdsEventQos.reliability_kind must be set to BEST_EFFORT.

可能原因

“DdsProvidedServiceInstance.DdsEventQos.reliability_kind”设置为“BEST_EFFORT”，“DdsRequiredServiceInstance.DdsEventQos.reliability_kind”设置为“RELIABLE”。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置（“DdsProvidedServiceInstance”）。
  2. “DdsRequiredServiceInstance.DdsEventQos.reliability_kind”配置为“BEST_EFFORT”，与“DdsProvidedServiceInstance.DdsEventQos.relibaility_kind”的属性值保持一致，并保存修改。

报错信息

[mdc_constr_1174] Set DdsRequiredServiceInstance.DdsEventQosProps.reliability_kind to BEST_EFFORT.

可能原因

“DdsRequiredServiceInstance.DdsEventQosProps.reliability_kind”设置为“BEST_EFFORT”。

处理步骤

该告警表示收端配置为“BEST_EFFORT”时存在丢包的风险。

  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置（“DdsEventQosProps”）。
  2. 根据业务需要确定是否修改“DdsRequiredServiceInstance.DdsEventQosProps.reliability_kind”的属性值，并保存修改。

报错信息

[mdc_constr_1201] In ProcessToMachineMapping, the ShortName of the Executable object referenced by multiple Processes associated with the same Machine must be different.

可能原因

在“ProcessToMachineMapping”中存在多个关联了同一个“Machine”的“Process”引用的“Executable”中的shortName属性值重复。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 根据业务需求，修改“ProcessToMachineMapping”中关联了同一个“Machine”的“Process”所引用的“Executable”中的shortName属性值，确保其唯一性，并保存修改。

报错信息

[mdc_constr_1202] The AP data type, rather than the CP data type, should be used here.

可能原因

引用了CP数据类型。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 将引用的数据类型改为AP数据类型，并保存修改。

报错信息

[mdc_constr_2101] If ModeTransition.action is not empty, ModeDeclaration corresponding to ModeTransition.enteredMode must be contained in ModeTransition.action.

可能原因

“ModeTransition”元素“Actions”聚合属性引用的“ModeDeclaration”中，没有包含“ModeTransition”元素“EnteredMode”属性引用的“ModeDeclaration”。

处理步骤

  1. 双击对应的错误描述信息，定位至报错具体位置。

  2. 根据业务需求修改“ModeTransition”元素“Actions”聚合属性，在“Actions”引用中添加“ModeTransition”元素的“EnteredMode”属性所引用的“ModeDeclaration”，并保存修改。

报错信息

[mdc_constr_2102] ModeDependency cannot reference ModeDeclaration defined in ModeDeclarationGroup to which ModeDependency belongs.

可能原因

“ModeDeclarationGroup.modeDeclaration.ModeDependency”元素的states聚合属性引用了“ModeDependency”元素所在“ModeDeclarationGroup”元素中定义的“ModeDeclaration”。

处理步骤

  1. 双击对应的错误描述信息，定位至报错具体位置。

  2. 根据业务需求修改“ModeDependency”元素的states聚合属性引用值，删除其所在“ModeDeclarationGroup”元素中定义的“ModeDeclaration”，再添加正确的“ModeDeclaration”，并保存修改。

报错信息

[mdc_constr_2103] States in ModeDependency cannot reference multiple ModeDeclarations defined in the same ModeDeclarationGroup.

可能原因

“ModeDependency”元素的states聚合属性引用了定义在同一个“ModeDeclarationGroup”中的多个“ModeDeclaration”。

处理步骤

  1. 双击对应的错误描述信息，定位至报错具体位置。

  2. 根据业务需求修改“ModeDependency”元素的states聚合属性引用值，删除定义在同一个“ModeDeclarationGroup”中的“ModeDeclaration”，确保所引用的“ModeDeclaration”是在不同的“ModeDeclarationGroup”下定义的，并保存修改。

报错信息

[mdc_constr_2104] ModeDependency and ModeConflict in the same ModeDeclarationGroup.ModeDeclaration cannot reference the same ModeDeclaration.

可能原因

存在同一个“ModeDeclarationGroup.ModeDeclaration”下定义的“ModeDependency”和“ModeConflict”元素，它们的states聚合属性引用了相同的“ModeDeclaration”。

处理步骤

  1. 双击对应的错误描述信息，定位至报错具体位置。

  2. 根据业务需求修改“ModeDependency”或“ModeConflict”元素的states聚合属性引用值，使其引用不同的“ModeDeclaration”，并保存修改。

报错信息

[mdc_constr_2105] ModeConflict cannot reference ModeDeclaration defined in ModeDeclarationGroup to which ModeConflict belongs.

可能原因

“ModeDeclarationGroup.ModeDeclaration. ModeConflict”元素的states聚合属性引用了其所在“ModeDeclarationGroup”中定义的“ModeDeclaration”。

处理步骤

  1. 双击对应的错误描述信息，定位至报错具体位置。

  2. 根据业务需求修改“ModeConflict”元素的states聚合属性引用值，删除其所在“ModeDeclarationGroup”中定义的“ModeDeclaration”，重新添加正确的“ModeDeclaration”，并保存修改。

报错信息

[mdc_constr_2106] The Actions property of ModeTransition 'OffToRunning' cannot reference multiple ModeDeclarations that belong to the same ModeDeclarationGroup.

可能原因

“ModeTransition.Actions”不能引用同一个“ModeDeclarationGroup”下的多个状态（“ModeDeclaration”）。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 根据业务需求，删除目标“ModeTransition.Actions”中多余的引用值（“ModeDeclaration”），保证每个被引用的状态属于不同的功能组，并保存修改。

报错信息

[mdc_constr_2107] The ShortName 'shortName' of ModeDeclarationGroup must be unique in the project.

可能原因

“ModeDeclarationGroup.shortName”值非全局唯一（shortName值大小写敏感）。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 将目标“ModeDeclarationGroup.shortName”值修改为全局唯一，并保存修改。

报错信息[1]

[mdc_constr_2108] In a machine, the function group whose shortName is ''MachineState'' must contain ModeDeclarations with the following ShortNames: Standby, Update, Verify, and Reset.

报错信息[2]

[mdc_constr_2108] In a machine, the function group whose 'shortName' is 'MachineState' must include necessary 'ModeTransitions' (EnteredMode/ExitedMode: Reset/Startup ,Verify/Restartup).

可能原因

被Machine关联的shortName为“MachineState”的“ModeDeclarationGroupPrototype”，其属性type引用的功能组“ModeDeclarationGroup”未满足以下要求：

  1. 至少包含“Standby”、“Verify”、“Update”和“Reset”4个功能组状态（“ModeDeclaration”）。
  2. 至少包含“OfftoStartup”、“StandbytoStartup”、“StandbytoShutdown”、“StartuptoStandby”、“StartuptoShutdown”、“StartuptoRestart”、“StartuptoVerify”、“StartuptoUpdate”、“StartuptoReset”、“VerifytoStartup”、“VerifytoRestart”、“UpdatetoStartup”和“UpdatetoReset”13个状态转换关系（“ModeTransition”）。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 请根据可能原因，选择对应解决方案：
    • 根据报错提示，补充缺少的功能组状态（“ModeDeclaration”），并保存修改。
    • 根据报错提示，补充缺少的状态转换关系（“ModeTransition”），并保存修改。

报错信息

[mdc_constr_2109] The 'EnteredMode' and 'ExitedMode' values under the ModeTransition ('shortName') element must be different.

可能原因

同一个“ModeTransition”下，属性enteredState和exitState配置了相同状态。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 根据业务需求，修改目标“ModeTransition”下的enteredMode 或 exitedMode 属性引用值，保证它们引用不同的状态，并保存修改。

报错信息

[mdc_constr_2110] The 'Actions' value under the ModeTransition (‘shortName’) element must comply with the existing dependency or mutual exclusion relationship.

可能原因

“ModeTransition.action”的配置不满足已配置的依赖或互斥关系。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 根据目标“ModeTransition”下已配置的依赖和互斥关系，修改“ModeTransition.action”中不满足依赖或互斥关系的引用值，并保存修改。

报错信息

[mdc_constr_2111] The ModeDeclaration ('shortName') element cannot conflict with all other states under the mapping ModeDeclarationGroup ('shortName2').

可能原因

“ModeDeclaration ”(shortName)与“ModeDeclarationGroup ”(shortName2)下的“ModeDeclaration”存在互斥关系。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 根据业务需求，修改其“ModeConflict”引用的状态，直至它不互斥于功能组shortName2 的所有状态，并保存配置。

报错信息

[mdc_constr_2112] Under the same function group, the ModeDeclaration (‘shortName’) elements must directly or indirectly transit from the 'Off ModeDeclaration' element.

可能原因

目标Machine引用的功能组（“ModeDeclaration”）中，存在“ModeDeclaration”未配置使其可以到达“Off”状态的“ModeTransition”。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 根据业务需求，为目标“ModeDeclaration”配置“ModeTransition”，使其可以通过一个或多个“ModeTransition”到达“Off”状态，并保存修改。

报错信息[1]

[mdc_constr_2113] The 'functionGroups' states under the Machine ('machine') element cannot have circular dependencies, for example, 'Group1.A->Group2.B->Group1.A'.

报错信息[2]

[mdc_constr_2113] The 'functionGroups' states under the Machine ('machine') element cannot have circular dependencies, for example, 'Group2.B->Group4.D->Group1.A->Group2.B'.

可能原因

Machine引用的功能组（“ModeDeclaration”）中，存在循环依赖，如：Group1的A状态依赖于Group2的B状态，而Group2的B状态又依赖于Group1的A状态。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 根据实际报错选择如下解决方案修改并保存：
    • [1] 删除Group2.B对Group1.A状态的依赖配置，即删除Group2（“ModeDeclarationGroup”）.B（“ModeDeclaration”）下的“ModeDependency.Status”中加入的Group1.A。
    • [2] 删除Group1.A对Group2.B状态的依赖配置，即删除Group1（“ModeDeclarationGroup”）.A（“ModeDeclaration”）下的“ModeDependency.Status”中加入的Group2.B。

报错信息

[mdc_constr_2114] The referenced 'status' value of each 'ModeDependency' element under ModeDeclaration("shortName") must not be the same.

可能原因

在“ModeDeclaration”("a")中，存在了配置完全相同的状态依赖组。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 根据业务需求，修改目标“ModeDeclaration.ModeDependency.status”的引用值，保证“ModeDeclaration”下所有的“ModeDependency.status”引用值不完全相同，并保存修改。

报错信息

[mdc_constr_2115] If the ModeDeclarationGroup (machinestate) referenced by a machine is mutually exclusive, associated with, or dependent on other ModeDeclarationGroups (SampleState, ...), then the latter ModeDeclarationGroups must also be referenced by this machine.

可能原因

目标Machine引用的功能组（“ModeDeclarationGroup”）与其他功能组存在依赖、互斥或关联关系，但对应功能组没有在Machine中引用。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 将所有与目标功能组依赖、互斥或关联关系的功能组关联至目标Machine中，并保存配置。

报错信息

[mdc_constr_2116] If the ModeDeclarationGroup (MachineState) is dependent on, mutually exclusive with, or associated with other ModeDeclarationGroups (SampleState, ...), then the ModeDeclarationGroup can be referenced by a machine only once.

可能原因

在同一个“Machine”中，如果其中一个功能组与其他功能组存在依赖、关联或互斥关系，则此功能最多只能被“Instance”引用一次。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 根据业务需求，删除多余目标功能组与“Instance”的引用关系，并保存配置。

报错信息

[mdc_constr_2117] The ModeDeclarationGroup (ProcessState) whose Category is Process can not be configured under Machine.FunctionGroups.

可能原因

“Machine.FunctionGroup”引用了category属性值为“Process”的“ModeDeclarationGroup”。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 根据业务需求，修改“Machine.FunctionGroup”引用值，或者将引用的“ModeDeclarationGroup.category”属性值修改为“FunctionGroup”，并保存配置。

报错信息

[mdc_constr_2118] The Category attribute of a Mode TransitionTask shall be configured, and its value can only be PRE_PROCESS, POST_PROCESS, or ARBITRATE_PROCESS (case insensitive).

可能原因

“Mode TransitionTask”的“Category”必配，且只能为“PRE_PROCESS”、“POST_PROCESS”或“ARBITRATE_PROCESS”（大小写不敏感）。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 根据报错提示，找到“Mode TransitionTask”（Short Name）的“Category”，将其配置为“PRE_PROCESS”、“POST_PROCESS”或“ARBITRATE_PROCESS”。
  3. 保存修改。

报错信息

[mdc_constr_2119] Each value of the Category attribute of a Mode TransitionTask shall be unique.

可能原因

一个“Mode Transition”下“Mode TransitionTask”存在重复的“Category”。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 根据报错提示，在“Mode Transition”（Short Name）下，定位到存在重复“Category”的“Mode TransitionTask”，修改“Category”的值，以确保无重复值。
  3. 保存修改。

报错信息

[mdc_constr_2120] The Timeout attribute of a Mode TransitionTask shall be configured, and its values shall be in the (0,60000] range, in miliseconds.

可能原因

“Mode TransitionTask”的属性“Timeout”的值不在(0,60000]ms范围内。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 根据报错提示，在“Mode TransitionTask”（Short Name）下，定位到不符合要求的“Timeout”，确保其值在(0,60000]ms范围内。
  3. 保存修改。

报错信息

[mdc_constr_2121] The Short Name attribute of each Mode TransitionTask of a Mode Transition shall be set to a unique value.

可能原因

一个“Mode Transition”下存在Short Name不唯一的“Mode TransitionTask”。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 根据报错提示，在“Mode Transition”（Short Name）下，定位到不符合要求的“Mode TransitionTask”，确保其“Short Name”的值在当前“Mode Transition”下唯一。
  3. 保存修改。

报错信息

[mdc_constr_2130] When the category is set to Process under a ModeDeclarationGroup, the MddeCoflict, ModeDependency, and Actions attributes cannot be configured under this ModeDeclarationGroup.

可能原因

“ModeDeclarationGroup”的category配置为“Process”时，“ModeDeclarationGroup”下配置了“MddeCoflict”、“ ModeDependency”或“Actions”。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 将“ModeDeclarationGroup”下多余的“MddeCoflict”、“ModeDependency”或“Actions”删除，并保存修改。

报错信息

[mdc_constr_2131] In a project, the number of ModeDeclarationGroups in which the category value is FunctionGroup cannot exceed 32.

可能原因

在同一工程下，“category”属性选择为“FunctionGroup”的“ModeDeclarationGroup”元素超过了32个。

处理步骤
  1. 找到该工程下所有“category”属性选择为“FunctionGroup”的“ModeDeclarationGroup”元素，筛选出要保留的32个。
  2. 修改其余“ModeDeclarationGroup”元素的“category”属性值或者将其余的“ModeDeclarationGroup”元素删除，并保存修改。

报错信息

[mdc_constr_2132] The number of ModeDeclarations in the ModeDeclarationGroup whose category is FunctionGroup cannot exceed 32.

可能原因

一个“ModeDeclarationGroup”的“ModeDeclaration”个数超过了32个。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置（“ModeDeclarationGroup”）。
  2. 将当前“ModeDeclarationGroup”的“ModeDeclaration”个数删除至32个或以下，并保存修改。

报错信息

[mdc_constr_2133] ModeTransition.actions of ModeDeclarationGroup shall not reference ModeDeclaration of ModeDeclarationGroup whose shortName is MachineState.

可能原因

“ModeDeclarationGroup”的“ModeTransition.actions”引用了“shortName”为“MachineState”的“ModeDeclarationGroup”的“ModeDeclaration”。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置（“ModeDeclarationGroup”）。
  2. 删除“ModeDeclarationGroup”元素下“ModeTransition.actions”对“MachineState”的引用，并保存修改。

报错信息

[mdc_constr_2134] The ModeDeclaration referenced by the Actions property of the ModeTransition should be placed at the end.

可能原因

“ModeTransition.actions”引用了“MachineState”的“shortName”为“Reset”、“Restart”、“Shutdown”或“Standby”的“ModeDeclaration”，并且没有放在引用列表最后一个。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置（“ModeTransition”）。
  2. 选择“actions”属性，将相应的“ModeDeclaration”放在最后位置或者删除，并保存修改。

报错信息

[mdc_constr_2201] When the shortName of a ModeDeclarationGroupPrototype is MachineState, the shortName of the ModeDeclaration referenced by the Initial Mode of the ModeDeclarationGroup associated with this ModeDeclarationGroupPrototype shall be Startup. When the shortName of the ModeDeclarationGroupPrototype is not MachineState and the category of the ModeDeclarationGroup is set to Process, the shortName of the ModeDeclaration referenced by the Initial Mode of the ModeDeclarationGroup is shall be Off.

可能原因
  1. 当“ModeDeclarationGroupPrototype.shortName”属性值为“MachineState”时，对应的 “ModeDeclarationGroup.initialMode”未引用为“Startup”的状态的“ModeDeclaration”
  2. 当“ModeDeclarationGroupPrototype.shortName”属性值为非“MachineState”时，对应关联的“ModeDeclarationGroup.initialMode”引用值为非“Off”状态的“ModeDeclaration”，但“ModeDeclarationGroup.category”属性值为“Process”的情况除外。

处理步骤

  1. 双击对应的错误描述信息，定位至报错具体位置。

  2. 根据业务需求，将“ModeDeclarationGroup.Initial Mode”属性值配置为正确的状态（“ModeDeclaration”），并保存修改。

报错信息

[mdc_constr_2202] When the ShortName of a ModeDeclarationGroupPrototype is not set to MachineState, the ModeDeclarationGroup referenced by the Type attributed must contain a ModeDeclaration whose ShortName is set to Off (except when Category of the ModeDeclarationGroup is set to Process).

可能原因

“ModeDeclarationGroup”功能组对应关联的“ModeDeclarationGroupPrototype.shortName”属性值为非“MachineState”时，“ModeDeclarationGroup”内没有包含一个shortName值为“Off”的状态（“ModeDeclaration”），但“ModeDeclarationGroup.category”属性值为“Process”的情况除外。

处理步骤

  1. 双击对应的错误描述信息，定位至报错具体位置。

  2. 根据业务需求，将“ModeDeclarationGroup”功能组内添加一个shortName名称为“Off”的状态（“ModeDeclaration”），并保存修改。

报错信息

[mdc_constr_2203] For ModeTransition under ModeDeclarationGroup referenced by ModeDeclarationGroupPrototype, the Entered Mode and Exited Mode attributes can only be set to ModeDeclaration defined in ModeDeclarationGroup that ModeTransition belongs to.

可能原因
  1. “ModeTransition”下没有配置“Entered Mode”或“Exited Mode”属性。
  2. “ModeTransition”的“Entered Mode”或“Exited Mode”属性引用了非本功能组（“ModeDeclarationGroup”）内的状态（“ModeDeclaration”）。

处理步骤

  1. 双击对应的错误描述信息，定位至报错具体位置。

  2. 根据业务需求，将“ModeDeclarationGroup”功能组内添加一个shortName名称为“Off”的状态（“ModeDeclaration”），并保存修改。

报错信息

[mdc_constr_2204] If ShortName of ModeDeclarationGroupPrototype is set to MachineState, the associated ModeDeclarationGroup must contain a ModeTransition in which Entered Mode is set to Startup and Exited Mode is set to Off.

可能原因
“ModeDeclarationGroupPrototype”的“Short Name”值为“MachineState”时，其“Type”关联的“ModeDeclarationGroup”不存在一个满足以下要求的“ModeTransition”转换关系。
  • “ModeTransition”的“Entered Mode”属性配置为“Startup”。
  • “ModeTransition”的“Exited Mode”属性配置为“Off”。

处理步骤

  1. 双击对应的错误描述信息，定位至报错具体位置。

  2. 根据业务需求，在“ModeDeclarationGroup”下配置至少一个“ModeTransition”的转换关系，将“Entered Mode”设为“Startup”，且“Exited Mode”设为“Off”，并保存修改。

报错信息

[mdc_constr_2205] When a Process depends on ModeDeclaration of another Process through Process.modeDependentStartupConfig.executionDependency, this Process can depend on only the ModeDeclaration whose shortName is either Running or Terminated.

可能原因
  1. 目标“ExecutionDependency.ModeInprocessInstanceRef”下“TargetModeDeclaration”属性的引用值为非“Running”或“Teminated”的ModeDeclaration。
  2. 目标“ExecutionDependency.ModeInprocessInstanceRef”下“TargetModeDeclaration”属性引用的“ModeDeclaration”所属的“ModeDeclarationGroup”与其“ContextModeDeclarationGroupPrototype”属性引用的“ModeDeclarationGroupPrototype”属性“Type”引用的“ModeDeclarationGroup”不一致。

处理步骤

  1. 双击对应的错误描述信息，定位至报错具体位置。

  2. 根据业务需求修改“ModeInprocessInstanceRef”的配置，并保存修改。

报错信息

[mdc_constr_2206] In the same ModeDeclarationGroup 'shortName', the combination of Entered Mode and Exited Mode under ModeTransition ' shortName ' must be unique.

可能原因

在同一个“ModeDeclarationGroup”下，存在“EnteredMode”和“ExitedMode”属性的引用值完全相同的“ModeTransition”。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 修改目标“ModeTransition.enteredMode”或“ModeTransition.exitedMode”引用值，确保两属性引用值不完全相同，并保存修改。

报错信息

[mdc_constr_2207] An exception may occur if schedulingPolicy is set to schedulingPolicyFifo or schedulingPolicyRoundRobin but the schedulingPriority value is not in the range of 1 to 99.

可能原因

在同一个“StartupConfig”下，其属性schedulingPolicy配置为“SCHEDULING_POLICY_FIFO”或“SCHEDULING_POLICY_ROUND_ROBIN”时，schedulingPriority属性值不在[1,99]范围内。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 根据业务需求，将“StartupConfig.schedulingPolicy”值修改为“SCHEDULING-POLICY-OTHER”或将“StartupConfig.schedulingPriority”值修改至[1,99]范围内，并保存修改。

报错信息

[mdc_constr_2208] The contextModeDeclarationGroupPrototype and targetModeDeclaration attributes of the ModeInProcessInstanceRef or ModeInMachineInstanceRef under a Process must be configured.

可能原因

“Process”下的“ModeInProcessInstanceRef”或“ModeInMachineInstanceRef”的contextModeDeclarationGroupPrototype和targetModeDeclaration没有配置。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 为“ModeInProcessInstanceRef”或“ModeInMachineInstanceRef”配置contextModeDeclarationGroupPrototype和targetModeDeclaration，然后保存配置。

报错信息

[mdc_constr_2209] For the ModeInProcessInstanceRef or ModeInMachineInstanceRef aggregated under the StateDependentStartupConfig of a Process, its contextModeDeclarationGroupPrototype attribute must match its targetModeDeclaration attribute.

可能原因

对于“Process”下的“StateDependentStartupConfig”下聚合的“ModeInProcessInstanceRef”或“ModeInMachineInstanceRef”，其属性contextModeDeclarationGroupPrototype与targetModeDeclaration不匹配。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 配置“ModeInProcessInstanceRef”或“ModeInMachineInstanceRef”的属性targetModeDeclaration和contextModeDeclarationGroupPrototype，满足以下要求。
    • contextModeDeclarationGroupPrototype引用的“ProcessStateMachine.type”引用一个“ModeDeclarationGroup”。
    • targetModeDeclaration引用的“ModeDeclaration”是上述“ModeDeclarationGroup”的状态之一。
  3. 保存配置。

报错信息

[mdc_constr_2210] One Process {0} supports only one StateDependentStartupConfig.

可能原因

一个“Process”配置多个“StateDependentStartupConfig”。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 删除“Process”下多余的“StateDependentStartupConfig”，然后保存配置。

报错信息

[mdc_constr_2211] The Process {0} has a cyclic dependency. The cyclic relationship is {1}.

可能原因

“Process”存在循环依赖。

示例如下：

processA
      processStateMachineA
      stateDependentStartupConfigA
                  executionDependencyA
                          modeInProcessRef[contextModeDeclarationGroupPrototype->processStateMachineB]
processB
      processStateMachineB
      stateDependentStartupConfigB
                  executionDependencyB
                          modeInProcessRef[contextModeDeclarationGroupPrototype->processStateMachineA]

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 配置“Process”的“ExecutionDependency”下的“ModeInProcessInstanceRef”，确保引用的“Process”不存在循环依赖，然后保存配置。

报错信息【1】

[mdc_constr_2220] If cpuUsageCategory is set to ONE or is not set, the cpuUsage value range is [1, 100].

报错信息【2】

[mdc_constr_2220] If cpuUsageCategory is set to ALL, the cpuUsage value range is[1, 232).

可能原因
  • 【1】：“ResourceGroup.cpuUsageCategory”没有赋值或者为“ONE”时，“ResourceGroup.cpuUsage”的值为“0”或者大于“100”的值。
  • 【2】：“ResourceGroup.cpuUsageCategory”为“ALL”时，“ResourceGroup.cpuUsage”的值为“0”.

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置（“ResourceGroup”）。
  2. 根据实际报错原因选择如下解决方案，并保存修改。
    • 【1】：将“ResourceGroup.cpuUsage”配置为[1,100]范围内。
    • 【2】：将“ResourceGroup.cpuUsage”配置为[1, 232)范围内。

报错信息

[mdc_constr_2221] The memUsage value range is [1, 232) .

可能原因

“ResourceGroup.memUsage”配置为“0”。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置“ResourceGroup”。
  2. 为“ResourceGroup.memUsage”配置为[1, 232)，保存配置。

报错信息

[mdc_constr_2223] The ShortName of the Resource Groups Under the same Machine shall be unique.

可能原因

在一个Machine下方出现了两个“shortName”相同的“ResourceGroup”。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置（“ResourceGroup”）。
  2. 修改“ResourceGroup”的“shortName”或删除多余的“ResourceGroup”，使其在该Machine下方没有相同“shortName”的“ResourceGroup”，并保存修改 。

报错信息

[mdc_constr_2301] The Executable associated with CryptoKeySlotToPortPrototypeMapping must have only one CryptoKeyProvider.

可能原因

一个“Executable”被多个“CryptoKeySlotToPortPrototypeMapping”引用，而这些“CryptoKeySlotToPortPrototypeMapping”关联的keySlot都来源于不同的“CryptoKeyProvider”。

处理步骤

  1. 双击对应的错误描述信息，定位至报错具体位置。

  2. 根据业务需求将引用了同一个“Executable”的“CryptoKeySlotToPortPrototypeMapping”下的keySlot都关联为来自同一个“CryptoKeyProvider”下的“KeySlot”，并保存修改。

报错信息

[mdc_constr_2302] The CryptoKeySlot must be referenced by one and only one CryptoKeySlotToPortPrototypeMapping.

可能原因

“CryptoKeySlot”“XXX”没有被“CryptoKeySlotToPortPrototypeMapping”引用，或“CryptoKeySlot”“XXX”被多个“CryptoKeySlotToPortPrototypeMapping”引用。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 根据业务需求选择如下解决方案，并保存修改。
    • 为“CryptoKeySlot”“XXX”关联一个“CryptoKeySlotToPortPrototypeMapping”，并将“CryptoKeySlotToPortPrototypeMapping.keySlot”取值为该“CryptoKeySlot”“XXX”。
    • 修改报错“CryptoKeySlotToPortPrototypeMapping.keySlot”属性值，保证不引用相同的“CryptoKeySlot”。

报错信息

[mdc_constr_2303] If Dependency Slot of CryptoKeySlotInterface is not empty, the value of Dependency Type must be the same as the value of Crypto Object Type of Dependency Slot.

可能原因

在“CryptoKeySlotInterface.dependencySlot”取值不为空情况下，“CryptoKeySlotInterface.dependencyType”属性值与“dependencySlot”引用的“CryptoKeySlot下的cryptoObjectType”属性值不相同。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 查看报错位置的“CryptoKeySlotInterface.dependencySlot”属性值，并找出引用了此属性的“CryptoKeySlotToPortPrototypeMapping”。
  3. 在找到的“CryptoKeySlotToPortPrototypeMapping”下，查看子元素“PortPrototypeInExecutableInstanceRef”的targetPortPrototype属性的引用值（“RPortPrototype”）。
  4. 在找到的“RPortPrototype”中，查看其requiredInterface属性的引用值（“ServiceInterface”）。
  5. 在找到的“ServiceInterface”中，查看其cryptoObjectType的属性值，此处以“ObjectType”为例。
  6. 将“CryptoKeySlotInterface.dependencyType”属性值修改为“ObjectType”。
  7. 保存修改。

报错信息

[mdc_constr_2304] One RPortPrototype can be associated with only one CryptoKeySlot.

可能原因

一个“RPortPrototype”“XXX”被多个“CryptoKeySlotToPortPrototypeMapping”引用，且这些“CryptoKeySlotToPortPrototypeMapping”关联了多个“CryptoKeySlot”。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 保证“RPortPrototype”“XXX”与“CryptoKeySlotToPortPrototypeMapping”的逐一对应关系，根据业务需求选择如下解决方案，并保存修改。
    • 删除多余的引用了“RPortPrototype”“XXX”的“CryptoKeySlotToPortPrototypeMapping”，只保留一个。
    • 将引用了“RPortPrototype”“XXX”的多个“CryptoKeySlotToPortPrototypeMapping”修改为分被引用不同的“RPortPrototype”。

报错信息[1]

[mdc_constr_2305] When the Crypto Alg Type attribute of CryptoKeySlotInterface is set to an asymmetric key algorithm, the Crypto Object Type attribute can only be set to PUBLIC-KEY or PRIVATE-KEY.

报错信息[2]

[mdc_constr_2305] When the Crypto Alg Type attribute of CryptoKeySlotInterface is set to a symmetric key algorithm, the Crypto Object Type attribute can only be set to SYMMETRIC KEY.

可能原因

“CryptoKeySlotInterface”下配置的算法类型（cryptoAlgType）与配置的加密对象类型（cryptoObjectType）不对应。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 根据业务需求，保证报错“CryptoKeySlotInterface”下的 cryptoObjectType 属性值和 cryptoAlgType 属性值的配置遵循如下规则：
    • 当 cryptoAlgType 配置为对称密钥算法时，cryptoObjectType 只能配置为“SymmetricKey”。
    • 当 cryptoAlgType 为非对称密钥算法时，cryptoObjectType 只能配置为“PublicKey”或“PrivateKey”。
  3. 保存修改。

报错信息

[mdc_constr_2306] The value of cryptoAlgType must correspond to the value of slotCapacity.

可能原因

“CryptoKeySlotInterface”下配置的算法类型（cryptoAlgType）与配置的密钥槽数量（slotCapacity）数值不匹配。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 根据业务需求，修改报错“CryptoKeySlotInterface”下的 slotCapacity 属性值或 cryptoAlgType 属性值，保证两者匹配，并保存修改。

报错信息

[mdc_constr_2307] The Target Port Prototype attribute of the PortPrototypeInExecutableInstanceRef sub-element under CryptoKeySlotToPortPrototypeMapping must reference RPortPrototype.

可能原因

“CryptoKeySlotToPortPrototypeMapping”子元素“PortPrototypeInExecutableInstanceRef”的属性targetPortPrototype没有引用“RPortPrototype”元素。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 配置“PortPrototypeInExecutableInstanceRef.targetPortPrototype”属性值，引用“RPortPrototype”元素。若不存在已定义“RPortPrototype”，需要先配置一个“AdaptiveApplicationSwComponentType.RPortPrototype”，并保存修改。

报错信息

[mdc_constr_2308] The required Interface attribute of RPortPrototype associated with CryptoKeySlotToPortPrototypeMapping must reference CryptoKeySlotInterface.

可能原因

“CryptoKeySlotToPortPrototypeMapping”“XXX”关联的“RPortPrototype”元素的属性requiredInterface没有引用“CryptoKeySlotInterface”元素。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 修改“RPortPrototype.requiredInterface”引用“值为CryptoKeySlotInterface”元素。若不存在已定义“CryptoKeySlotInterface”，需先配置一个“CryptoKeySlotInterface”，并保存修改。

报错信息

[mdc_constr_2309] If providerType under CryptoProvider is not empty, then its value must be KMSCryptoProvider.

可能原因

“CryptoProvider.providerType”取值为非“KMSCryptoProvider”。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 将“CryptoProvider.providerType”属性值修改为“KMSCryptoProvider”，并保存修改。

报错信息

[mdc_constr_2310] The uuid field under CryptoKeySlot is mandatory. Its value consists of 36 characters in the format of xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (8-4-4-4-12). The value of x can be 0 to 9 or a to f.

可能原因

“CryptoKeySlot.uuid”取值为非法格式。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 修改属性“CryptoKeySlot.uuid”值的格式，正确格式为：“xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx”（字符数规则为“8-4-4-4-12”，x只能取0~9或a~f之间的值），如“22222222-gggg-a5b6-1234-a1b2ccddabcd”，并保存修改。

报错信息

[mdc_constr_2311] The uuid value of CryptoKeySlot must be globally unique.

可能原因

“CryptoKeySlot.uuid”取值非全局唯一。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 将“CryptoKeySlot.uuid”属性值修改为全局唯一值，并保存修改。

报错信息

[mdc_constr_2313] The value of CryptoCertificate.isPrivate must be the same as that of CryptoCertificateInterface.isPrivate.

可能原因

“CryptoCertificate.isPrivate”与“CryptoCertificateInterface.isPrivate”配置的值不一致。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置（“CryptoCertificateToPortPrototypeMapping”）。
  2. 配置“CryptoCertificate.isPrivate”与“CryptoCertificateInterface.isPrivate”的值一致，并保存修改。

报错信息

[mdc_constr_2314] The value of CryptoCertificateToPortPrototypeMapping.writeAccess must be the same as that of CryptoCertificateInterface.writeAccess.

可能原因

“CryptoCertificateToPortPrototypeMapping.writeAccess”与“CryptoCertificateInterface.writeAccess”配置的值不一致。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置（“CryptoCertificateToPortPrototypeMapping”）。
  2. 配置“CryptoCertificateToPortPrototypeMapping.writeAccess”与“CryptoCertificateInterface.writeAccess”的值一致，并保存修改。

报错信息

[mdc_constr_2316] When slotType of a CryptoKeySlot is set to APPLICATION, the CryptoKeySlot can be associated with only one process.

可能原因

当“CryptoKeySlot”的“slotType”属性取值为“APPLICATION”时，该“CryptoKeySlot”被多个process关联。

处理步骤

1.双击对应的错误描述信息，定位至所提示的错误项的具体位置（“CryptoKeySlot”）。

2.配置“slotType”属性取值为“APPLICATION”的“CryptoKeySlot”仅被一个process关联，并保存修改。

报错信息

[mdc_constr_2317] The same process is associated with the same CryptoKeySlot through different CryptoKeySlotToPortPrototypeMappings, and the value of slotType of the CryptoKeySlot is APPLICATION.

可能原因

同一个process通过不同映射关联到相同的“CryptoKeySlot”，且该“CryptoKeySlot”的“slotType”属性取值为“APPLICATION”。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置（“CryptoKeySlot”）。
  2. 配置单个process只通过一条映射关联到“slotType”属性取值为“APPLICATION”的“CryptoKeySlot”，并保存修改。

报错信息

[mdc_constr_2401] In PersistencyRedundancyMOutOfN, the relationship between M and N must meet the following requirements: N ≥ M, M ≥ N/2, M > 0, and N <= 5.

可能原因

“PersistencyRedundancyMOutOfN”下配置M属性值和N属性值不符合条件：M和N都为整数，且满足0 < N ≤ 5和N/2 ≤ M ≤ N。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 修改“PersistencyRedundancyMOutOfN”下的属性M或N的值，使其符合“M和N都为整数，且满足0 < N ≤ 5和N/2 ≤ M ≤ N”的条件，并保存修改。

报错信息[1]

[mdc_constr_2402] The filename of 'PersistencyFile/PersistencyFileproxy' can contain up to 255 characters, consisting of only digits (0-9), uppercase letters (A-Z), lowercase letters (a-z), hyphens (-), dot(.), and underscores (_).

报错信息[2]

[mdc_constr_2402] The uri of 'PersistencyFileArray' can contain only digits (0-9), uppercase letters (A-Z), lowercase letters (a-z), hyphens (-), dot(.), underscores (_), and slash (/). The total value length of 'PersistencyFileArray.uri' and 'PersistencyFile.filename' cannot exceed 4096 characters.

报错信息[3]

[mdc_constr_2402] The uri of 'PersistencyKeyValueDatabase' can contain up to 4096 characters, consisting of only digits (0-9), uppercase letters (A-Z), lowercase letters (a-z), hyphens (-), dot(.), underscores (_), and slash (/).

可能原因

“PersistencyFileProxy.filename/PersistencyFile.filename”（文件名）或“PersistencyFileArray.uri/PersistencyKeyValueDatabase.uri”（文件路径）未按要求设置。具体对应要求如下。

  • [1]：“PersistencyFileProxy.filename”值和“PersistencyFile.filename”值必须配置为数字、英文字母、短横线（-）、英文逗号（,）、英文句号（.）或下划线（_）。且最多不超过255个字符。
  • [2]：“PersistencyFileArray.uri”值必须配置为数字、英文字母、短横线（-）、英文逗号（,）、英文句号（.）、下划线（_）或正斜线（/），（“PersistencyFileArray.uri”+“PersistencyFile.filename”）配置的路径字符之和不超过4096个字符。
  • [3]：“PersistencyKeyValueDatabase.uri”值必须配置为数字、英文字母、短横线（-）、英文逗号（,）、英文句号（.）、下划线（_）或正斜线（/），且最多不超过4096个字符。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 根据业务需求，参考可能原因中的要求，修改不符合要求的filename或uri属性值，并保存修改。

报错信息

[mdc_constr_2403] The structure and type of PersistencyKeyValuePair.initValue should be consistent with those of PersistencyKeyValuePair.ValueDataType.

可能原因
  • 原因1：“PersistencyKeyValuePair.ValueDataType”引用了除“VALUE”、“ARRAY”、“STRUCTURE”、“STRING”、“ASSOCIATIVE_MAP”、“VECTOR”、或“TYPE_REFRENCE”、之外的数据类型。
  • 原因2：“PersistencyKeyValuePair.initValue”的结构和类型没有与“PersistencyKeyValuePair.ValueDataType”的结构和类型保持一致。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 修改“PersistencyKeyValuePair.ValueDataType”引用的数据类型或“PersistencyKeyValuePair.initValue”引用值，使其符合如下要求，请按实际场景处理。
    • “PersistencyKeyValuePair.ValueDataType”只能引用数据类型“VALUE”、“ARRAY”、“STRUCTURE”、“STRING”、“ASSOCIATIVE_MAP”、“VECTOR”、或“TYPE_REFRENCE”，当“PersistencyKeyValuePair.ValueDataType”引用了定义为“TYPE_REFRENCE”的数据类型时，引用规则同理。
    • 当“PersistencyKeyValuePair.ValueDataType”引用了定义为“VALUE”的数据类型，需要满足如下条件：
      • 其shortName只能配置为bool、double、float、int8_t、int16_t、int32_t、int64_t、uint8_t、uint16_t、uint32_t或uint64_t。
      • “PersistencyKeyValuePair.initValue”类型需要配置为“NumericalValueSpecification”，且配置的数值必须在对应数据类型的范围内，bool：true/false/0/1，double：[-1.7E-308,1.7E+308]，float：[-3.4E+38,3.4E+38]，int8_t：[-128,127]，int16_t：[-32768,32767]，int32_t：[-2147483648,2147483647]，int64_t：[-9223372036854775808,9223372036854775807]，uint8_t：[0,255]，uint16_t：[0,65535]，uint32_t：[0,4294967295]，uint64_t：1162[0,18446744073709551615]。
    • 当“PersistencyKeyValuePair.ValueDataType”引用了定义为“STRING”的数据类型，“PersistencyKeyValuePair.initValue”类型需要配置为“TextValueSpecification”。
    • 当“PersistencyKeyValuePair.ValueDataType”引用了定义为“ARRAY”的数据类型，“PersistencyKeyValuePair.initValue”类型需要配置为“ArrayValueSpecification”，且“PersistencyKeyValuePair.initValue”下配置的元素个数和类型必须与引用的数据类型的arraySize值和类型对应保持一致。
    • 当“PersistencyKeyValuePair.ValueDataType”引用了定义为“STRUCTURE”的数据类型，“PersistencyKeyValuePair.initValue”类型需要配置为“RecordValueSpecification”，且“PersistencyKeyValuePair.initValue”下配置的元素个数和shortName必须与结构体（STRUCTURE）保持一致。
    • 当“PersistencyKeyValuePair.ValueDataType”引用了定义为“VECTOR”的数据类型，“PersistencyKeyValuePair.initValue”类型需要配置为“ArrayValueSpecification”，且“PersistencyKeyValuePair.initValue”下配置的类型必须与引用的数据类型保持一致。
    • 当“PersistencyKeyValuePair.ValueDataType”引用了定义为“ASSOCIATIVE_MAP”的数据类型，“PersistencyKeyValuePair.initValue”类型需要配置为“ApplicationAssocMapElementValueSpecification”，且“PersistencyKeyValuePair.initValue”下配置的每个键值（Key-Value）对，必须与引用的数据类型保持一致。
  3. 保存修改。

报错信息

[mdc_constr_2501] When loggingBehavior of Executable is set to 'USES-LOGGING', the 'logTraceProcessId' of the Process "process"  associated with the Executable must be set. The value contains 1 to 4 characters, only including '_|0-9|A-Z|a-z', and cannot start with '0-9'.

可能原因

当Executable.loggingBehavior取值为USES-LOGGING时，关联该Executable的Process元素logTraceProcessId属性值书写格式错误或属性logTraceProcessId/logTraceDefaultLogLevel/logTraceLogModes没有设置。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 根据实际报错原因选择如下解决方案：
    • 将“Executable.loggingBehavior”取值改为“DOES-NOT-USES-LOGGING”。
    • 确保相关联“Process”下的属性logTraceProcessId、logTraceDefaultLogLevel或logTraceLogModes都有设置，且logTraceProcessId属性值符合正确书写格式：只能配置为长度1~4字符的字母、数字或下划线，且必须以字母或下划线开头。
  3. 保存修改。

报错信息

[mdc_constr_2502] If the value of logTraceLogModes of the Process contains ''FILE'', the logTraceFilePath of Process “process” must be set to an absolute Linux path.

可能原因

在目标“Process”元素下logTraceLogModes属性值包括FILE时，没有配置logTraceFilePath属性，或logTraceFilePath配置的路径不是绝对路径。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 根据实际报错原因选择如下解决方案：
    • 删除“Process.logTraceLogModes”中配置的“FILE”。
    • 检查“Process”下的logTraceFilePath和logTraceFilePath属性值，需要输入Linux绝对路径。
  3. 保存修改。

报错信息

[mdc_constr_2601] The value of 'shortName' configured under 'EthernetCommunicationConnector' to which 'SomeipServiceInstanceToMachineMapping.communicationConnector' points must contain one and only one unicast IPv4 address and one multicast IPv4 address.

可能原因

“SomeipServiceInstanceToMachineMapping.communicationConnector”属性指向的“EthernetCommunicationConnector”未配置单播或多播IPv4地址，或多配置了单播或多播IPv4地址。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 根据业务需求修改，保证“EthernetCommunicationConnector”下仅包含一个单播IPv4地址和一个多播IPv4地址，并保存修改。

报错信息

[mdc_constr_2604] When more than one 'SomeipServiceInstanceToMachineMapping.communicationConnector' elements point to the same 'EthernetCommunicationConnector', the 'InitialDelayMaxValue', 'InitialDelayMinValue', 'InitialRepetitionsBaseDelay', and 'InitialRepetitionsMax' values must be the same for the 'InitialOfferBehavior' attribute of the (SomeipSdServerServiceInstanceConfig)'shortName' referenced under 'ProvidedSomeipServiceInstance' that is referenced by the 'SomeipServiceInstanceToMachineMapping.serviceInstances' element and the 'InitialFindBehavior' attribute of the (SomeipSdClientServiceInstanceConfig)'shortName' referenced under 'RequiredSomeipServiceInstance' that is referenced by the 'SomeipServiceInstanceToMachineMapping.serviceInstances' element.

可能原因

“SomeipServiceInstanceToMachineMapping.communicationConnector”指向的“ProvidedSomeipServiceInstance.SomeipSdServerServiceInstanceConfig”和“RequiredSomeipServiceInstance.SomeipSdClientServiceInstanceConfig”下配置的子元素“InitialOfferBehavior.InitialSdDelayConfig”中4个属性值没有对应一致。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 根据业务需求修改服务端或客户端“InitialOfferBehavior.InitialSdDelayConfig”中4个属性值，保证两端对应属性值一致，并保存修改。

报错信息[1]

[mdc_constr_2605] The 'VariableDataPrototype' cannot be referenced by multiple TransformationPropsToServiceInterfaceElementMappings ('transSomeipToServiceInterfaceMapping2,transSomeipToServiceInterfaceMapping').

报错信息[2]

[mdc_constr_2605] The 'ClientServerOperation' cannot be referenced by multiple TransformationPropsToServiceInterfaceElementMappings ('transSomeipToServiceInterfaceMapping2,transSomeipToServiceInterfaceMapping').

报错信息[3]

[mdc_constr_2605] The 'Field' cannot be referenced by multiple TransformationPropsToServiceInterfaceElementMappings ('transSomeipToServiceInterfaceMapping2,transSomeipToServiceInterfaceMapping').

可能原因
  • [1] “VariableDataPrototype”被多个“TransformationPropsToServiceInterfaceElementMapping”引用。
  • [2] “ClientServerOperation”被多个“TransformationPropsToServiceInterfaceElementMapping”引用。
  • [3] “Field”被多个“TransformationPropsToServiceInterfaceElementMapping”引用。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示报错元素的具体位置。
  2. 删除多余“TransformationPropsToServiceInterfaceElementMapping”中对“VariableDataPrototype”、“ClientServerOperation”或“Field”的引用，确保只有一个“TransformationPropsToServiceInterfaceElementMapping”引用了“VariableDataPrototype”、“ClientServerOperation”或“Field”，并保存修改。

报错信息

[mdc_constr_2606] In the PortInterfaceElementInImplementationDatatypeRef section, the values configured by targetDataPrototype ('shortName') must be able to be located by using the values configured by rootDataPrototype and contextDataPrototype.

可能原因

“PortInterfaceElementInImplementationDatatypeRef”配置了targetDataPrototype，但通过“PortInterfaceElementInImplementationDatatypeRef”下的属性rootDataPrototype和contextDataPrototype，无法定位到targetDataPrototype。

  • 示例场景：对于以下结构体，rootDataPrototype设置为“event”。
      event
   type: structure
structure
   sub1/innerStructure
        innerSub1/INT8
        innerSub2/String
   sub2/bool
  • 示例说明：若targetDataPrototype设置为“innerSub1”，则contextDataPrototype必须设置为“structure/sub1”。
须知：

contextDataPrototype是有序的。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 修改“PortInterfaceElementInImplementationDatatypeRef”的属性rootDataPrototype和contextDataPrototype，确保通过这两个属性，可定位到targetDataPrototype，然后保存配置。

报错信息

[mdc_constr_2610] The value of the ServiceInstanceToSignalMapping.serviceInstance can only be the "serviceInstance" of the SOME/IP.

可能原因

“ServiceInstanceToSignalMapping.serviceInstance”引用了“ProvidedSomeipServiceInstance”以外的元素。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 配置“ServiceInstanceToSignalMapping”的serviceInstance，为其引用“ProvidedSomeipServiceInstance”，然后保存配置。

报错信息

[mdc_constr_2611] The ISignalIPdu can contain only one ISignal whose ISignal.SystemSignal.dynamicLength value is true.

可能原因

“ISignalIPdu”下存在多个“ISignal.SystemSignal.dynamicLength”值为“true”的“ISignal”。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 配置“ISignalIPdu”，确保其只包含一个“ISignal.SystemSignal.dynamicLength”值为“true”的“ISignal”，然后保存配置。

报错信息

[mdc_constr_2612] For an ISignal under an ISignalIPdu, if any of the ISignal.SystemSignal.dynamicLengths whose value is true exists, the value of the ISignalIPdu.hasDynamicLength shall be true.

可能原因

“ISignalIPdu”下存在“ISignal.SystemSignal.dynamicLength”值为“true”，而“ISignalIPdu.hasDynamicLength”的值为“false”。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 配置“ISignalIPdu.hasDynamicLength”的值为“true”，然后保存配置。

报错信息

[mdc_constr_2613] For ISignals under an ISignalIPdu, if each value of the ISignal.SystemSignal.dynamicLength is false, the ISignalIPdu.hasDynamicLength shall be set to false.

可能原因

“ISignalIPdu”下的所有“ISignal.SystemSignal.dynamicLength”的值为“false”，而“ISignalIPdu.hasDynamicLength”的值为“true”。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 配置“ISignalIPdu.hasDynamicLength”的值为“false”，然后保存配置。

报错信息

[mdc_constr_2614] When the ISignal.SystemSignal.dynamicLength is set to true, the ISignal.iSignalType shall be set to ARRAY.

可能原因

“ISignal.SystemSignal.dynamicLength”为“true”时，“ISignal.iSignalType”不为“ARRAY”。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 配置“ISignal.iSignalType”为“ARRAY”，然后保存配置。

报错信息

[mdc_constr_2615] When the ISignal.iSignalType is set to ARRAY, the values of the ISignalToIPduMapping.startPosition and ISignal.length shall be an integer multiple of 8.

可能原因

“ISignal.iSignalType”值为“ARRAY”时，“ISignalToIPduMapping.startPosition”或“ISignal.length”的值不能被8整除。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 配置“ISignalToIPduMapping.startPosition”和“ISignal.length”的值，确保其均能被8整除，然后保存配置。

报错信息

[mdc_constr_2616] A PortInterfaceElementInImplementationDatatypeRef.rootDataPrototype shall reference the Event, Method or Field of the ServiceInterface referenced by a ServiceInstanceToSignalMapping.serviceInstance.

可能原因

“PortInterfaceElementInImplementationDatatypeRef”的属性rootDataPrototype的引用值，不是“ServiceInstanceToSignalMapping.serviceInstance”引用的“ServiceInterface”下的Event、Method或Field。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 在“PortInterfaceElementInImplementationDatatypeRef”下，设置属性rootDataPrototype，确保该引用值为“ServiceInstanceToSignalMapping.serviceInstance”关联的“ServiceInterface”下的Event、Method或Field，然后保存配置。

报错信息

[mdc_constr_2617] For a PortInterfaceElementInImplementationDatatypeRef, the "targetDataPrototype" shall reference the data type referenced by the Event, Method or Field, and the preceding Event, Method or Field shall be referenced by the "rootDataPrototype".

可能原因

“PortInterfaceElementInImplementationDatatypeRef”的属性targetDataPrototype的引用值，不是rootDataPrototype的引用值（Event、Method或Field）下关联的数据类型。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 在“PortInterfaceElementInImplementationDatatypeRef”下，设置属性targetDataPrototype，确保该引用值为rootDataPrototype的引用值（Event、Method或Field）下关联的数据类型，然后保存配置。

报错信息

[mdc_constr_2618] The Length and HasDynamicLength attributes are mandatory under an ISignalPdu.

可能原因

“ISignalPdu”下的“length”或“hasDynamicLength”没有配置。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 为“ISignalPdu”配置“length”或“hasDynamicLength”，并保存配置。

报错信息[1]

[mdc_constr_4001] The value of 'DiagnositicSession.P2ServerMax' is not within the range (0, 65.535] (unit: second) or the precision exceeds 0.001.

报错信息[2]

[mdc_constr_4001] The value of 'DiagnositicSession.P2StarServerMax' is not within the range (0, 655.35] (unit: second) or the precision exceeds 0.01.

可能原因
  • [1]“DiagnositicSession.P2ServerMax”的值为0或者大于65.535；“DiagnositicSession.P2ServerMax”的值小数位数为4位或者更多，例如1.1111。
  • [2]“DiagnositicSession.P2StarServerMax”的值为0或者大于655.35；“DiagnositicSession.P2StarServerMax”的值小数位数为3位或者更多，例如1.111。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 根据实际报错原因选择如下解决方案，并保存配置。
    • [1]：“DiagnositicSession.P2ServerMax”配置为2.001。
    • [2]：“DiagnositicSession.P2StarServerMax”配置为2.11。

报错信息

[mdc_constr_4003] The DiagnosticDataIdentifier.id is mandatory. Its value range is (0, 65535] and shall be globally unique.

可能原因
  1. “DiagnosticDataIdentifier.id”配置的值为0或者大于65535。
  2. 多个“DiagnosticDataIdentifier.id”配置了相同的值。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置（PosistiveIntegerValueVariationPoint.mixedText）。
  2. 修改报错的“DiagnosticDataIdentifier.id”值，保证其值在（0， 65535]且全局唯一，并保存配置。

报错信息

[mdc_constr_4004] Each file transfer diagnosis service class can be associated with only a unique instance.

可能原因

文件传输诊断服务类关联了多个instance。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 重新关联目标文件传输诊断服务类下的instance，保证每个文件传输诊断服务类关联了不同的instance，并保存修改。

报错信息

[mdc_constr_4005] The 'DiagnosticReadDTCInformation.category' value is not a given option.

可能原因

“DiagnosticReadDTCInformation.category”值不在指定选项内。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 根据提示，将“DiagnosticReadDTCInformation.category”值修改为提示选项，并保存修改。

报错信息

[mdc_constr_4007] The value of 'DiagnosticSecurityAccess.requestSeedId' must be an odd number within the range of [1, 127].

可能原因

“DiagnosticSecurityAccess.requestSeedId”值非[1,127]内的奇数。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 根据业务需求，将“DiagnosticSecurityAccess.requestSeedId”值修改为[1,127]内的奇数，并保存修改。

报错信息[1]

[mdc_constr_4008] Under 'DiagnosticEventToDebounceAlgorithmMapping', one 'diagnosticEvent' corresponds to only one 'debounceAlgorithm'.

报错信息[2]

[mdc_constr_4008] Under 'DiagnosticEventToTroubleCodeUdsMapping', one 'diagnosticEvent' corresponds to only one 'troubleCodeUds'.

报错信息[3]

[mdc_constr_4008] Under 'DiagnosticEventToEnableConditionGroupMapping', one 'diagnosticEvent' corresponds to only one 'enableConditionGroup'.

报错信息[4]

[mdc_constr_4008] Under 'DiagnosticEventToOperationCycleMapping', one 'diagnosticEvent' corresponds to only one 'operationCycle'.

可能原因
  • [1]：在同一个“DiagnosticEventToDebounceAlgorithmMapping”下，一个diagnosticEvent对应了多个debounceAlgorithm。
  • [2]：在同一个“DiagnosticEventToTroubleCodeUdsMapping”下，一个diagnosticEvent对应了多个troubleCodeUds。
  • [3]：在同一个“DiagnosticEventToEnableConditionGroupMapping”下，一个diagnosticEvent对应了多个enableConditionGroup。
  • [4]：在同一个“DiagnosticEventToOperationCycleMapping”下，一个diagnosticEvent对应了多个operationCycle。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 修改目标diagnosticEvent的配置，保证只对应一个对应元素，并保存修改。

报错信息[1]

[mdc_constr_4009] A 'DiagnosticTroubleCodeProps' element can have at most one 'DiagnosticDataIdentifierSet' attribute.

报错信息[2]

[mdc_constr_4009] A 'DiagnosticTroubleCodeProps' element can have at most one 'FreezeFrame' attribute.

可能原因
  • [1]：一个“DiagnosticTroubleCodeProps”配了多个diagnosticDataIdentifierSet属性。
  • [2]：一个“DiagnosticTroubleCodeProps”配了多个freezeFrame属性。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 根据业务需求，删除多余的diagnosticDataIdentifierSet或freezeFrame属性，并保存修改。

报错信息

[mdc_constr_4010] The value range of the DiagnosticExtendedDataRecord.recordNumber is [1, 253] and the value shall be globally unique.

可能原因
  1. “DiagnosticExtendedDataRecord.recordNumber”配置的值为0或者大于253。
  2. 多个“DiagnosticExtendedDataRecord”的“recordNumber”配置的值相同。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置（PosistiveIntegerValueVariationPoint.mixedText）。
  2. 将“DiagnosticExtendedDataRecord.recordNumber”配置为[1， 253]且全局唯一，并保存配置。

报错信息

[mdc_constr_4012] Only one 'DiagnosticDataIdentifier' attribute can be set to 'True'.

可能原因

存在多个值为“TRUE”的“DiagnosticDataIdentifier”。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 根据业务需求，删除多余值为““TRUE””的“DiagnosticDataIdentifier”或修改“DiagnosticDataIdentifier”取值，保证只存在一个值为“TRUE”的“DiagnosticDataIdentifier”，并保存修改。

报错信息[1]

[mdc_constr_4013] One 'enableCondition' can map only one 'Port'.

报错信息[2]

[mdc_constr_4013] One 'clearCondition' can map only one 'Port'.

报错信息[3]

[mdc_constr_4013] One 'DID' can map only one 'Port'.

报错信息[4]

[mdc_constr_4013] One 'Event' can map only one 'Port'

报错信息[5]

[mdc_constr_4013] One 'OperationCycle' can map only one 'Port'.

报错信息[6]

[mdc_constr_4013] One 'DiagnosticRoutineControl' can map only one 'Port'.

报错信息[7]

[mdc_constr_4013] One 'DiagnosticSecurityLevel' can map only one 'Port'.

可能原因
  • [1]：一个enableCondition映射了多个Port。
  • [2]：一个clearCondition映射了多个Port。
  • [3]：一个did映射了多个Port。
  • [4]：一个event映射了多个Port。
  • [5]：一个operationCycle映射了多个Port。
  • [6]：一个diagnosticRoutineControl映射了多个Port。
  • [7]：一个diagnosticSecurityLevel映射了多个Port。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 根据业务需求，删除多余的Port配置，或修改映射关系，保证一个元素对应映射一个Port，并保存修改。

报错信息

[mdc_constr_4101] The value range of 'DiagnosticCommonPropsConditional.maxNumberOfRequestCorrectlyReceivedResponsePending' must be [1,255].

可能原因

“DiagnosticCommonPropsConditional.maxNumberOfRequestCorrectlyReceivedResponsePending”的值不在取值范围内。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 将“DiagnosticCommonPropsConditional.maxNumberOfRequestCorrectlyReceivedResponsePending”配置为[1，255]，并保存配置。

报错信息

[mdc_constr_4102] The value range of 'DiagEventDebounceCounterBased.counterDecrementStepSize' must be (0,232).

可能原因

“DiagEventDebounceCounterBased.counterDecrementStepSize”值不在取值范围内。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 将“DiagEventDebounceCounterBased.counterDecrementStepSize”配置为（0，232），并保存配置。

报错信息

[mdc_constr_4103] The value range of 'DiagEventDebounceCounterBased.counterFailedThreshold' must be (-231,231).

可能原因

“DiagEventDebounceCounterBased.counterFailedThreshold”值不在取值范围内。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 将“DiagEventDebounceCounterBased.counterFailedThreshold”配置为（-231，231），并保存配置。

报错信息

[mdc_constr_4104] The value range of 'DiagEventDebounceCounterBased.counterIncrementStepSize' must be (0,232).

可能原因

“DiagEventDebounceCounterBased.counterIncrementStepSize”值不在取值范围内。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 将“DiagEventDebounceCounterBased.counterIncrementStepSize”配置为（0，232），并保存配置。

报错信息

[mdc_constr_4105] The value range of 'DiagEventDebounceCounterBased.counterJumpDownValue' must be (-231,231).

可能原因

“DiagEventDebounceCounterBased.counterJumpDownValue”值不在取值范围内。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 将“DiagEventDebounceCounterBased.counterJumpDownValue”配置为（-231，231），并保存配置。

报错信息

[mdc_constr_4106] The value range of 'DiagEventDebounceCounterBased.counterJumpUpValue' must be (-231,231).

可能原因

“DiagEventDebounceCounterBased.counterJumpUpValue”值不在取值范围内。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 将“DiagEventDebounceCounterBased.counterJumpUpValue”配置为（-231，231），并保存配置。

报错信息

[mdc_constr_4107] The value range of 'DiagEventDebounceCounterBased.counterPassedThreshold' must be (-231,231).

可能原因

“DiagEventDebounceCounterBased.counterPassedThreshold”值不在取值范围内。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 将“DiagEventDebounceCounterBased.counterPassedThreshold”配置为（-231，231），并保存配置。

报错信息

[mdc_constr_4111] The value range of 'EthernetNetworkConfiguration.tcpPort' must be (0,65535).

可能原因

“EthernetNetworkConfiguration.tcpPort”值不在取值范围内。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 将“EthernetNetworkConfiguration.tcpPort”配置为（0，65535），并保存配置。

报错信息

[mdc_constr_4112] The value range of 'EthernetNetworkConfiguration.udpPort' must be (0,65535).

可能原因

“EthernetNetworkConfiguration.udpPort”值不在取值范围内。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 将“EthernetNetworkConfiguration.udpPort”配置为（0，65535），并保存配置。

报错信息

[mdc_constr_4115] The value range of 'SoftwareClusterDoipDiagnosticAddress.diagnosticAddress' must be [0,0xFFFF].

可能原因

“SoftwareClusterDoipDiagnosticAddress.diagnosticAddress”值不在取值范围内。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 将“SoftwareClusterDoipDiagnosticAddress.diagnosticAddress”配置为[0，0xFFFF]，并保存配置。

报错信息

[mdc_constr_4116] The 'DiagnosticSession.id' is mandatory and the value range must be [1,FF].

可能原因

“DiagnosticSession.id”值不在取值范围内。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 将“DiagnosticSession.id”配置为[1，FF]，并保存配置。

报错信息

[mdc_constr_4117] The value range of 'DiagnosticSecurityLevel.accessDataRecordSize' must be (0,232).

可能原因

“DiagnosticSecurityLevel.accessDataRecordSize”值不在取值范围内。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 将“DiagnosticSecurityLevel.accessDataRecordSize”配置为（0，232），并保存配置。

报错信息

[mdc_constr_4118] The 'DiagnosticSecurityLevel.keySize' is mandatory and the value range must be (0,232).

可能原因

“DiagnosticSecurityLevel.keySize”值未配或不在取值范围内。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 将“DiagnosticSecurityLevel.keySize”配置为（0，232），并保存配置。

报错信息

[mdc_constr_4119] The value range of 'DiagnosticSecurityLevel.numFailedSecurityAccess' must be (0,232).

可能原因

“DiagnosticSecurityLevel.numFailedSecurityAccess”值不在取值范围内。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 将“DiagnosticSecurityLevel.numFailedSecurityAccess”配置为（0，232），并保存配置。

报错信息

[mdc_constr_4120] The 'DiagnosticSecurityLevel.securityDelayTime' is mandatory and the value range must be (0,232).

可能原因

“DiagnosticSecurityLevel.securityDelayTime”值未配或不在取值范围内。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 将“DiagnosticSecurityLevel.securityDelayTime”配置为（0，232），并保存配置。

报错信息

[mdc_constr_4121] The 'DiagnosticSecurityLevel.seedSize' is mandatory and the value range must be (0,232).

可能原因

“DiagnosticSecurityLevel.seedSize”值未配或不在取值范围内。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 将“DiagnosticSecurityLevel.seedSize”配置为（0，232），并保存配置。

报错信息

[mdc_constr_4123] The 'DiagnosticReadDataByIdentifierClass.maxDidToRead' is mandatory and the value range must be (0,232).

可能原因

“DiagnosticReadDataByIdentifierClass.maxDidToRead”值未配或不在取值范围内。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 将“DiagnosticReadDataByIdentifierClass.maxDidToRead”配置为（0，232），并保存配置。

报错信息

[mdc_constr_4125] The value range of 'DiagnosticRoutine.routineInfo' must be [0,0xFF].

可能原因

“DiagnosticRoutine.routineInfo”值不在取值范围内。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 将“DiagnosticRoutine.routineInfo”配置为[0，0xFF]，并保存配置。

报错信息

[mdc_constr_4126] The value range of 'DiagnosticEvent.eventFailureCycleCounterThreshold' must be [1,255].

可能原因

“DiagnosticEvent.eventFailureCycleCounterThreshold”值不在取值范围内。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 将“DiagnosticEvent.eventFailureCycleCounterThreshold”配置为[1，255]，并保存配置。

报错信息

[mdc_constr_4127] The value range of 'DiagnosticTroubleCodeUds.functionalUnit' must be [0,255].

可能原因

“DiagnosticTroubleCodeUds.functionalUnit”值不在取值范围内。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 将“DiagnosticTroubleCodeUds.functionalUnit”配置为[0，255]，并保存配置。

报错信息

[mdc_constr_4128] The 'DiagnosticTroubleCodeUds.udsDtcValue' is mandatory and the value range must be [0,0xFFFFFF].

可能原因

“DiagnosticTroubleCodeUds.udsDtcValue”值未配或不在取值范围内。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 将“DiagnosticTroubleCodeUds.udsDtcValue”配置为[0，0xFFFFFF]，并保存配置。

报错信息

[mdc_constr_4129]  The value range of  'DiagnosticTroubleCodeProps.priority' must be [1,255].

可能原因

“DiagnosticTroubleCodeProps.priority”值不在取值范围内。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 将“DiagnosticTroubleCodeProps.priority”配置为[1，255]，并保存配置。

报错信息

[mdc_constr_4130] The 'DiagnosticAging.threshold' is mandatory and the value range must be [1,255].

可能原因

“DiagnosticAging.threshold”值不在取值范围内。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 将“DiagnosticAging.threshold”配置为[1，255]，并保存配置。

报错信息

[mdc_constr_4132] The 'DiagnosticTroubleCodeGroup.groupNumber' is mandatory and the value range must be [0,0xFFFFFF].

可能原因

“DiagnosticTroubleCodeGroup.groupNumber”值不在取值范围内。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 将“DiagnosticTroubleCodeGroup.groupNumber”配置为[0，0xFFFFFF]，并保存配置。

报错信息

[mdc_constr_4133] The value range of 'DiagnosticMemoryDestinationPrimary.dtcStatusAvailabilityMask' must be [0,255].

可能原因

“DiagnosticMemoryDestinationPrimary.dtcStatusAvailabilityMask”值不在取值范围内。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 将“DiagnosticMemoryDestinationPrimary.dtcStatusAvailabilityMask”配置为[0，255]，并保存配置。

报错信息

[mdc_constr_4201] The 'DiagnosticAging.agingCycle' is mandatory.

可能原因

“DiagnosticAging.agingCycle”未配。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 配置“DiagnosticAging.agingCycle”，并保存。

报错信息

[mdc_constr_4202] The 'DiagnosticSecurityLevelPortMapping.securityLevel' is mandatory.

可能原因

“DiagnosticSecurityLevelPortMapping.securityLevel”未配。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 配置“DiagnosticSecurityLevelPortMapping.securityLevel”，并保存。

报错信息

[mdc_constr_4203] The baseType attribute of the SwDataDefPropsVariants aggregated under the SwDataDefProps of a DiagnosticDataElement is mandatory.

可能原因

“DiagnosticDataElement”下“SwDataDefProps”的聚合元素“SwDataDefPropsVariants.baseType”未配。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 配置“DiagnosticDataElement”下“SwDataDefProps”的聚合元素“SwDataDefPropsVariants.baseType”，并保存。

报错信息

[mdc_constr_4204] The 'DiagnosticServiceSwMapping.SwcServiceDependency' is mandatory.

可能原因

“DiagnosticServiceSwMapping.SwcServiceDependency”未配。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 配置“DiagnosticServiceSwMapping.SwcServiceDependency”，并保存。

报错信息

[mdc_constr_4205] The 'DiagnosticServiceSwMapping.serviceInstance' is mandatory.

可能原因

“DiagnosticServiceSwMapping.serviceInstance”未配。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 配置“DiagnosticServiceSwMapping.serviceInstance”，并保存。

报错信息

[mdc_constr_4251] The 'DiagnosticDebounceAlgorithmProps.shortName' is mandatory and its value must be unique in a project.

可能原因

“DiagnosticDebounceAlgorithmProps.shortName”的值不是全局唯一。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 配置“DiagnosticDebounceAlgorithmProps.shortName”为全局唯一，并保存。

报错信息

[mdc_constr_4252] The 'DiagnosticAccessPermission.shortName' is mandatory and its value must be unique in a project.

可能原因

“DiagnosticAccessPermission.shortName”的值不是全局唯一。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 配置“DiagnosticAccessPermission.shortName”为全局唯一，并保存。

报错信息

[mdc_constr_4253] The 'DiagnosticSecurityLevel.shortName' is mandatory and its value must be unique in a project.

可能原因

“DiagnosticSecurityLevel.shortName”的值不是全局唯一。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 配置“DiagnosticSecurityLevel.shortName”为全局唯一，并保存。

报错信息

[mdc_constr_4254] The 'DiagnosticEvent.shortName' is mandatory and its value must be unique in a project.

可能原因

“DiagnosticEvent.shortName”的值不是全局唯一。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 配置“DiagnosticEvent.shortName”为全局唯一，并保存。

报错信息

[mdc_constr_4255] The 'DiagnosticTroubleCodeUds.shortName' is mandatory and its value must be unique in a project.

可能原因

“DiagnosticTroubleCodeUds.shortName”的值不是全局唯一。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 配置“DiagnosticTroubleCodeUds.shortName”为全局唯一，并保存。

报错信息

[mdc_constr_4256] The 'DiagnosticAging.shortName' is mandatory and its value must be unique in a project.

可能原因

“DiagnosticAging.shortName”的值不是全局唯一。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 配置“DiagnosticAging.shortName”为全局唯一，并保存。

报错信息

[mdc_constr_4257] The 'DiagnosticExtendedDataRecord.shortName' is mandatory and its value must be unique in a project.

可能原因

“DiagnosticExtendedDataRecord.shortName”的值不是全局唯一。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 配置“DiagnosticExtendedDataRecord.shortName”为全局唯一，并保存。

报错信息

[mdc_constr_4258] The 'DiagnosticFreezeFrame.shortName' is mandatory and its value must be unique in a project.

可能原因

“DiagnosticFreezeFrame.shortName”的值不是全局唯一。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 配置“DiagnosticFreezeFrame.shortName”为全局唯一，并保存。

报错信息

[mdc_constr_4259] The 'DiagnosticOperationCycle.shortName' is mandatory and its value must be unique in a project.

可能原因

“DiagnosticOperationCycle.shortName”的值不是全局唯一。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 配置“DiagnosticOperationCycle.shortName”为全局唯一，并保存。

报错信息

[mdc_constr_4260] The 'DiagnosticEnableCondition.shortName' is mandatory and its value must be unique in a project.

可能原因

“DiagnosticEnableCondition.shortName”的值不是全局唯一。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 配置“DiagnosticEnableCondition.shortName”为全局唯一，并保存。

报错信息

[mdc_constr_4261] The 'DiagnosticClearCondition.shortName' is mandatory and its value must be unique in a project.

可能原因

“DiagnosticClearCondition.shortName”的值不是全局唯一。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 配置“DiagnosticClearCondition.shortName”为全局唯一，并保存。

报错信息

[mdc_constr_4262] The 'DiagnosticEnableConditionGroup.shortName' is mandatory and its value must be unique in a project.

可能原因

“DiagnosticEnableConditionGroup.shortName”的值不是全局唯一。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 配置“DiagnosticEnableConditionGroup.shortName”为全局唯一，并保存。

报错信息

[mdc_constr_4263] The 'DiagnosticClearConditionGroup.shortName' is mandatory and its value must be unique in a project.

可能原因

“DiagnosticClearConditionGroup.shortName”的值不是全局唯一。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 配置“DiagnosticClearConditionGroup.shortName”为全局唯一，并保存。

报错信息

[mdc_constr_4264] If the requiredInterface attribute of a RPortPrototype references a DiagnosticPortInterface or its subclasses, then the shortName of this RPortPrototype cannot be the same as the shortName of any other RPortPrototype whose requiredInterface references a DiagnosticPortInterface or its subclasses in the project.

可能原因

“RPortPrototype.requiredInterface”属性引用了“DiagnosticPortInterface”或其子类，且“RPortPrototype.shortName”与该工程下其他“requiredInterface”引用了“DiagnosticPortInterface”或其子类的“RPortPrototype”的“shortName”相同。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 修改“RPortPrototype.shortName”，确保“RPortPrototype.shortName”与该工程下其他“requiredInterface”引用了“DiagnosticPortInterface”或其子类的“RPortPrototype”的“shortName”不同，并保存。

报错信息

[mdc_constr_4265] If the providedInterface attribute of a PPortPrototype references a DiagnosticPortInterface or its subclasses, then the shortName of this PPortPrototype cannot be the same as the shortName of any other PPortPrototype whose providedInterface references a DiagnosticPortInterface or its subclasses in the project.

可能原因

“PPortPrototype.providedInterface”属性引用了“DiagnosticPortInterface”或其子类，且“PPortPrototype.shortName”与该工程下其他“providedInterface”引用了“DiagnosticPortInterface”或其子类的“RPortPrototype”的“shortName”相同。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 修改“PPortPrototype.shortName”，确保“PPortPrototype.shortName”与该工程下其他“providedInterface”引用了“DiagnosticPortInterface”或其子类的“RPortPrototype”的“shortName”不同，并保存。

报错信息

[mdc_constr_4266] The 'DiagnosticMemoryDestinationPrimary.shortName' is mandatory and its value must be unique in a project.

可能原因

“DiagnosticMemoryDestinationPrimary.shortName”的值不是全局唯一。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 配置“DiagnosticMemoryDestinationPrimary.shortName”为全局唯一，并保存。

报错信息

[mdc_constr_4267] The 'DiagnosticDataElement.shortName' is mandatory and its value must be unique in a project.

可能原因

“DiagnosticDataElement.shortName”的值不是全局唯一。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 配置“DiagnosticDataElement.shortName”为全局唯一，并保存。

报错信息

[mdc_constr_4268] The 'DiagnosticDataElementInterface.shortName' is mandatory and its value must be unique in a project.

可能原因

“DiagnosticDataElementInterface.shortName”的值不是全局唯一。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 配置“DiagnosticDataElementInterface.shortName”为全局唯一，并保存。

报错信息

[mdc_constr_4269] The 'DiagnosticEnvironmentalCondition.shortName' is mandatory and its value must be unique in a project.

可能原因

“DiagnosticEnvironmentalCondition.shortName”的值不是全局唯一。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 配置“DiagnosticEnvironmentalCondition.shortName”为全局唯一，并保存。

报错信息

[mdc_constr_4301] The 'DiagnosticDebounceAlgorithmProps.debounceAlgorithm' is mandatory and its value must be DiagEventDebounceCounterBased or DiagEventDebounceMonitorInternal.

可能原因

“DiagnosticDebounceAlgorithmProps.debounceAlgorithm”的值不是“DiagEventDebounceCounterBased”类型或“DiagEventDebounceMonitorInternal”类型。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 配置“DiagnosticDebounceAlgorithmProps.debounceAlgorithm”的值为“DiagEventDebounceCounterBased”类型或“DiagEventDebounceMonitorInternal”类型，并保存。

报错信息

[mdc_constr_4302]The value of 'DiagnosticServiceTable.category' must be PHYSICAL_ADDRESSING or FUNCTIONAL_ADDRESSING.

可能原因

“DiagnosticServiceTable.category”的值不是“PHYSICAL_ADDRESSING”或“FUNCTIONAL_ADDRESSING”。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 配置“DiagnosticServiceTable.category”的值为“PHYSICAL_ADDRESSING”或“FUNCTIONAL_ADDRESSING”，并保存。

报错信息

[mdc_constr_4303]The value of 'DiagnosticEcuReset.category' must be HARD_RESET,KEY_OFF_ON_RESET,SOFT_RESET,ENABLE_RAPID_POWER_SHUT_DOWN or DISABLE_RAPID_POWER_SHUT_DOWN.

可能原因

“DiagnosticEcuReset.category”不是以下取值：

  • HARD_RESET
  • KEY_OFF_ON_RESET
  • SOFT_RESET
  • ENABLE_RAPID_POWER_SHUT_DOWN
  • DISABLE_RAPID_POWER_SHUT_DOWN

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 配置“DiagnosticEcuReset.category”的值为“HARD_RESET”、“KEY_OFF_ON_RESET”、“SOFT_RESET”、“ENABLE_RAPID_POWER_SHUT_DOWN”或“DISABLE_RAPID_POWER_SHUT_DOWN”，并保存。

报错信息

[mdc_constr_4304]The value of 'DiagnosticComControl.category' must be ENABLE_RX_AND_TX,DISABLE_RX_AND_TX,ENABLE_RX_AND_DISABLE_TX,DISABLE_RX_AND_ENABLE_TX,ENABLE_RX_AND_DISABLE_TX_WITH_ENHANCED_ADDRESS_INFORMATION or ENABLE_RX_AND_TX_WITH_ENHANCED_ADDRESS_INFORMATION.

可能原因

“DiagnosticComControl.category”不是以下取值：

  • ENABLE_RX_AND_TX
  • DISABLE_RX_AND_TX
  • ENABLE_RX_AND_DISABLE_TX
  • DISABLE_RX_AND_ENABLE_TX
  • ENABLE_RX_AND_DISABLE_TX_WITH_ENHANCED_ADDRESS_INFORMATION
  • ENABLE_RX_AND_TX_WITH_ENHANCED_ADDRESS_INFORMATION

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 配置“DiagnosticComControl.category”的值为“ENABLE_RX_AND_TX”、“DISABLE_RX_AND_TX”、“ENABLE_RX_AND_DISABLE_TX”、“DISABLE_RX_AND_ENABLE_TX”、“ENABLE_RX_AND_DISABLE_TX_WITH_ENHANCED_ADDRESS_INFORMATION”或“ENABLE_RX_AND_TX_WITH_ENHANCED_ADDRESS_INFORMATION”，并保存。

报错信息

[mdc_constr_4305] The 'DiagnosticControlDTCSetting.dtcSettingParameter' is mandatory and its value must be 1 or 2.

可能原因

“DiagnosticControlDTCSetting.dtcSettingParameter”的值不是1或2。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 配置“DiagnosticControlDTCSetting.dtcSettingParameter”的值为1或2，并保存。

报错信息

[mdc_constr_4306]The value of 'DiagnosticReadDTCInformation.category' must be REPORT_NUMBER_OF_DTC_BY_STATUS_MASK,REPORT_DTC_BY_STATUS_MASK,REPORT_DTC_SNAPSHOT_IDENTIFICATION,,REPORT_DTC_SNAPSHOT_RECORD_BY_DTC_NUMBER,REPORT_DTC_EXT_DATA_RECORD_BY_DTC_NUMBER or REPORT_SUPPORTED_DTC.

可能原因

“DiagnosticReadDTCInformation.category”不是以下取值：

  • REPORT_NUMBER_OF_DTC_BY_STATUS_MASK
  • REPORT_DTC_BY_STATUS_MASK
  • REPORT_DTC_SNAPSHOT_IDENTIFICATION
  • REPORT_DTC_SNAPSHOT_RECORD_BY_DTC_NUMBER
  • REPORT_DTC_EXT_DATA_RECORD_BY_DTC_NUMBER
  • REPORT_SUPPORTED_DTC

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 配置“DiagnosticReadDTCInformation.category”的值为“REPORT_NUMBER_OF_DTC_BY_STATUS_MASK”、“REPORT_DTC_BY_STATUS_MASK”、“REPORT_DTC_SNAPSHOT_IDENTIFICATION”、“REPORT_DTC_SNAPSHOT_RECORD_BY_DTC_NUMBER”、“REPORT_DTC_EXT_DATA_RECORD_BY_DTC_NUMBER”或“REPORT_SUPPORTED_DTC”，并保存。

报错信息

[mdc_constr_4307]The value of 'DiagnosticEvent.eventClearAllowed' must be always or requiresCallbackExecution.

可能原因

“DiagnosticEvent.eventClearAllowed”的值不是“always”或“requiresCallbackExecution”。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 配置“DiagnosticEvent.eventClearAllowed”的值为“always”或“requiresCallbackExecution”，并保存。

报错信息

[mdc_constr_4309]The value of 'DiagnosticUploadDownloadPortMapping.serviceInstance' must be DiagnosticRequestUpload or DiagnosticRequestDownload.

可能原因

“DiagnosticUploadDownloadPortMapping.serviceInstance”的值不是“DiagnosticRequestUpload”或“DiagnosticRequestDownload”。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 配置“DiagnosticUploadDownloadPortMapping.serviceInstance”的值为“DiagnosticRequestUpload”或“DiagnosticRequestDownload”，并保存。

报错信息

[mdc_constr_4311] The 'DiagnosticProvidedDataMapping.dataProvider' is mandatory and its value must be DEM_AGINGCTR_DOWNCNT,DEM_FAILED_CYCLES or DEM_OCCCTR.

可能原因

“DiagnosticProvidedDataMapping.dataProvider”的值不是“DEM_AGINGCTR_DOWNCNT”、“DEM_FAILED_CYCLES”或“DEM_OCCCTR”。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 配置“DiagnosticProvidedDataMapping.dataProvider”的值为“DEM_AGINGCTR_DOWNCNT”、“DEM_FAILED_CYCLES”或“DEM_OCCCTR”，并保存。

报错信息

[mdc_constr_4401] Only one DoIpInstantiation.networkInterface is supported and mandatory.

可能原因

“DoIpInstantiation”没有配置“networkInterface”或配置了多个“networkInterface”。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置（DoIpInstantiation）。
  2. 配置“DoIpInstantiation”属性“networkInterface”为1个，并保存配置。

报错信息

[mdc_constr_4402] In the DoIpInstantiation.requestConfigurations, the addresses consisting of startAddress and endAddress cannot overlap.

可能原因

“DoIpInstantiation.requestConfigurations”由“startAddress”和“endAddress”组成的范围集合有重叠。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置（DoIpInstantiation）。
  2. 配置“DoIpInstantiation.requestConfigurations”，检查修改重叠部分，并保存配置。

报错信息[1]

[mdc_constr_4403] The EthernetNetworkConfiguration.communicationConnector is mandatory.

报错信息[2]

[mdc_constr_4403] The EthernetNetworkConfiguration.ipv4MulticastIpAddress is mandatory.

报错信息[3]

[mdc_constr_4403] The EthernetNetworkConfiguration.communicationConnector shall be configured in the local machine.

可能原因
  • [1]：“EthernetNetworkConfiguration.communicationConnector”未配置。
  • [2]：“EthernetNetworkConfiguration.ipv4MulticastIpAddress”未配置。
  • [3]：“EthernetNetworkConfiguration”配置的“communicationConnector”不是来源于“EthernetNetworkConfiguration”所属“machine.machineDesign”。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置（EthernetNetworkConfiguration）。
  2. 配置属性“communicationConnector”和“ipv4MulticastIpAddress”，保证“communicationConnector”来源于当前“machine.machineDesign”。
  3. 保存配置。

报错信息

[mdc_constr_4404] The EthernetNetworkConfiguration.ipv4MulticastIpAddress shall be set to a multicast address.

可能原因

“EthernetNetworkConfiguration.ipv4MulticastIpAddress”不是组播IP，范围超出了224.0.0.0~239.255.255.255。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置（EthernetNetworkConfiguration）。
  2. 配置“EthernetNetworkConfiguration.ipv4MulticastIpAddress”为224.0.0.0~239.255.255.255内的地址，例如224.255.255.255。
  3. 保存配置。

报错信息

[mdc_constr_4405] The DiagnosticContributionSet.category can only be set to PHYSICAL_ADDRESSING and FUNCTIONAL_ADDRESSING.

可能原因

“DiagnosticContributionSet”配置的category不是“PHYSICAL_ADDRESSING”和“FUNCTIONAL_ADDRESSING”。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置（DiagnosticContributionSet）。
  2. 配置“DiagnosticContributionSet”，将category设置为“PHYSICAL_ADDRESSING”或“FUNCTIONAL_ADDRESSING”。
  3. 保存配置。

报错信息

[mdc_constr_4407] If SoftwareCluster is configured with diagnosticAddress and diagnosticExtract references, the Moule Instantiations must reference the DoIpInstantiation.

可能原因

“SoftwareCluster”配置了“diagnosticAddress”和“diagnosticExtract”，但是属性“MouleInstantiations”没有引用“DoIpInstantiation”。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置（SoftwareCluster）。
  2. 将“SoftwareCluster”元素的“MouleInstantiations”属性引用一个“DoIpInstantiation”。
  3. 保存配置。

报错信息

[mdc_constr_4409] The DiagnosticSoftwareClusterProps.dtcStatusAvailabilityMask is mandatory. The value range is [1, 255].

可能原因

“DiagnosticSoftwareClusterProps.dtcStatusAvailabilityMask”配置不在范围[1，255]内。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置（DiagnosticSoftwareClusterProps）。
  2. 配置“DiagnosticSoftwareClusterProps.dtcStatusAvailabilityMask”为[1, 255]。
  3. 保存配置。

报错信息

[mdc_constr_4414] The DiagnosticReadDataByIdentifier.dataIdentifier supports only the DiagnosticDataIdentifier type.

可能原因

“DiagnosticReadDataByIdentifier.dataIdentifier”的值未配置为“DiagnosticDataIdentifier”类型。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置（dataIdentifier）。
  2. 为“DiagnosticReadDataByIdentifier.dataIdentifier”配置“DiagnosticDataIdentifier”类型的元素。
  3. 保存配置。

报错信息

[mdc_constr_4415] The DiagnosticRoutine.id is mandatory. Its value range is (0, 65535] and shall be globally unique.

可能原因
  1. “DiagnosticRoutine.id”配置为0或者大于65535的数值。
  2. “DiagnosticRoutine.id”配置的值不是全局唯一。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置（PosistiveIntegerValueVariationPoint.mixedText）。
  2. 配置“DiagnosticRoutine.id”配置为（0， 65535]且全局唯一。
  3. 保存配置。

报错信息

[mdc_constr_4417] There is a one-to-one mapping between DiagnosticSecurityAccess and DiagnosticSecurityLevel. That is, a DiagnosticSecurityLevel can be referenced by only one DiagnosticSecurityAccess.

可能原因

两个或者以上个“DiagnosticSecurityAccess.SecurityLevel”引用同一个“DiagnosticSecurityLevel”。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置（SecurityLevel）。
  2. 为“DiagnosticSecurityAccess.SecurityLevel”重新配置一个未被其他“DiagnosticSecurityAccess”引用的“DiagnosticSecurityLevel”。
  3. 保存配置。

报错信息

[mdc_constr_4418] There is a one-to-one mapping between DiagnosticSessionControl and DiagnosticSession. That is, a DiagnosticSession can be referenced by only one DiagnosticSessionControl.

可能原因

两个或者以上个“DiagnosticSessionControl”引用同一个“DiagnosticSession”。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置（DiagnosticSession）。
  2. 为“DiagnosticSessionControl.DiagnosticSession”配置未被其它“DiagnosticSessionControl”元素引用的“DiagnosticSession”元素。
  3. 保存配置。

报错信息

[mdc_constr_4421] The DiagnosticDataElement of 'DiagnosticExtendedDataRecord.recordElement' must be referenced by DiagnosticProvidedDataMapping.

可能原因

“DiagnosticExtendedDataRecord.recordElement”下的“DiagnosticDataElement”没有被任意一个“DiagnosticProvidedDataMapping”引用。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置（DiagnosticDataElement）。
  2. 生成一个“DiagnosticProvidedDataMapping”元素，使其“DataElement”属性引用报错的“DiagnosticDataElement”。
  3. 保存配置。

报错信息

[mdc_constr_4422] The value range of the DiagnosticFreezeFrame.recordNumber is [1, 254] and the value shall be globally unique.

可能原因
  1. “DiagnosticFreezeFrame.recordNumber”配置的值小于1或者大于254。
  2. “DiagnosticFreezeFrame.recordNumber”配置值并不是全局唯一，存在其它的“DiagnosticFreezeFrame”配置了相同的值。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置（PosistiveIntegerValueVariationPoint.mixedText）。
  2. 配置“DiagnosticFreezeFrame.recordNumber”为[1， 254]且全局唯一。
  3. 保存配置。

报错信息

[mdc_constr_4433] The DiagnosticDataElementInterface.read is mandatory.

可能原因

“DiagnosticDataElementInterface”未配置聚合属性“read”。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置（DiagnosticDataElementInterface）。
  2. 配置“DiagnosticDataElementInterface”添加1个read。
  3. 保存配置。

报错信息

[mdc_constr_4434] The DiagnosticWriteDataByIdentifier.dataIdentifier supports only the DiagnosticDataIdentifier type.

可能原因

“DiagnosticWriteDataByIdentifier.dataIdentifier”的值未配置为“DiagnosticDataIdentifier”类型。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置（dataIdentifier）。
  2. 将“DiagnosticWriteDataByIdentifier.dataIdentifier”配置为“DiagnosticDataIdentifier”类型的元素。
  3. 保存配置。

报错信息

[mdc_constr_4435] The attribute DiagnosticExtendedDataRecord.customTrigger must exist when the attribute DiagnosticExtendedDataRecord.trigger is set to the value DiagnosticRecordTriggerEnum.custom.

可能原因

“DiagnosticExtendedDataRecord.trigger”配置为“DiagnosticRecordTriggerEnum.custom”，但是没有配置“DiagnosticExtendedDataRecord.CustomTrigger”。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置（CustomTrigger）。
  2. 配置“DiagnosticExtendedDataRecord.CustomTrigger”的值不为空，例如16，并保存配置。

报错信息

[mdc_constr_4436] The attribute DiagnosticFreezeFrame.customTrigger must exist when the attribute DiagnosticFreezeFrame.trigger is set to the value DiagnosticRecordTriggerEnum.custom.

可能原因

“DiagnosticFreezeFrame.trigger”配置为“DiagnosticRecordTriggerEnum.custom”，但是没有配置“DiagnosticFreezeFrame.CustomTrigger”。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置（CustomTrigger）。
  2. 配置“DiagnosticFreezeFrame.CustomTrigger”的值不为空，例如16，并保存配置。

报错信息

[mdc_constr_5001] The role value in the ComFieldGrant must be the same as that in the ComFieldGrantDesign.

可能原因

“ComFieldGrant”与“ComFieldGrantDesign”配置的“role”属性值不同。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置（“ComFieldGrant”）。
  2. 将“ComFieldGrant”的“role”属性值与“ComFieldGrantDesign”的“role”属性值保持一致，并保存配置。

报错信息

[mdc_constr_5002] The ServiceDeployment referenced by the ComEventGrant, ComMethodGrant, and ComFieldGrant must be an aggregate attribute of the serviceInterfaceDeployment referenced by the ServiceInstance.

可能原因

“ComEventGrant”、“ComMethodGrant”、“ComFieldGrant”引用的ServiceDeployment不是ServiceInstance引用的serviceInterfaceDeployment的一个聚合属性。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置（“ComEventGrant”、“ComMethodGrant”、“ComFieldGrant”）。
  2. 配置“ComEventGrant”、“ComMethodGrant”、“ComFieldGrant”引用的ServiceDeployment是ServiceInstance引用的serviceInterfaceDeployment的一个聚合属性，并保存配置。

报错信息

[mdc_constr_5003] When configuring the access permission on an Event for a Process, if  Someip is deployed for the serviceDeployment referenced by the ComEventGrant and the serviceDeployment belongs to a Group in EventGroups, you must configure the access permission on all events in the Group for the Process.

可能原因

为Process配置Event的访问权限时，“ComEventGrant”引用的serviceDeployment部署为Someip通信，并且属于EventGroups中某一Group，但该Process没有配置Group中所有Event的访问权限。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置（“ComEventGrant”）。
  2. 在为Process配置Event的访问权限时，如果“ComEventGrant”引用的serviceDeployment部署为Someip通信，并且属于EventGroups中某一Group，需要为该Process配置Group中所有Event的访问权限。
  3. 保存配置。

报错信息[1]

[mdc_constr_6501] The value of 'SoftwarePackage.uncompressedSoftwareClusterSize' is not within the range [0, 16777216]KB (0-16GB).

报错信息[2]

[mdc_constr_6501] The value of 'SoftwarePackage.packagerId' is not within the range [0, 4194304]KB (0-4GB).

报错信息[3]

[mdc_constr_6501] The value of 'SoftwarePackage.compressedSoftwarePackageSize' is not  within the range [0, 4194304]KB (0-4GB).

可能原因

“SoftwarePackage.uncompressedSoftwareClusterSize”、“SoftwarePackage.compressedSoftwarePackageSize”或“SoftwarePackage.packagerId”值不在取值范围内。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 根据业务需求，将“SoftwarePackage.uncompressedSoftwareClusterSize”、“SoftwarePackage.compressedSoftwarePackageSize”或“SoftwarePackage.packagerId”值修改至提示的取值范围内，并保存修改。

报错信息

[mdc_constr_6502] The checksum values of multiple objects under the aggregation attribute diagnosticAddress of softWareClusterDesign must be unique.

可能原因

同一个“SoftwareClusterDesign”下，存在checksum属性值相同的元素。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 根据业务需求，修改目标元素的checksum属性值，保证其唯一性，并保存修改。

报错信息

[mdc_constr_7001] Under 'TimeSyncModuleInstantiation', only 'SynchronizedMasterTimeBase' or 'SynchronizedMasterTimeBase' can be configured. The 'PureLocalTimeBase' element cannot be configured.

可能原因

“TimeSyncModuleInstantiation”下配置了“PureLocalTimeBase”。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 根据业务需求，将目标“PureLocalTimeBase”修改为“SynchronizedMasterTimeBase”或“SynchronizedMasterTimeBase”，并保存修改。

报错信息

[mdc_constr_7002] The 'syncPeriod' value must be 2^n and the value of n must be an integral equal to or greater than -3.

可能原因

syncPeriod不满足为2n，其中n为大于等于-3的整数

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 根据业务需求将设置对应的syncPeriod，保存配置。

报错信息

[mdc_constr_7007] The 'TimeSyncPortPrototyprToTimeBaseMapping.RPortPrototypeInExecutableInstanceRef.contextRootSwComponentPrototype' element cannot be configured.

可能原因

配置了“TimeSyncPortPrototyprToTimeBaseMapping.RPortPrototypeInExecutableInstanceRef.contextRootSwComponentPrototype”。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 删除“TimeSyncPortPrototyprToTimeBaseMapping.RPortPrototypeInExecutableInstanceRef.contextRootSwComponentPrototype”属性的配置，并保存修改。

报错信息

[mdc_constr_7501] A maximum of 16 'UdpNmClusters' items can be configured under 'NmConfig'.

可能原因

同一个“NmConfig”下配置的udpNmCluster个数大于16个。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 删除目标“NmConfig”下多余的udpNmCluster，直至等于或小于16个，并保存修改。

报错信息

[mdc_constr_7502] The value of the 'NmConfig.UdpNmCluster.nmChannelId' attribute must be unique.

可能原因

存在配置相同的“NmConfig.UdpNmCluster.nmChannelId”。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 修改目标“NmConfig.UdpNmCluster.nmChannelId”的值，保证各个值唯一，并保存修改。

报错信息

[mdc_constr_7503] The value of the 'NmConfig.UdpNmClusterCoupling.VariationPoint.shortLabel' attribute must be unique.

可能原因

存在配置相同的“NmConfig.UdpNmClusterCoupling.VariationPoint.shortLabel”。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 修改目标“NmConfig.UdpNmClusterCoupling.VariationPoint.shortLabel”属性的值，保证各个值唯一，并保存修改。

报错信息

[mdc_constr_7504] The value of the NmConfig.UdpNmClusterCoupling.VariationPoint.shortLabel attribute should be an integer greater than or equal to 0.

可能原因

“NmConfig.UdpNmClusterCoupling.VariationPoint.shortLabel”值小于0。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 修改“NmConfig.UdpNmClusterCoupling.VariationPoint.shortLabel”值，保证其值大于等于0，并保存修改。

报错信息

[mdc_constr_7505] The value range of 'UdpNmNode.nmNodeId' is [0, 255].

可能原因

“UdpNmNode.nmNodeId”取值不在[0,255]范围内。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 将“UdpNmNode.nmNodeId”的值修改至[0,255]范围内，并保存修改。

报错信息

[mdc_constr_7506] Under the same 'NmConfig.UdpNmCluster', the 'pnResetTime' attribute value of  'EcuInstance' associated with the 'udpNmNode' attribute must be greater than the 'nmMsgCycleTime' attribute value.

可能原因

在同一个“NmConfig.UdpNmCluster”下，“UdpNmNode”中关联的“EcuInstance”的pnResetTime属性值小于等于nmMsgCycleTime属性值。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 修改关联“EcuInstance”下的pnResetTime属性值，保证其大于“NmConfigUdpNmCluster.nmMsgCycleTime”属性值，并保存修改。

报错信息

[mdc_constr_7507] The 'nmNidPosition/nmCbvPosition' attribute under 'NmConfig.UdpNmCluster' must be set to 0, 1, or 255.

可能原因

“NmConfig.UdpNmCluster”下的nmNidPosition或nmCbvPosition属性取值不为“0”、“1”或“255”。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 根据业务需求，修改目标元素下nmNidPosition或nmCbvPosition的值，只能配置为“0”、“1”或“255”，并保存修改。

报错信息

[mdc_constr_7508] The 'nmNidPosition' and 'nmCbvPosition' values under the same 'NmConfig.UdpNmCluster' must be different.

可能原因

同一个“NmConfig.UdpNmCluster”的nmNidPosition和nmCbvPosition相同。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 根据业务需求将nmNidPosition和nmCbvPosition值修改为不同，保存修改。

报错信息

[mdc_constr_7509] The 'UdpNmNode.nmNodeId' value under the same 'NmConfig.UdpNmCluster' must be unique.

可能原因

同一“NmConfig.UdpNmCluster”下，存在相同的“UdpNmNode.nmNodeId”配置。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 修改目标元素下重复的“UdpNmNode.nmNodeId”配置，保证各个值唯一，并保存修改。

报错信息

[mdc_constr_7510] A maximum of 16 'NmNode' items can be configured under a 'NmConfig.UdpNmCluster' attribute

可能原因

在“NmConfig.UdpNmCluster”中配置大于16个的“NmNode”。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 根据业务需求，删除多余“NmNode”，保证个数在16以内，并保存修改。

报错信息

[mdc_constr_7511] Under the 'EcuInstance' element, the 'EthernetCommunicationConnector.PncFilterDataMask' attribute must set, and the 'PncFilterDataMask' value can only be 0 or 1. In addition, the following condition must be met: PncVectorLength≥ (PncFilterDataMask/8).

可能原因
  • “EcuInstance.EthernetCommunicationConnector.pncFilterDataMask”配置为空。
  • “EcuInstance.EthernetCommunicationConnector.pncFilterDataMask”值存在除0和1以外的字符。
  • 目标元素下的属性不满足关系式pncVectorLength≥pncFilterDataMask/8。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 配置并修改“EcuInstance.EthernetCommunicationConnector.pncFilterDataMask”值，保证其只包含字符0或1，且满足关系式pncVectorLength≥pncFilterDataMask/8，并保存修改。

报错信息

[mdc_constr_7512] The value of system/EcuInstance/NmConfig/EthernetCommunicationConnector must exist and be globally unique.

可能原因
  • System非全局唯一。
  • EcuInstance非全局唯一。
  • NmConfig非全局唯一。
  • EthernetCommunicationConnector非全局唯一。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 根据业务需求，删除重复元素，保证目标元素全局唯一，并保存修改。

报错信息

[mdc_constr_7513] The 'nmUserDataLength' and 'nmUserDataOffset' value range must not cover the 'nmCbvPosition' or 'nmNidPosition' value in the same 'NmConfig.UdpNmCluster', or the 'pncVectorLength’ or ‘pncVectorOffset’ value under the same 'System'.

可能原因

“NmConfig.UdpNmCluster.NmUserDataLength”和“NmUserDataOffset”所确定的user data数据段和CBV、NID、Pnc数据段重合了

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 根据业务需求将表示NM数据段的元素所设置的值不重合，保存修改。

报错信息

[mdc_constr_7514] The sum of the 'pncVectorLength' and 'pncVectorOffset' values under the same 'System' or that of the 'nmUserDataLength' and 'nmUserDataOffset' values under the same 'NmConfig.UdpNmCluster' cannot be greater than 1469.

可能原因

目标System下“PncDataLength”和“System.PncDataOffset”值之和大于1469，或目标“NmConfig.UdpNmCluster”下“NmUserDataLength”和“NmUserDataOffset”值之和大于1469。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 根据实际情况选择如下解决方案：
    • 修改目标System下“PncDataLength”或“System.PncDataOffset”的值，保证两者之和不大于1469，并保存修改。
    • 修改目标“NmConfig.UdpNmCluster”下“NmUserDataLength”或“NmUserDataOffset”的值，保证两者之和不大于1469，并保存修改。

报错信息

[mdc_constr_7515] The 'UdpNmNetworkConfiguration.udpPort' attribute can be set to 53008 or any integer from 53011 to 53071.

可能原因
  • “UdpNmNetworkConfiguration.udpPort”取值不在[53008,53071]范围内。
  • “UdpNmNetworkConfiguration.udpPort”取值为“53009”或“53010”。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 根据业务需求，修改“UdpNmNetworkConfiguration.udpPort”值，保证其在取值范围[53008,53071]内，且不为“53009”或“53010”，并保存修改。

报错信息

[mdc_constr_7516] UdpNmCluster.XXX should within the [X, X].

可能原因

属性值超出对应取值范围。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 请根据提示，将属性值修改至对应取值范围内，并保存修改。
父主题： Constraints错误


标准规约

下文中的报错信息原文来源于AUTOSAR社区文档“AUTOSAR_TPS_ManifestSpecification.pdf”。

报错信息

[constr_1332] The value range of 'DiagnosticEcuReset.customSubFunctionNumber' must be [0x40,0x7E].

可能原因

“DiagnosticEcuReset.customSubFunctionNumber”值不在取值范围内。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 将“DiagnosticEcuReset.customSubFunctionNumber”配置为[0x40，0x7E]，并保存配置。

报错信息

[constr_1339] The attribute DiagnosticRoutine.start shall always exist for any given DiagnosticRoutine.

可能原因

未配置“DiagnosticRoutine.startRoutine”。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置（DiagnosticRoutine）。
  2. 为“DiagnosticRoutine”配置“startRoutine”聚合属性，并保存配置。

报错信息

[constr_1394] If the attribute DiagnosticDataElement.maxNumberOfElements exists then its value shall be greater than 0.

可能原因

“DiagnosticDataElement.maxNumberOfElements”的值等于0。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置（DiagnosticDataElement）。
  2. 配置“DiagnosticDataElement.maxNumberOfElements”为一个大于0的数，并保存配置。

报错信息

[constr_1464] The value range of 'DiagnosticEnvConditionFormula.nrcValue' must be [1,255].

可能原因

“DiagnosticEnvConditionFormula.nrcValue”值不在取值范围内。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 将“DiagnosticEnvConditionFormula.nrcValue”配置为[1，255]，并保存配置。

报错信息

[constr_1470] The value of DiagnosticParameter.bitOffset shall only be set to a multiple of 8.

可能原因

“DiagnosticParameter.bitOffset”没有配置为8的倍数。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置（DiagnosticParameter）。
  2. 配置“DiagnosticParameter.bitOffset”为8的倍数（如16），并保存配置。

报错信息

[constr_1473] No support for PRPortPrototype [A ServiceInterface shall not be referenced by a PRPortPrototype in the role providedRequiredInterface].

可能原因

配置文件中存在元素“PRPortPrototype”。

处理步骤
  1. 双击对应的错误描述信息，定位至报错的具体位置。
  2. 根据具体业务需求删除元素“PRPortPrototype”，并保存修改。

报错信息

[constr_1482] Mapping of service interfaces vs. mapping of service interface elements.

可能原因

给定的“ServiceInterface”对之间建立的映射未在以下情况之一（两种情况同时存在也将报此类错误信息）：

  • 情况一：“ServiceInterfaceMapping”引用给定的“ServiceInterface”对，其中一个“ServiceInterface”在sourceServiceInterface中被引用，其他“ServiceInterface”在compositeServiceInterface中被引用。
  • 情况二：存在以下选项的任意混合：
    • 同一个serviceinterfaceEventMapping中的sourceEvent和targetEvent不能引用同一个“ServiceInterface”的“Event”。
    • 同一个serviceinterfaceEventMapping中的sourceEvent和targetField不能引用同一个“ServiceInterface”的“Field”。
    • 同一个serviceinterfaceEventMapping中的sourceEvent和targetMethod不能引用同一个“ServiceInterface”的“Method”。

处理步骤
  1. 双击对应的错误描述信息，定位至报错的具体位置。
  2. 根据具体业务需求将给定的“ServiceInterface”对元素，选择其中一种上述情况作为映射，不能同时存在，并保存修改。

报错信息

[constr_1483] The ServiceInterface('ShortNameA') shall only be taken to type a PortPrototype if the latter is aggregated by an AdaptiveApplicationSwComponentType or by a CompositionSwComponentType.

可能原因

“ServiceInterface”被关联到除“AdaptiveApplicationSwComponentType”或“CompositionSwComponentType”类型之外的“SwComponentType”元素。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 根据业务需求，将“ServiceInterface”关联至“AdaptiveApplicationSwComponentType”或“CompositionSwComponentType”元素内，并保存修改。

报错信息

[constr_1492] SwComponentType referenced as Executable.rootSwComponentPrototype.applicationType.

可能原因
  1. “Executable”的子元素“RootSwComponentPrototype”，其applicationType属性中所引用的对象的类型既不是“CompositionSwComponentType”，也不是“AdaptiveApplicationSwComponentType”。
  2. “Executable”的子元素“RootSwComponentPrototype”，其applicationType属性中所引用的对象的类型为“CompositionSwComponentType”，但是“CompositionSwComponentType”的子元素“SwComponentPrototype”的Type属性中引用的对象的类型既不是“CompositionSwComponentType”，也不是“AdaptiveApplicationSwComponentTyp”。

处理步骤
  1. 双击对应的错误描述信息，定位至报错的具体位置。
  2. 对应原因1，将对应的“Application Type”修改引用一个“AdaptiveApplicationSwComponentType”或“CompositionSwComponentType”类。
    • 若修改后的引用对象的类型为“CompositionSwComponentType”，需要保存修改，并再次进行校验。
    • 若校验依然提示错误，进入步骤3。
  3. 对于原因2，找到引用的“CompositionSwComponentType”，修改其子元素“Sw Component Prototype”的Type属性，使其引用元素为“AdaptiveApplicationSwComponentType”或“CompositionSwComponentType”。
  4. 保存修改。

报错信息

[constr_1494] ServiceInterface.event cannot define an initValue.

可能原因

在“ServiceInterface.event”中配置了initValue类下的元素。

处理步骤

  1. 双击对应的错误描述信息，定位至报错具体位置。

  2. 根据报错提示找到目标event（“VariableDataPrototype”）元素下，删除其下的initValue类元素，并保存修改。

报错信息

[constr_1496] A DiagnosticServiceDataMapping.mappedApDataElement must only refer to an event or a field.

可能原因

“DiagnosticServiceDataMapping.mappedApDataElement”未引用一个“Event”或一个“Field”。

处理步骤
  1. 双击对应的错误描述信息，定位至报错的具体位置。
  2. 根据具体业务需求将“DiagnosticServiceDataMapping.mappedApDataElement”元素的“Target Data Prototype”属性值配置为正确的引用，可以是“Event”或“Field”，并保存修改。

报错信息

[constr_1497] For any StartupOption where attribute optionKind is set to commandLineSimpleForm, attribute optionName cannot be configured, but attribute optionArgument must be configured.

可能原因

“StartupOption”元素的optionKind属性值为“commandLineSimpleForm”时，“StartupOption”元素配置了optionName属性或没有配置optionArgument属性。

处理步骤

  1. 双击对应的错误描述信息，定位至报错具体位置。

  2. 根据业务需求，删除“StartupOption”的optionName属性配置（使“Option Name”值为空），并对optionArgument属性进行配置，并保存修改。

报错信息

[constr_1498] For any StartupOption where attribute optionKind is set to commandLineShortForm or commandLineLongForm, attribute optionName must be configured.

可能原因

“StartupOption”元素的optionKind属性值为commandLineShortForm或commandLineLongForm时，optionName属性没有配置。

处理步骤

  1. 双击对应的错误描述信息，定位至报错具体位置。

  2. 根据业务需求将“StartupOption”的optionName属性进行配置，并保存修改。

报错信息

[constr_1500] SwcServiceDependency of DiagnosticEventPortMapping.SwcServiceDependencyInExecutable must be referenced from AdaptiveSwcInternalBehavior.SwcServiceDependency. SwcServiceDependency must have serviceNeeds whose value is set to DiagnosticEventNeeds.

可能原因
  1. “DiagnosticEventPortMapping.swcServiceDependencyInExecutable”中引用的任何特定的“SwcServiceDependency”，不是源于“AdaptiveSwcInternalBehavior”中的聚合属性serviceDependency。
  2. “DiagnosticEventPortMapping.swcServiceDependencyInExecutable”中引用的任何特定的“SwcServiceDependency”源于“AdaptiveSwcInternalBehavior”中的聚合属性serviceDependency，但引用的“SwcServiceDependency”元素未配置serviceNeeds子元素或所配置的serviceNeeds子元素类型不为“DiagnosticEventNeeds”。

处理步骤
  1. 双击对应的错误描述信息，定位至报错的具体位置。
  2. 根据具体业务需求将swcServiceDependencyInExecutable元素的“TargetSwcServiceDependency”属性值配置为正确的引用（“AdaptiveSwcInternalBehavior”中的聚合属性serviceDependency，且引用的“SwcServiceDependency”元素含有一个“DiagnosticEventNeeds”类型的子元素serviceNeeds），并保存修改。

报错信息

[constr_1501] SwcServiceDependency of DiagnosticOperationCyclePortMapping.SwcServiceDependencyInExecutable must be referenced from AdaptiveSwcInternalBehavior.SwcServiceDependency. SwcServiceDependency must have serviceNeeds whose value is set to DiagnosticOperationCycleNeeds.

可能原因
  1. “DiagnosticOperationCyclePortMapping.swcServiceDependencyInExecutable”中引用的任何特定的“SwcServiceDependency”，不是源于“AdaptiveSwcInternalBehavior”中的聚合属性serviceDependency。
  2. “DiagnosticOperationCyclePortMapping.swcServiceDependencyInExecutable”中引用的任何特定的“SwcServiceDependency”源于“AdaptiveSwcInternalBehavior”中的聚合属性serviceDependency，但引用的“SwcServiceDependency”元素未配置serviceNeeds子元素或所配置的serviceNeeds子元素类型不为“DiagnosticOperationCycleNeeds”。

处理步骤
  1. 双击对应的错误描述信息，定位至报错的具体位置。
  2. 根据具体业务需求将swcServiceDependencyInExecutable元素的“TargetSwcServiceDependency”属性值配置为正确的引用（“AdaptiveSwcInternalBehavior”中的聚合属性serviceDependency，且引用的“SwcServiceDependency”元素含有一个“DiagnosticOperationCycleNeeds”类型的子元素serviceNeeds），并保存修改。

报错信息

[constr_1502] SwcServiceDependency of DiagnosticEnableConditionPortMapping.SwcServiceDependencyInExecutable must be referenced from AdaptiveSwcInternalBehavior.SwcServiceDependency. SwcServiceDependency must have serviceNeeds whose value is set to DiagnosticEnableConditionNeeds.

可能原因
  1. “DiagnosticEnableConditionPortMapping.swcServiceDependencyInExecutable”中引用的任何特定的“SwcServiceDependency”，不是源于“AdaptiveSwcInternalBehavior”中的聚合属性serviceDependency。
  2. “DiagnosticEnableConditionPortMapping.swcServiceDependencyInExecutable”中引用的任何特定的“SwcServiceDependency”源于“AdaptiveSwcInternalBehavior”中的聚合属性serviceDependency，但引用的“SwcServiceDependency”元素未配置serviceNeeds子元素或所配置的serviceNeeds子元素类型不为“DiagnosticEnableConditionNeeds”。

处理步骤
  1. 双击对应的错误描述信息，定位至报错的具体位置。
  2. 根据具体业务需求将swcServiceDependencyInExecutable元素的“TargetSwcServiceDependency”属性值配置为正确的引用（“AdaptiveSwcInternalBehavior”中的聚合属性serviceDependency，且引用的“SwcServiceDependency”元素含有一个“DiagnosticEnableConditionNeeds”类型的子元素serviceNeeds），并保存修改。

报错信息

[constr_1507] PortInterfaceToDataTypeMapping.portInterface must only refer to either a ServiceInterface or a PersistencyKeyValueDatabaseInterface.

可能原因

“PortInterfaceToDataTypeMapping.portInterface”元素未引用“ServiceInterface”或“PersistencyKeyValueDatabaseInterface”。

处理步骤
  1. 双击对应的错误描述信息，定位至报错的具体位置。
  2. 根据具体业务需求将“PortInterfaceToDataTypeMapping”元素的portInterface属性值配置为正确的引用“ServiceInterface”或“PersistencyKeyValueDatabaseInterface”，并保存修改。

报错信息

[constr_1535] Each DiagnosticContributionSet shall only reference a single DiagnosticSoftwareClusterProps in the role element.

可能原因

“DiagnosticContributionSet”关联了2个或更多的“DiagnosticSoftwareClusterProps”。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置（DiagnosticContributionSet）。
  2. 配置“DiagnosticContributionSet”只关联一个“DiagnosticSoftwareClusterProps”，并保存配置。

报错信息

[constr_1549] Value of ProcessorCore.coreId (The value of ProcessorCore.coreId shall be unique in the context of the enclosing Processor).

可能原因

关联了同一个machine的“Processors”中存在重复“ProcessorCore.coreId”值的“Pocessor”。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 根据业务需求，更改同一个machine下“Processors”的“ProcessorCore”的coreId属性值，确保其唯一性，并保存修改。

报错信息

[constr_1550] Each ProcessDesign must only be referenced from a Process.

可能原因

有两个以上的“Process”在“Design”属性中引用了同一个“ProcessDesign”。

处理步骤
  1. 双击想要修改的“Process”所对应的错误描述信息，定位至报错的具体位置。
  2. 修改对应“Process”的“Design”属性中所引用的“ProcessDesign”对象，使其指向其它的“ProcessDesign”，并保存修改。

报错信息

[constr_1553] One Process shall only be mapped once, to exactly one Machine.

可能原因

目标“Process”多次被映射到一个“Machine”中或目标“Process”被映射到了多个不同的“Machine”中。

处理步骤

  1. 双击对应的错误描述信息，定位至报错具体位置。

  2. 根据业务需求，通过“ProcessToMachineMapping”元素配置所需“Machine”和目标“Process”的映射关系，并保存修改。

报错信息

[constr_1564] The aggregation of SoftwareClusterDiagnosticAddress at SoftwareCluster in the role diagnosticAddress shall only exist if the value of SoftwareCluster.category is set to ROOT_SOFTWARE_CLUSTER.

可能原因

“SoftwareCluster”配置了属性“diagnosticAddress”，但是“category”不为“ROOT_SOFTWARE_CLUSTER”。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置（SoftwareCluster）。
  2. 配置“SoftwareCluster”属性“category”为“ROOT_SOFTWARE_CLUSTER”，并保存配置。

报错信息

[constr_1568] The existence of the reference SoftwareCluster.diagnosticExtract is limited to SoftwareClusters where attribute category is set to the value ROOT_SOFTWARE_CLUSTER.

可能原因

“SoftwareCluster”配置了属性“diagnosticExtract”，但是“category”不为“ROOT_SOFTWARE_CLUSTER”。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置（SoftwareCluster）。
  2. 配置“SoftwareCluster”属性“category”为“ROOT_SOFTWARE_CLUSTER”，并保存配置。

报错信息

[constr_1571] The CppImplementationDataType ('ShortNameA') can only be used for data type definitions of AdaptiveApplicationSwComponentType and CompositionSwComponentType.

可能原因

“CppImplementationDataType”被关联到除“AdaptiveApplicationSwComponentType”和“CompositionSwComponentType”之类的其他“SwComponentType”。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 根据业务需求，将“CppImplementationDataType”关联至“AdaptiveApplicationSwComponentType”或“CompositionSwComponentType”元素内，并保存修改。

报错信息

[constr_1572] Within the scope of a CppImplementationDataType the reference CppImplementationDataType.swDataDefProps.implementationDataType must not exist.

可能原因

“CppImplementationDataType.SwDataDefProps.SwDataDefPropsConditional.implementationDataType”属性值为非空。

处理步骤
  1. 双击对应的错误描述信息，定位至报错的具体位置。
  2. 将目标“SwDataDefPropsConditional.implementationDataType”属性值配置为空，并保存修改。

报错信息

[constr_1576] CppTemplateArgument.templateType and CppTemplateArgument.allocator cannot be configured at the same time.

可能原因

“CppTemplateArgume”元素中同时配置了属性templateType和allocator。

处理步骤

  1. 双击对应的错误描述信息，定位至报错具体位置。

  2. 根据业务需求删除templateType或allocator属性配置，保留其一即可，并保存修改。

报错信息

[constr_1578] Incorrect value of attribute Category.

可能原因

以下元素的Category属性值配置有误：

ApplicationArrayDataType，ApplicationRecordDataType，ApplicationPrimitiveDataType，ApplicationRecordElement，ApplicationArrayElement，ApplicationValueSpecification，StdCppImplementationDataType，CustomCppImplementationDataType

处理步骤
  1. 双击对应的错误描述信息，定位到报错具体位置。
  2. 确定错误元素的类型，然后根据类型修改Category的属性值，使其为可用值。各种不同类型的元素与其对应的可用Category属性值如下所示。

    ApplicationArrayDataType：ARRAY

    ApplicationRecordDataType：STRUCTURE

    ApplicationPrimitiveDataType：VALUE，STRING，BOOLEAN

    ApplicationRecordElement：VALUE，STRUCTURE，ARRAY，STRING，BOOLEAN

    ApplicationArrayElement：VALUE，STRUCTURE，ARRAY，STRING，BOOLEAN

    ApplicationValueSpecification：VALUE，STRING，BOOLEAN

    StdCppImplementationDataType：VALUE，TYPE_REFERENCE，STRUCTURE，VARIANT，ARRAY，VECTOR，ASSOCIATIVE_MAP，STRING

    CustomCppImplementationDataType：VARIANT，ARRAY，VECTOR，ASSOCIATIVE_MAP

报错信息

[constr_1581] Within the scope of any given PersistencyFileProxyInterface, the value of all FileProxy.fileName 'file00' must be unique.

可能原因

在任何给定的“PersistencyFileProxyInterface”范围内，并不是所有fileProxy.fileName值（file00，MMC会根据实际配置的值刷新提示）都唯一。

处理步骤
  1. 双击对应的错误描述信息，定位至报错的具体位置。
  2. 根据具体业务需求将“PersistencyFileProxyInterface”元素的所有fileProxy.fileName值配置为唯一，并保存修改。

报错信息

[constr_1593] If the reference TlvDataIdDefinition.tlvArgument exists for one argument of a given ClientServerOperation then further TlvDataIdDefinition.tlvArgument shall exist for all arguments of the given ClientServerOperation and all affected TlvDataIdDefinition shall be aggregated by the same TransformationPropsToServiceInterfaceElementMapping.

可能原因

“ClientServerOperation”的元素“ArgumentDataPrototype”没有全部被同一个“TransformationPropsToServiceInterfaceElementMapping”引用。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 定位到未被“TransformationPropsToServiceInterfaceElementMapping”引用的“ClientServerOperation”的“ArgumentDataPrototype”，将其被“TransformationPropsToServiceInterfaceElementMapping”引用，然后保存配置。

报错信息

[constr_1596] For all TlvDataIdDefinition that are referencing ArgumentDataPrototypes of a givenClientServerOperation in the role tlvArgument, the attribute TlvDataIdDefinition.id shall exist and have a unique value per communication direction.

可能原因

同一个“TransformationPropsToServiceInterfaceElementMapping”关联了元素“TlvDataIdDefinition”，该元素的属性“tlvArgument”引用了“ArgumentDataPrototype”，而同一个方向（“IN”或“OUT”）下的“TlvDataIdDefinition.id”的值不唯一。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 确保同一个方向（“IN”或“OUT”）下的“TlvDataIdDefinition.id”的值唯一，然后保存配置。

报错信息

[constr_1598] For all TlvDataIdDefinition that are referencing CppImplementationDataTypeElements of a given CppImplementationDataTypeCppImplementationDataTypeElement in the role tlvSubElement, the attribute TlvDataIdDefinition.id shall exist and have a unique value in the context of respective enclosing CppImplementationDataType or CppImplementationDataTypeElement.

可能原因

“TlvDataIdDefinition”的聚合属性“tlvSubElement”引用了“StdCppImplementationDataType”下的“CppImplementationDataTypeElement”，而“tlvSubElement”对应的“TlvDataIdDefinition.id”的值，在对应的“StdCppImplementationDataType”中不唯一。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 确保“tlvSubElement”对应的“TlvDataIdDefinition.id”的值唯一，然后保存配置。

报错信息

[constr_1599] Each ArgumentDataPrototype shall be referenced at most once in the role tlvArgument in the context of the same TransformationPropsToServiceInterfaceElementMapping.

可能原因

同一个“TransformationPropsToServiceInterfaceElementMapping”关联的同一个“ArgumentDataPrototype”被“TlvDataIdDefinition”引用多次。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 确保“TransformationPropsToServiceInterfaceElementMapping”关联的同一个“ArgumentDataPrototype”只被“TlvDataIdDefinition”引用一次，然后保存配置。

报错信息

[constr_1601] Each CppImplementationDataTypeElement shall be referenced at most once in the role tlvSubElement in the context of the same TransformationPropsToServiceInterfaceElementMapping.

可能原因

同一个“TransformationPropsToServiceInterfaceElementMapping”关联的同一个“CppImplementationDataTypeElement”被“TlvDataIdDefinition”引用多次。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 确保“TransformationPropsToServiceInterfaceElementMapping”关联的同一个“CppImplementationDataTypeElement”只被“TlvDataIdDefinition”引用一次，然后保存配置。

报错信息

[constr_1604] If the reference TlvDataIdDefinition.tlvSubElement exists for one subElement of a given CppImplementationDataType or CppImplementationDataTypeElement then further TlvDataIdDefinition.tlvSubElement shall exist for all subElements of the given CppImplementationDataType or CppImplementationDataTypeElement and all affected TlvDataIdDefinition shall be aggregated by the same TransformationPropsToServiceInterfaceElementMapping.

可能原因

“StdCppImplementationDataType”下“CppImplementationDataTypeElement”的一个“Sub Element”被“TlvDataIdDefinition.tlvSubElement”引用，同时该“CppImplementationDataTypeElement”的其他所有“Sub Element”没有都被“TlvDataIdDefinition.tlvSubElement”引用，或引用了这些“Sub Element”的“TlvDataIdDefinition”未被同一个“TransformationPropsToServiceInterfaceElementMapping”引用。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 确保“StdCppImplementationDataType”下“CppImplementationDataTypeElement”的所有“Sub Element”被“TlvDataIdDefinition.tlvSubElement”引用，且对应的“TlvDataIdDefinition”均被同一个“TransformationPropsToServiceInterfaceElementMapping”引用，然后保存配置。

报错信息

[constr_1606] For two Processes, the ContextModeDeclarationGroupPrototype attribute of ModeDependentStartupConfig.executionDependency.ModeInProcessInstanceRef of one Process and the same attribute of the other Process cannot reference each other at the same time.

可能原因
  1. 两个“Process”的“StateDependentStartupConfig.executionDependency.ModeInProcessInstanceRef”的属性“ContextModeDeclarationGroupPrototype”同时引用了对方“Process”下的“ModeDeclarationGroupPrototype”。
  2. “Process.StateDependentStartupConfig.executionDependency.ModeInProcessInstanceRef”的属性“ContextModeDeclarationGroupPrototype”引用了当前“Process”下的“ModeDeclarationGroupPrototype”。

处理步骤

  1. 双击对应的错误描述信息，定位至报错具体位置。

  2. 根据业务需求，修改关联“ExecutionDependency”下子元素“ModeInProcessInstanceRef”的“ContextModeDeclarationGroupPrototype”属性依赖值，并保存修改。

报错信息

[constr_1618] In the context of one Machine, at least one Process shall have a StateDependentStartupConfig.functionGroupState that has the shortName Shutdown.

可能原因

在引用了同一个“Machine”的所有“ProcessToMachineMapping”元素引用的所有“Process”中，“StateDependentStartupConfig”下所有子元素“ModeInMachineInstanceRef”的“TargetModeDeclaration”属性都没有引用shortName为“Shutdown”的“ModeDeclaration”。

处理步骤
  1. 双击对应的错误描述信息，定位至报错的具体位置。
  2. 根据具体业务需求在“ProcessToMachineMapping”引用的“Process”中任一“StateDependentStartupConfig”元素添加一个子元素“ModeInMachineInstanceRef”，且“ModeInMachineInstanceRef”的“TargetModeDeclaration”属性需要引用shortName为“Shutdown”的“ModeDeclaration”，并保存修改。

报错信息

[constr_1619] In the context of one Machine, at least one Process shall have a StateDependentStartupConfig.functionGroupState that has the shortName Restart.

可能原因

在引用了同一个“Machine”的所有“ProcessToMachineMapping”元素引用的所有“Process”中，“StateDependentStartupConfig”下所有子元素“ModeInMachineInstanceRef”的“TargetModeDeclaration”属性都没有引用shortName为“Restart”的“ModeDeclaration”。

处理步骤
  1. 双击对应的错误描述信息，定位至报错的具体位置。
  2. 根据具体业务需求在“ProcessToMachineMapping”引用的“Process”中任一“StateDependentStartupConfig”元素添加一个子元素“ModeInMachineInstanceRef”，且“ModeInMachineInstanceRef”的“TargetModeDeclaration”属性需要引用shortName为“Restart”的“ModeDeclaration”，并保存修改。

报错信息

[constr_1627] The ApApplicationErrorDomain.value must be set in the interval [0..18446744073709551616].

可能原因

“ApApplicationErrorDomain.value”的值不在[0,18446744073709551616]范围内。

处理步骤
  1. 双击对应的错误描述信息，定位至报错的具体位置。
  2. 在属性配置栏将对应的“ApApplicationErrorDomain”的“VALUE”修改为[0,18446744073709551616]范围内的某一个整数，并保存修改。

报错信息

[constr_1628] If the aggregation tlvDataIdDefinition exists for a given TransformationPropsToServiceInterfaceElementMapping then attributes (sizeOfArrayLengthField,sizeOfStringLengthField,sizeOfStructLengthField, sizeOfUnionLengthField) shall have a value greater than 0.

可能原因

“TransformationPropsToServiceInterfaceElementMapping”引用了“tlvDataIdDefinition”，同时引用的“ApSomeipTransformationProps”的“sizeOfArrayLengthField”、“sizeOfStringLengthField”、“sizeOfStructLengthField”和“sizeOfUnionLengthField”存在不大于0的值。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 配置“ApSomeipTransformationProps”的“sizeOfArrayLengthField”、“sizeOfStringLengthField”、“sizeOfStructLengthField”和“sizeOfUnionLengthField”的值，确保值大于0，然后保存配置。

报错信息

[constr_1629] If the aggregation tlvDataIdDefinition exists for a given TransformationPropsToServiceInterfaceElementMapping then attributes (sizeOfArrayLengthField,sizeOfStringLengthField,sizeOfStructLengthField, sizeOfUnionLengthField) shall have an identical value.

可能原因

“TransformationPropsToServiceInterfaceElementMapping”引用了“tlvDataIdDefinition”，同时引用的“ApSomeipTransformationProps”的“sizeOfArrayLengthField”、“sizeOfStringLengthField”、“sizeOfStructLengthField”和“sizeOfUnionLengthField”设置的值不相同。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 配置“ApSomeipTransformationProps”的“sizeOfArrayLengthField”、“sizeOfStringLengthField”、“sizeOfStructLengthField”和“sizeOfUnionLengthField”的值，确保值相同，然后保存配置。

报错信息

[constr_1658] The mapping element DiagnosticTroubleCodeUdsToClearConditionGroupMapping must be created no more than once per DiagnosticTroubleCodeUds.

可能原因

“DiagnosticTroubleCodeUdsToClearConditionGroupMapping”映射“DiagnosticTroubleCodeUds”超过一次。

几个“DiagnosticTroubleCodeUdsToClearConditionGroupMapping”的“Trouble Code Uds”属性引用了相同的“DiagnosticTroubleCodeUds”。

处理步骤
  1. 双击对应的错误描述信息，定位至报错的具体位置。
  2. 根据的具体业务需求将“DiagnosticTroubleCodeUdsToClearConditionGroupMapping”元素的“Trouble Code Uds”属性引用值配置为正确的引用（不相同的“DiagnosticTroubleCodeUds”），并保存修改。

报错信息

[constr_1664] Within the set of all ApApplicationError.errorDomains that reference the same ApApplicationErrorDomain, the attribute ApApplicationError.shortName must have a unique value.

可能原因

在属性errorDomain中引用了同一个“ApApplicationErrorDomain”的“ApApplicationError”，它们的shortName相同。

处理步骤
  1. 依次双击想要修改shortName的“ApApplicationError”对应的错误信息，定位至报错的具体位置。
  2. 在属性配置页面中，修改对应的“ApApplicationError”的shortName，使其与其它的提示了错误的“ApApplicationError”的shortName不同，并保存修改。

报错信息

[constr_1665] Within the set of all ApApplicationErrors.errorDomains that reference the same ApApplicationErrorDomain, the attribute ApApplicationError.errorCode must have a unique value.

可能原因

在属性errorDomain中引用了同一个“ApApplicationErrorDomain”的“ApApplicationError”，它们的errorCode相同。

处理步骤
  1. 依次双击想要修改errorCode的“ApApplicationError”对应的错误信息，定位至报错的具体位置。
  2. 在属性配置页面中，修改对应的“ApApplicationError”的errorCode，使其与其它的提示了错误的“ApApplicationError”的errorCode不同，并保存修改。

报错信息

[constr_1673] For any given Field, at least one of the attributes hasGetter, hasSetter, hasNotifier must be set to true.

可能原因
  1. “Field”元素属性hasGetter、hasSetter和hasNotifier的属性值都未设值。
  2. “Field”元素属性hasGetter、hasSetter和hasNotifier都配置为“false”。

处理步骤
  1. 双击对应的错误描述信息，定位到报错具体位置。
  2. 根据的具体业务需求，至少将hasGetter、hasSetter、hasNotifier的其中一个属性值配置为“true”，并保存修改。

报错信息

[constr_1676] Consistency of references shallRunOn and shallNotRunOn (Within the context of one ProcessToMachineMapping, all ProcessorCores referenced in the role shallRunOn or shallNotRunOn shall be aggregated by the same Processor).

可能原因

对于给定的“ProcessToMachineMapping”，shallRunOn或者shallNotRunOn引用的所有“ProcessorCore”不在同一个“Processor”下。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 根据业务需求，保证“ProcessToMachineMapping”下定义的shallRunOn或shallNotRunOn引用的“ProcessorCore”在同一个“Processor”下，并保存修改。

报错信息

[constr_1677] Mutual exclusive existence of references shallRunOn and shallNotRunOn (For any given ProcessToMachineMapping, either the reference in the role shallRunOn or the reference in the role shallNotRunOn may exist).

可能原因

在给定的“ProcessToMachineMapping”中同时引用了shallRunOn和shallNotRunOn。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 根据业务需求，删除“ProcessToMachineMapping”中定义的shallRunOn或shallNotRunOn其中一项，并保存修改。

报错信息[1]

[constr_1687] Each machine must have a 'ModeDeclarationGroupPrototype' element whose 'shortName' is 'machineState'.

报错信息[2]

[constr_1687] The ModeDeclarationGroup (MachineState) bound to the Type attribute of this ModeDeclarationGroupPrototype must contain ModeDeclarations with the following ShortNames: Off, Startup, Shutdown, Restart.

可能原因
  • [1] 目标“Machine”下没配置shortName为“MachineState”的“ModeDeclarationGroupPrototype”。
  • [2] “MachineState”元素下不满足至少包含“Off”、“Startup”、“Shutdown”和“Restart”4种状态的条件。

处理步骤

  1. 双击对应的错误描述信息，定位至报错具体位置。

  2. 根据实际报错提示，选择对应解决方案：

    [1] 在目标“Machine”下创建至少一个以上shortName为“MachineState”的“ModeDeclarationGroupPrototype”。

    [2] 添加“MachineState”功能组缺少的必备状态（“Off”、“Startup”、“Shutdown”和“Restart”），并保存修改。

报错信息

[constr_1688] For all StateDependentStartupConfigs aggregated in Process.stateDependentStartupConfig, ModeDeclaration referenced by TargetModeDeclaration in ModeInMachineInstanceRef must belong to the same ModeDeclarationGroup referenced by the Type attribute of ModeDeclarationGroupPrototype.

可能原因

“Process.StateDependentStartupConfigs.functionGroupState”元素引用的所有功能组状态（“ModeDeclaration”）中存在不同功能组（“ModeDeclarationGroup”）的“ModeDeclaration”。

处理步骤

  1. 双击对应的错误描述信息，定位至报错具体位置。

  2. 根据业务需求，保证functionGroupState中引用的“ModeDeclaration”在同一个“ModeDeclarationGroup”下，并保存修改。

报错信息

[constr_1689] If ProcessA depends on a state of ProcessB in ProcessA.StateDependentStartupConfig.ExecutionDependency, the ModeDeclaration that a specific StateDependentStartupConfig of ProcessB depends on must contain the ModeDeclaration 'XXX' instance that the ProcessA.StateDependentStartupConfig depends on.

可能原因

当“ProcessA.StateDependentStartupConfig.ExecutionDependency”下存在“ProcessA”依赖“ProcessB”的状态时，“ProcessB”的某一“StateDependentStartupConfig”所依赖的“ModeDeclaration”没有当前“ProcessA.StateDependentStartupConfig”下所依赖的“ModeDeclaration ”“XXX”（“XXX”， MMC会根据所依赖的“ProcessB”中所缺少的“ModeDeclaration”依赖的实际值刷新提示） 。

处理步骤

  1. 双击对应的错误描述信息，定位至报错具体位置。

  2. 根据业务需求，通过增删“ModeDeclaration”动作确保“ProcessB”存在一个“StateDependentStartupConfig”引用的“ModeDeclaration”包含当前有依赖关系（即存在元素“ProcessA.StateDependentStartupConfig.ExecutionDependency”）的“ProcessA.StateDependentStartupConfig”中引用到的所有“ModeDeclaration”，并保存修改。

报错信息

[constr_1693] Executable that is referenced by ProcessDesign shall also be referenced by Process that references ProcessDesign.

可能原因

“Process”元素配置中，“Executable”属性引用的“Executable”和“Design”属性引用的“ProcessDesign”中引用的“Executable”不是同一个。

处理步骤

  1. 双击对应的错误描述信息，定位至报错具体位置。

  2. 根据业务需求，使“Process”元素中“Executable”属性引用的“Executable”和“Process”元素中“Design”属性引用的“ProcessDesign”中引用的“Executable”保持一致，并保存修改。

报错信息

[constr_1698] Any particular SwcServiceDependency that is referenced in the role DiagnosticClearConditionPortMapping.swcServiceDependencyInExecutable shall only be aggregated in the role serviceDependency by an AdaptiveSwcInternalBehavior and aggregate a DiagnosticClearConditionNeeds.

可能原因

“DiagnosticClearConditionPortMapping”关联的“serviceDependency”没有配置聚合属性“DiagnosticClearConditionNeeds”.

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置（swcServiceDependencyInExecutable）。
  2. 找到“swcServiceDependencyInExecutable”属性“targetSwcServiceDepen”引用的“serviceDependency”，修改其“serviceNeed”为“DiagnosticClearConditionNeeds”类型。
  3. 保存配置。

报错信息

[constr_1700] Any particular SwcServiceDependency that is referenced in the role DiagnosticMemoryDestinationPortMapping.swcServiceDependencyInExecutable shall only be aggregated in the role serviceDependency by an AdaptiveSwcInternalBehavior and aggregate a DiagnosticEventInfoNeeds.

可能原因

“DiagnosticMemoryDestinationPortMapping”关联的“serviceDependency”没有配置聚合属性“DiagnosticEventInfoNeeds”.

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置（swcServiceDependencyInExecutable）。
  2. 找到“swcServiceDependencyInExecutable”属性“targetSwcServiceDepen”引用的“serviceDependency”，修改其“serviceNeed”为“DiagnosticEventInfoNeeds”类型。
  3. 保存配置。

报错信息

[constr_1701] Any particular SwcServiceDependency that is referenced in the role DiagnosticSecurityLevelPortMapping.swcServiceDependencyInExecutable shall only be aggregated in the role serviceDependency by an AdaptiveSwcInternalBehavior and aggregate a DiagnosticsCommunicationSecurityNeeds.

可能原因

“DiagnosticSecurityLevelPortMapping”关联的“serviceDependency”没有配置聚合属性“DiagnosticsCommunicationSecurityNeeds”.

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置（swcServiceDependencyInExecutable）。
  2. 找到“swcServiceDependencyInExecutable”属性“targetSwcServiceDepen”引用的“serviceDependency”，修改其“serviceNeed”为“DiagnosticsCommunicationSecurityNeeds”类型。
  3. 保存配置。

报错信息

[constr_1702] Any particular SwcServiceDependency that is referenced in the role DiagnosticServiceDataIdentifierPortMapping.swcServiceDependencyInExecutable shall only be aggregated in the role serviceDependency by an AdaptiveSwcInternalBehavior and aggregate a DiagnosticValueNeeds.

可能原因

“DiagnosticServiceDataIdentifierPortMapping”关联的“serviceDependency”没有配置聚合属性“DiagnosticValueNeeds”.

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置（swcServiceDependencyInExecutable）。
  2. 找到“swcServiceDependencyInExecutable”属性“targetSwcServiceDepen”引用的“serviceDependency”，修改其“serviceNeed”为“DiagnosticValueNeeds”类型。
  3. 保存配置。

报错信息

[constr_1704] Any particular SwcServiceDependency that is referenced in the role DiagnosticUploadDownloadPortMapping.swcServiceDependencyInExecutable shall only be aggregated in the role serviceDependency by an AdaptiveSwcInternalBehavior and aggregate a DiagnosticUploadDownloadNeeds.

可能原因

“DiagnosticUploadDownloadPortMapping”关联的“serviceDependency”没有配置聚合属性“DiagnosticUploadDownloadNeeds”.

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置（swcServiceDependencyInExecutable）。
  2. 找到“swcServiceDependencyInExecutable”属性“targetSwcServiceDepen”引用的“serviceDependency”，修改其“serviceNeed”为“DiagnosticUploadDownloadNeeds”类型。
  3. 保存配置。

报错信息

[constr_1727] The PhmSupervisedEntityInterface can be referenced only by RPortPrototype, and cannot be referenced by 'shortName'.

可能原因

“PhmSupervisedEntityInterface”被“PPortPrototype”或“PRPortPrototype”引用了。

处理步骤
  1. 双击对应的错误描述信息，定位至报错的“PPortPrototype”或“PRPortPrototype”项。
  2. 删除或修改引用了“PhmSupervisedEntityInterface项”的“PPortPrototype”或“PRPortPrototype”，“PhmSupervisedEntityInterface”只能被“RPortPrototype”引用。
  3. 根据业务需求修改，新增引用值为“PhmSupervisedEntityInterface”的“RPortPrototype”项，或修改已有“RPortPrototype”项的引用值为“PhmSupervisedEntityInterface”。
  4. 保存修改。

报错信息

[constr_1728] The PhmHealthChannelInterface can be referenced only by RPortPrototype, and cannot be referenced by 'shortName'.

可能原因

“PhmHealthChannelInterface”被“PPortPrototype”或“PRPortPrototype”引用了。

处理步骤
  1. 双击对应的错误描述信息，定位至报错的“PPortPrototype”或“PRPortPrototype”项。
  2. 删除或修改引用了“PhmHealthChannelInterface项”的“PPortPrototype”或“PRPortPrototype”，“PhmHealthChannelInterface”只能被“RPortPrototype”引用。
  3. 根据业务需求修改，新增引用值为“PhmHealthChannelInterface”的“RPortPrototype”项，或修改已有“RPortPrototype”项的引用值为“PhmHealthChannelInterface”。
  4. 保存修改。

报错信息

[constr_1729] The PhmRecoveryActionInterface can be referenced only by PPortPrototype, and cannot be referenced by 'shortName'.

可能原因

“PhmRecoveryActionInterface”被“PPortPrototype”或“PRPortPrototype”引用了。

处理步骤
  1. 双击对应的错误描述信息，定位至报错的“PPortPrototype”或“PRPortPrototype”。
  2. 删除或修改引用了“PhmRecoveryActionInterface”的“PPortPrototype”或“PRPortPrototype”项，“PhmRecoveryActionInterface”只能被“PPortPrototype”引用。
  3. 根据业务需求修改，新增引用值为“PhmRecoveryActionInterface”的“PPortPrototype”项，或修改已有“PPortPrototype”项的引用值为“PhmRecoveryActionInterface”。
  4. 保存修改。

报错信息

[constr_1730] For ClientServerOperation 'shortName ' referenced in PhmRecoveryActionInterface.recovery, the attributes Arguments, possibleApErrors, and possibleApErrorSets cannot be set, and fireAndForget must be set to 'True'.

可能原因

“PhmRecoveryActionInterface.recovery”中引用的“ClientServerOperation”项存在如下情况：

  • 配置了属性arguments、possibleApErrors或possibleApErrorSets。
  • 未配置属性fireAndForget，或fireAndForget值被配置为“False”。

处理步骤
  1. 双击对应的错误描述信息，定位至报错项“PhmRecoveryActionInterface.ClientServerOperation”。
  2. 将“ClientServerOperation”的属性 arguments、possibleApErrors、possibleApErrorSets 设置为空，并将 fireAndForget 属性值配置为“True”，并保存修改。

报错信息

[constr_1736] The attribute 'initialCheckpoint' of LogicalSupervision ('shortName') must be set.

可能原因

未配置“LogicalSupervision.initialCheckpoint”。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 根据业务需求，配置“LogicalSupervision.initialCheckpoint”属性值，并保存修改。

报错信息

[constr_1737] The attribute 'finalCheckpoint' of LogicalSupervision ('shortName') must be set.

可能原因

未配置“LogicalSupervision.finalCheckpoint”。

处理步骤
  1. 双击对应的错误描述信息，定位至报错的“LogicalSupervision”项。
  2. 根据业务需求，配置“LogicalSupervision.finalCheckpoint”属性值，并保存修改。

报错信息

[constr_1739] If logicalSupervision or deadlineSupervision of Localsupervision ('shortName') is set, Localsupervision.transition must be set.

可能原因

“Localsupervision”配置了属性logicalSupervision或deadlineSupervision，但未配置其属性transition。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 根据业务需求，选择如下解决方案：
    • 删除“LogicalSupervision”下的子元素 logicalSupervision 或 deadlineSupervision。
    • 为“LogicalSupervision”新增子元素 transition。
  3. 保存修改。

报错信息

[constr_1740] The attribute 'CheckpointTransition' of LogicalSupervision ('shortName') must be set.

可能原因

未配置“LogicalSupervision.CheckpointTransition”。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 根据业务需求，为“LogicalSupervision”新增子元素“CheckpointTransition”，并保存修改。

报错信息

[constr_1742] The PhmCheckpoint subelement of SupervisionCheckpoint ('shortName') must be set.

可能原因

报错“SupervisionCheckpoint”未配置子元素phmCheckpoint。

处理步骤
  1. 双击对应的错误描述信息，定位至报错的“SupervisionCheckpoint”项。
  2. 根据业务需求，为“SupervisionCheckpoint”新增子元素 phmCheckpoint，并保存修改。

报错信息

[constr_3176] The 'windowSizeValid' of ' E2EProfileConfiguration_shortName' must be an integer greater than or equal to 1.

可能原因

“E2EProfileConfiguration.windowSizeValid”值为小于1的数值。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 根据业务需求，将“E2EProfileConfiguration.windowSizeValid”值修改为大于等于1的数值，并保存修改。

报错信息

[constr_3177] When setting the 'E2EProfileConfiguration_shortName' parameter, the following condition must be met: maxErrorStateValid ≥ maxErrorStateInit ≥ maxErrorStateInvalid ≥ 0.

可能原因

同一“E2EProfileConfiguration”下的属性maxErrorStateValid、maxErrorStateInit和maxErrorStateInvalid三者的值不满足关系式：maxErrorStateValid ≥ maxErrorStateInit ≥ maxErrorStateInvalid ≥ 0。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 根据业务需求，修改maxErrorStateValid、maxErrorStateInit或maxErrorStateInvalid值，直至满足条件（maxErrorStateValid ≥ maxErrorStateInit ≥ maxErrorStateInvalid ≥ 0），并保存修改。

报错信息

[constr_3178] When setting the 'E2EProfileConfiguration_shortName' parameter, the following condition must be met: minOkStateInvalid ≥ minOkStateInit ≥ minOkStateValid ≥ 1

可能原因

同一“E2EProfileConfiguration”下的属性minOkStateValid、minOkStateInit和minOkStateInvalid三者的值不满足关系式：minOkStateInvalid ≥ minOkStateInit ≥ minOkStateValid ≥ 1。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 根据业务需求，修改minOkStateValid、minOkStateInit和minOkStateInvalid值，直至满足条件（minOkStateInvalid ≥ minOkStateInit ≥ minOkStateValid ≥ 1），并保存修改。

报错信息

[constr_3179] When setting the 'E2EProfileConfiguration_shortName' parameter, ensure that the sum value of 'minOkStateInit and maxErrorStateInit is not greater than the value of windowSizeValid'.

可能原因

同一“E2EProfileConfiguration”下的属性minOkStateInit、maxErrorStateInit和windowSizeValid三者的值不满足关系式：

minOkStateInit + maxErrorStateInit ≤ windowSizeValid。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 根据业务需求，修改minOkStateInit、maxErrorStateInit和windowSizeValid值，直至满足条件（

    minOkStateInit + maxErrorStateInit ≤ windowSizeValid），并保存修改。

报错信息

[constr_3180] When setting the 'E2EProfileConfiguration_shortName' parameter, ensure that the sum value of 'minOkStateValid' and 'maxErrorStateValid' is not greater than the value of 'windowSizeValid'.

可能原因

同一“E2EProfileConfiguration”下的属性minOkStateValid、maxErrorStateValid和windowSizeValid三者的值不满足关系式：minOkStateValid + maxErrorStateValid ≤ windowSizeValid。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 根据业务需求，修改minOkStateValid、maxErrorStateValid和windowSizeValid值，直至满足条件（minOkStateValid + maxErrorStateValid ≤ windowSizeValid），并保存修改。

报错信息

[constr_3181] When setting the 'E2EProfileConfiguration_shortName' parameter, ensure that the sum value of 'minOkStateInvalid' and 'maxErrorStateInvalid' is not greater than the value of windowSizeValid.

可能原因

同一“E2EProfileConfiguration”下的属性minOkStateInvalid、maxErrorStateInvalid和windowSizeValid三者的值不满足关系式：

minOkStateInvalid + maxErrorStateInvalid ≤ windowSizeValid。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 根据业务需求，修改minOkStateInvalid、maxErrorStateInvalid和windowSizeValid值，直至满足条件（minOkStateInvalid + maxErrorStateInvalid ≤ windowSizeValid），并保存修改。

报错信息

[constr_3290]The attribute transportProtocols of someipServiceInstanceToMachineMapping defined for a ProvidedSomeipServiceInstance must have at least 1 udpPort or tcpPort.

可能原因

serviceInstance属性中引用了“ProvidedSomeipServiceInstance”的“SomeipServiceInstanceToMachineMapping”，其udpPort和tcpPort都未配置属性值。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 根据具体业务需求配置“SomeipServiceInstanceToMachineMapping”元素的udpPort和tcpPort属性，两个属性至少配置一个，并保存修改。

报错信息

[constr_3296]The attribute transportProtocols of someipServiceInstanceToMachineMapping defined for a RequiredSomeipServiceInstance must have at least 1 udpPort or tcpPort.

可能原因

在serviceInstance属性中引用了“RequiredSomeipServiceInstance”的“SomeipServiceInstanceToMachineMapping”，其udpPort和tcpPort都未配置属性值。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 根据的具体业务需要配置“SomeipServiceInstanceToMachineMapping”元素的udpPort和tcpPort属性，两个属性至少配置一个，并保存修改。

报错信息

[constr_3297]SomeipServiceInstanceToMachineMapping supports only a single Address Family, that is either IPv4 or IPv6.

可能原因

“SomeipServiceInstanceToMachineMapping”元素的communicationConnector属性中所引用的“EthernetCommunicationConnector”，其所引用的“NetworkEndpoint”中，配置的“NetworkEndpointAddress”的类型不一样。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 找到“SomeipServiceInstanceToMachineMapping”元素的communicationConnector属性中所引用的“EthernetCommunicationConnector”元素的配置项位置。
  3. 修改“EthernetCommunicationConnector”元素的“NetworkEndpoint”属性所引用“NetworkEndpoint”的“NetworkEndpointAddress”的类型，使其都为“Ipv4Configuration”或“Ipv6Configuration”。
  4. 保存修改。

报错信息

[constr_3300] The Method referenced by ServiceInterfaceDeployment.MethodDeployments 'ddsMethodDeployment' must be defined in the ServiceInterface 'serviceInterface01'.

可能原因

“ServiceMethodDeployment”的“Method”属性的引用值（ddsMethodDeployment，MMC会根据实际引用值刷新提示）未在对应的“ServiceInterfaceDeployment”的“ServiceInterface”属性（serviceInterface01，MMC会根据属性实际引用的配置刷新提示）中定义。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 将“ServiceMethodDeployment”元素的“Method”属性的引用值在对应的“ServiceInterfaceDeployment”的“ServiceInterface”属性中定义，并保存修改。

报错信息

[constr_3301] The Event referenced by ServiceInterfaceDeployment.EventDeployments 'ddsEventDeployment' must be defined in the ServiceInterface 'serviceInterface01'.

可能原因

“ServiceEventDeployment”的“Event”属性的引用值（ddsEventDeployment，MMC会根据实际引用值刷新提示）未在对应的“ServiceInterfaceDeployment”的“ServiceInterface”属性（serviceInterface01，MMC会根据属性实际引用的配置刷新提示）中定义。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 将“ServiceEventDeployment”元素的“Event”属性的引用值在对应的“ServiceInterfaceDeployment”的“ServiceInterface”属性中定义，并保存修改。

报错信息

[constr_3302] The Field referenced by ServiceInterfaceDeployment.FieldDeployments 'ddsFieldDeployment' must be defined in the ServiceInterface 'serviceInterface01'.

可能原因

“ServiceFieldDeployment”的“Field”属性的引用值（ddsFieldDeployment，MMC会根据实际引用值刷新提示）未在对应的“ServiceInterfaceDeployment”的“ServiceInterface”属性（serviceInterface01，MMC会根据属性实际引用的配置刷新提示）中定义。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 将“ServiceFieldDeployment”元素的“Field”属性的引用值在对应的“ServiceInterfaceDeployment”的“ServiceInterface”属性中定义，并保存修改。

报错信息

[constr_3304] The value of attribute eventGroupId '16' must be unique in the context of the enclosing SomeipServiceInterfaceDeployment 'TestSomeipServiceInterfaceDeployment'.

可能原因

当“SomeipServiceInterfaceDeployment”元素配置了多个“SomeipEventGroup”时，归属于同一元素“SomeipServiceInterfaceDepolyment”的子元素“SomeipEventGroup”的eventGroupId值（16，MMC会根据实际配置的eventGroupId值提示）不唯一。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 将归属于同一元素“SomeipServiceInterfaceDeployment”的子元素“SomeipEventGroup”的eventGroupId属性配置不同的参数值，使其eventGroupId值唯一，并保存修改。

报错信息

[constr_3305]The value of attribute eventId must be unique and must be different from any methodId in the context of the enclosing SomeipServiceInterfaceDeployment.

可能原因
  1. “SomeipServiceInterfaceDeployment”的子元素“SomeipEventDeployment”元素的eventId属性值不唯一。
  2. “SomeipServiceInterfaceDeployment”的子元素“SomeipEventDeployment”的eventId属性值和子元素“SomeipMethodDeployment”的methodId属性值相同。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 针对原因1，将“SomeipServiceInterfaceDeployment”的子元素“SomeipEventDeployment”元素的eventId属性配置为不同的值，使其eventId值唯一。针对原因2，将“SomeipServiceInterfaceDeployment”的子元素“SomeipEventDeployment”的eventId属性值和子元素“SomeipMethodDeployment”的methodId属性值修改为不同值且唯一。
  3. 保存修改。

报错信息

[constr_3306]The value of attribute methodId conflicts with another methodId or eventId in the SomeipServiceInterfaceDeployment.

可能原因
  1. “SomeipServiceInterfaceDeployment.SomeipMethodDeployment.methodId”属性值不唯一。
  2. “SomeipServiceInterfaceDeployment”的子元素“SomeipEventDeployment”的eventId属性值和子元素“SomeipMethodDeployment”的methodId属性值相同。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 针对原因1，修改“SomeipServiceInterfaceDeployment.SomeipMethodDeployment.methodId”属性值，保证其唯一性。

    针对原因2，将报错的“SomeipServiceInterfaceDeployment”下“SomeipEventDeployment.eventId”属性值和“SomeipMethodDeployment.methodId”属性值修改成不同的值，并且需要保证“SomeipMethodDeployment.methodId”属性值唯一。

  3. 保存修改。

报错信息

[constr_3307] If SomeipServiceInterfaceDeployment.SomeipEventDeployment.transportProtocol is set to udp, then each ProvidedSomeipServiceInstance that refers to the SomeipServiceInterfaceDeployment shall only be mapped to a MachineDesign through a SomeipServiceInstanceToMachineMapping with udpPort configured.

可能原因

目标元素“SomeipServiceInstanceToMachineMapping”的serviceInstance聚合属性引用了“ProvidedSomeipServiceInstance”，此“ProvidedSomeipServiceInstance”关联了“SomeipServiceInterfaceDeployment”的子元素“SomeipEventDeployment”，子元素“SomeipEventDeployment”的transportProtocol属性配有值“UDP”，但目标元素“SomeipServiceInstanceToMachineMapping”中没有配置“UdpPort”。

处理步骤

  1. 双击对应的错误描述信息，定位至报错具体位置。

  2. 根据业务需求为“SomeipServiceInstanceToMachineMapping”元素配置对应“UdpPort”端口号，并保存修改。

报错信息

[constr_3308] If SomeipServiceInterfaceDeployment.SomeipEventDeployment.transportProtocol is set to tcp, then each ProvidedSomeipServiceInstance that refers to the SomeipServiceInterfaceDeployment shall only be mapped to a MachineDesign through a SomeipServiceInstanceToMachineMapping with tcpPort configured.

可能原因

目标元素“SomeipServiceInstanceToMachineMapping”的serviceInstance聚合属性引用了“ProvidedSomeipServiceInstance”，此“ProvidedSomeipServiceInstance”关联了“SomeipServiceInterfaceDeployment”的子元素“SomeipEventDeployment”，子元素“SomeipEventDeployment”的transportProtocol属性配有值“TCP”，但目标元素“SomeipServiceInstanceToMachineMapping”中没有配置“TcpPort”。

处理步骤

  1. 双击对应的错误描述信息，定位至报错具体位置。

  2. 根据业务需求为“SomeipServiceInstanceToMachineMapping”元素配置对应“TcpPort”端口号，并保存修改。

报错信息

[constr_3309] If SomeipServiceInterfaceDeployment.SomeipMethodDeployment.transportProtocol is set to udp, then each ProvidedSomeipServiceInstance that refers to the SomeipServiceInterfaceDeployment shall only be mapped to a MachineDesign through a SomeipServiceInstanceToMachineMapping with udpPort configured.

可能原因

目标元素“SomeipServiceInstanceToMachineMapping”的serviceInstance聚合属性引用了“ProvidedSomeipServiceInstance”，此“ProvidedSomeipServiceInstance”引用的“SomeipServiceInterfaceDeployment”包含transportProtocol属性值为“UDP”的子元素“SomeipMethodDeployment”，但目标元素“SomeipServiceInstanceToMachineMapping”中没有配置“UdpPort”。

处理步骤

  1. 双击对应的错误描述信息，定位至报错具体位置。

  2. 根据业务需求为“SomeipServiceInstanceToMachineMapping”元素配置对应“UdpPort”端口号，并保存修改。

报错信息

[constr_3310] If SomeipServiceInterfaceDeployment.SomeipMethodDeployment.transportProtocol is set to tcp, then each ProvidedSomeipServiceInstance that refers to the SomeipServiceInterfaceDeployment shall only be mapped to a MachineDesign through a SomeipServiceInstanceToMachineMapping with tcpPort configured.

可能原因

目标元素“SomeipServiceInstanceToMachineMapping”的serviceInstance聚合属性引用了“ProvidedSomeipServiceInstance”，此“ProvidedSomeipServiceInstance”引用的“SomeipServiceInterfaceDeployment”包含transportProtocol属性值为“TCP”的子元素“SomeipMethodDeployment”，但目标元素“SomeipServiceInstanceToMachineMapping”没有配置“TcpPort”。

处理步骤

  1. 双击对应的错误描述信息，定位至报错具体位置。

  2. 根据业务需求为“SomeipServiceInstanceToMachineMapping”元素配置对应“TcpPort”端口号，并保存修改。

报错信息

[constr_3350] If an event is referenced by a SomeipEventDeployment in the role event and the attribute SomeipEventDeployment.serializer is set to signalBased then there shall exist a ServiceInstanceToSignalMapping with eventElementMapping referring to the event in the role dataPrototypeInServiceInterfaceRef.

可能原因

“SomeipEventDeployment”引用了一个“Event”，且“SomeipEventDeployment.serializer”属性被设置为“SIGNAL-BASED”，而“ServiceInstanceToSignalMapping”下eventElementMapping的dataPrototypeInServiceInterfaceRef没引用到具体的“Event”。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 配置“ServiceInstanceToSignalMapping”下的eventElementMapping的dataPrototypeInServiceInterfaceRef，确保其引用了具体的“Event”，然后保存配置。

报错信息

[constr_3351] Attribute SomeipEventDeployment.maximumSegmentLength must only be used if the value of attribute SomeipEventDeployment.transportProtocol is set to udp.

可能原因

“SomeipEventDeployment”的“Transport Protocol”属性值为“TCP”，且“Maximum Segment Length”已被设置。

处理步骤
  1. 双击对应的错误描述信息，定位至报错的具体位置。
  2. 修改“SomeipEventDeployment”的“Transport Protocol”属性，将其配置为“UDP”。

    或将该“SomeipEventDeployment”删除，然后重新配置，在重新配置过程中不配置“Maximum Segment Length”。

  3. 保存修改。

报错信息

[constr_3352] If the ServiceInstanceToSignalMapping refers to a ProvidedSomeipServiceInstance and the dataPrototypeInServiceInterfaceRef refers to a VariableDataPrototype which is part of a composite data type then there shall exist an SignalBasedEventElementToISignalTriggeringMapping for every VariableDataPrototype which is part of the composite data type. Here, the data type (''data_shortName'') must be mapping.

可能原因

“ServiceInstanceToSignalMapping”引用了“ProvidedSomeipServiceInstance”，并且dataPrototypeInServiceInterfaceRef引用了“DataPrototype”（“Event”的复合数据类型的一部分），而没有为每个“DataPrototype”配置“SignalBasedEventElementToISignalTriggeringMapping”。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 在“ServiceInstanceToSignalMapping”下，新增子元素“SignalBasedEventElementToISignalTriggeringMapping”，再通过dataPrototype属性新增“PortInterfaceElementInImplementationDatatypeRef”元素，targetDataPrototype引用data_shortName，rootDataPrototype设置为“ServiceInstanceToSignalMapping”指向的“ProvidedSomeipServiceInstance”所关联的“Event”，直到完成“Event”引用的结构体中数据成员的映射。然后，保存配置。

示例如下：

Pre_set:
ProvidedSomeipServiceInstance->EventDeployment -> testEvent-> struct1
struct1
  a:bool
  b:struct2
struct2:
  x:uint32_t
ServiceInstanceToSignalMapping
  serviceInstance: ProvidedSomeipServiceInstance
  aMapping-> aggr:SignalBasedEventElementToISignalTriggeringMapping
PortInterfaceElementInImplementationDatatypeRef
   rootDataPrototype: testEvent
   targetDataPrototype: a
bMapping-> aggr:SignalBasedEventElementToISignalTriggeringMapping
PortInterfaceElementInImplementationDatatypeRef
   rootDataPrototype: testEvent
   targetDataPrototype: x

报错信息[1]

[constr_3353] An ApSomeipTransformationProps.sizeOfArrayLengthField can only be set to 0, 1, 2, or 4.

报错信息[2]

[constr_3353] If a field is referenced by a SomeipFieldDeployment in the role field and that SomeipFieldDeployment aggregates a SomeipEventDeployment in the role notifier and the SomeipEventDeployment has an attribute SomeipEventDeployment.serializer set to signalBased then there shall exist a ServiceInstanceToSignalMapping with a fieldMapping referring to the field in the role dataPrototypeInServiceInterfaceRef and the SignalBasedFieldToISignalTriggeringMapping shall refer to a ISignalTriggering in the role notifierSignalTriggering.

可能原因
  • [1] “ApSomeipTransformationProps.sizeOfArrayLengthField”值不为0、1、2或4。
  • [2] “SomeipFieldDeployment”引用了一个Field，且配置“SomeipFieldDeployment.notify”时，“SomeipEventDeployment.serializer”属性设置为“SIGNAL-BASED”。但是，在配置“ServiceInstanceToSignalMapping”时，未将其下的fieldMapping的dataPrototypeInServiceInterfaceRef引用具体的Field，或未将“SignalBasedFieldToISignalTriggeringMapping.notifierSignalTriggering”引用“ISignalTriggering”。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 根据实际报错原因选择如下解决方案，并保存修改。
    • [1] 配置“ApSomeipTransformationProps.sizeOfArrayLengthField”值为0、1、2或4。
    • [2] 配置“ServiceInstanceToSignalMapping”，将其下的“fieldMapping”的dataPrototypeInServiceInterfaceRef引用具体的Field，或将“SignalBasedFieldToISignalTriggeringMapping.notifierSignalTriggering”引用到“ISignalTriggering”。

报错信息

[constr_3354] An ApSomeipTransformationProps.sizeOfStructLengthField can only be set to 0, 1, 2, or 4.

可能原因

“ApSomeipTransformationProps.sizeOfStructLengthField”值不为“0”、“1”、“2”或“4”。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置（“ApSomeipTransformationProps”）。
  2. 修改“ApSomeipTransformationProps.sizeOfStructLengthField”值为“0”、“1”、“2”或“4”，并保存修改。

报错信息

[constr_3355] An ApSomeipTransformationProps.sizeOfUnionLengthField can only be set to 0, 1, 2, or 4.

可能原因

“ApSomeipTransformationProps.sizeOfUnionLengthField”值不为“0”、“1”、“2”或“4”。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置（“ApSomeipTransformationProps”）。
  2. 修改“ApSomeipTransformationProps.sizeOfUnionLengthField”值为“0”、“1”、“2”或“4”，并保存修改。

报错信息

[constr_3356] An ApSomeipTransformationProps.alignment can only be set to 8, 16, 32, 64, 128, or 256.

可能原因

“ApSomeipTransformationProps.alignment”值不为“8”、“16”、“32”、“64”、“128”或“256”。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置（ApSomeipTransformationProps）。
  2. 修改“ApSomeipTransformationProps.alignment”值为“8”、“16”、“32”、“64”、“128”或“256”，并保存修改。

报错信息

[constr_3357] An ApSomeipTransformationProps.sizeOfUnionTypeSelectorField can only be set to 1, 2, or 4.

可能原因

“ApSomeipTransformationProps. sizeOfUnionTypeSelectorField”值不为“1”、“2”或“4”。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置（“ApSomeipTransformationProps”）。
  2. 修改“ApSomeipTransformationProps.sizeOfUnionTypeSelectorField”值为“1”、“2”或“4”，并保存修改。

报错信息

[constr_3359] The RPortPrototypeProps shall be aggregated only by a RPortPrototype.

可能原因

“RPortPrototypeProps”的父元素不是“RPortPrototypes”。

处理步骤
  1. 双击对应的错误描述信息，定位至报错的具体位置。
  2. 根据具体业务需求将“RPortPrototypeProps”聚合在“RPortPrototype”下关联使用，并保存修改。

报错信息[1]

[constr_3361] When a data type in ServiceInterface (Method, Field, Event)  is associated with SomeipDataPrototypeTransformationProps, the other data types in the same layer as this data type must be serialized, that is, associated with SomeipDataPrototypeTransformationProps.

报错信息[2]

[constr_3361] If an argument in the ClientServerOperation ('shortName') is referenced by PortInterfaceElementInImplementationDatatypeRef, all arguments (for example, 'argument_shortName') in the 'shortName' attribute have to be referenced by PortInterfaceElementInImplementationDatatypeRef.

可能原因

对某一数据类型配置了序列化属性，但同层其他数据类型没有配置序列化属性。

示例结构体如下：

  event
   type: structure
structure
   sub1/innerStructure
        innerSub1/INT8
        innerSub2/String
   sub2/bool

若为structure内的INT8配置了序列化属性，即：聚合属性“SomeipDataPrototypeTransformationProps.DataPrototypeInServiceInterfaceRef.PortInterfaceElementInImplementationDatatypeRef”：

  • “rootDataPrototype”设置为“event”
  • “targetDataPrototype”设置为“innerSub1”
  • “contextDataPrototype”设置为“structure/sub1”

则必须选择以下方法，完成配置。

  • 方法：为同层的innerSub2配置序列化属性
    • “rootDataPrototype”设置为“event”
    • “targetDataPrototype”设置为“innerSub2”
    • “contextDataPrototype”设置为“structure/sub1”

处理步骤
  1. 双击对应的错误描述信息，定位至报错的具体位置。
  2. 按照如下对应方案解决：
    • 请勿为“PortInterfaceElementInImplementationDatatypeRef”下的同层其他数据类型配置序列化属性，即，确保同层的其他数据类型均已被引用到“PortInterfaceElementInImplementationDatatypeRef”中，然后保存配置。
    • 为argument_shortName配置SOME/IP序列化。即新增元素“SomeipDataPrototypeTransformationProps. PortInterfaceElementInImplementationDatatypeRef. PortInterfaceElementInImplementationDatatypeRef”，并为“PortInterfaceElementInImplementationDatatypeRef”的属性“rootDataPrototype”设置值为argument_shortName，然后保存配置。

报错信息

[constr_3362] The event attribute of SomeipEventDeployment under SomeipFieldDeployment.notifier cannot be configured.

可能原因

配置了“SomeipFieldDeployment”元素的notifier子元素“SomeipEventDeployment”中的event属性。

处理步骤

  1. 双击对应的错误描述信息，定位至报错具体位置。

  2. 根据业务需求删除在“SomeipFieldDeployment”下的子元素“SomeipEventDeployment”中的event属性配置，并保存修改。

报错信息

[constr_3363] The method attribute of SomeipMethodDeployment under SomeipFieldDeployment.set/get ‘XXX’ cannot be configured.

可能原因

在“SomeipFieldDeployment”元素的set或get（XXX，MMC会根据实际配置“SomeipFieldDeployment.set/get”的具体实例刷新提示）属性中引用的“SomeipMethodDeployment”元素，其配置了method属性。

处理步骤

  1. 双击对应的错误描述信息，定位至报错具体位置。

  2. 删除被引用的“SomeipMethodDeployment”下的method属性配置，并保存修改。

报错信息

[constr_3372] An ApSomeipTransformationProps.sizeOfStringLengthField can only be set to 0, 1, 2, or 4.

可能原因
  1. “ApSomeipTransformationProps.sizeOfStringLengthField”值不为“0”、“1”、“2”或“4”。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置（“ApSomeipTransformationProps”）。
  2. 修改“ApSomeipTransformationProps.sizeOfStringLengthField”值为“0”、“1”、“2”或“4”，并保存修改。

报错信息

[constr_3374] A method with attribute fireAndForget set to true shall not have any inout or out arguments.

可能原因

“Method”的“FireAndForget”属性值为“true”时，对应的direction属性值为“INOUT”或者“OUT”。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 将对应的direction属性值配置为“IN”，并保存修改。

报错信息

[constr_3375] A method that has attribute fireAndForget set to the value true is not allowed to reference an ApApplicationError in role possibleApError, or reference APApplicationErrorSet in possibleApErrorSet.

可能原因
  1. 当method（“ClientServerOperation”）的“Fire And Forget”属性值为“true”时，在possibleApError中引用了“ApApplicationError”。
  2. 当method（“ClientServerOperation”）的“Fire And Forget”属性值为“true”时，在possibleApErrorSet中引用了“APApplicationErrorSet ”。
  3. 当method（“ClientServerOperation”）的“Fire And Forget”属性值为“true”时，在possibleApError中引用了“ApApplicationError”，且在possibleApErrorSet中引用了“APApplicationErrorSet ”。

处理步骤
  1. 双击对应的错误描述信息，定位至报错的具体位置。
  2. 根据业务需求选择如下方式处理：
    • 删除possibleApError或“APApplicationErrorSet”属性引用配置，两个属性同时存在时同时删除即可。
    • 将“Method”元素的fireAndForget属性配置为“false”。
  3. 保存修改。

报错信息

[constr_3393] Usage of shallRunOn and shallNotRunOn references (The ProcessorCore that is referenced by a ProcessToMachineMapping in the role shallRunOn or shallNotRunOn shall be aggregated by the Machine that is referenced in the role machine by the same ProcessToMachineMapping).

可能原因

对于给定的“ProcessToMachineMapping”，shallRunOn或者shallNotRunOn中定义的“ProcessorCore”不全都是该“ProcessToMachineMapping”对应的“Machine”的子元素。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 将“ProcessToMachineMapping”中引用的shallRunOn或shallNotRunOn中定义的“ProcessorCore”都为该“ProcessToMachineMapping”对应的“Machine”的子元素，并保存修改。

报错信息

[constr_3395] The event, method, and field referenced under the same TransformationPropsToServiceInterfaceElementMapping must belong to the same ServiceInterface.

可能原因

“TransformationPropsToServiceInterfaceElementMapping”引用的event、method和field来自于多个“ServiceInterface”。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 修改“TransformationPropsToServiceInterfaceElementMapping”下的event、method和field属性的引用值，确保引用值来自同一个“ServiceInterface”，并保存修改。

报错信息

[constr_3396] Within the context of a given Process, no two StateDependentStartupConfigs shall refer to the same ModeDeclaration 'XXX' in functionGroupState.

可能原因

在同一“Process”下，存在两个“StateDependentStartupConfigs”分别配置了子元素functionGroupState，并且它们的子元素functionGroupState分别引用了相同的“ModeDeclaration ”（'XXX'，MMC会根据实际引用的“ModeDeclaration”实例提示）。

处理步骤

  1. 双击对应的错误描述信息，定位至报错具体位置。

  2. 根据业务需求，重新引用报错functionGroupState中引用的“ModeDeclaration”，保证每个“Process.StateDependentStartupConfigs”下的子元素functionGroupState引用的功能组不冲突。

报错信息

[constr_3408]The value of eventId shall be in the range of 0..32767.

可能原因

“SomeipEventDeployment”元素的eventId属性值范围未在[0,32767]之内。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 修改“SomeipEventDeployment”元素的eventId属性值，配置的eventId属性值需要在[0,32767]之内，并保存修改。

报错信息

[constr_3409] The value of methodId ranges from 0 to 32767.

可能原因

“SomeipMethodDeployment”元素的methodId属性值范围未在[0,32767]之间。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 修改“SomeipMethodDeployment”元素的methodId属性值，将methodId属性值设置在[0,32767]之间，并保存修改。

报错信息

[constr_3410] The value of SomeipServiceInterfaceDeployment.serviceInterfaceId is a 16-bit unsigned integer and ranges from 0 to 57343，or 57601 to 65534.

可能原因

“SomeipServiceInterfaceDeployment.serviceInterfaceId”属性值不在取值范围[0,57343]或[57601,65534]内。

处理步骤

  1. 双击对应的错误描述信息，定位至报错具体位置。

  2. 修改目标“SomeipServiceInterfaceDeployment.serviceInterfaceId”属性值，保证其值在[0,57343]或[57601,65534]范围内，并保存修改。

报错信息

[constr_3415] The value of loadBalancingPriority must be in the range of 0..65535.

可能原因

“ProvidedSomeipServiceInstance”元素的loadBalancingPriority属性值范围不在[0,65535]内。

处理步骤
  1. 双击对应的错误描述信息，定位至报错的具体位置。
  2. 根据具体业务需求将“ProvidedSomeipServiceInstance”的loadBalancingPriority属性的取值范围配置为[0,65535]，并保存修改。

报错信息

[constr_3416] The value of loadBalancingWeight must be in the range of 0..65535.

可能原因

“ProvidedSomeipServiceInstance”元素的loadBalancingWeight属性值范围不在[0,65535]内。

处理步骤
  1. 双击对应的错误描述信息，定位至报错的具体位置。
  2. 根据具体业务需求将“ProvidedSomeipServiceInstance”的loadBalancingWeight属性的取值范围配置为[0,65535]，并保存修改。

报错信息

[constr_3419] The UdpNmNetworkConfiguration that is aggregated by UdpNmCluster in the role networkConfiguration shall have ipv4MulticastIpAddress.

可能原因

“UdpNmCluster.UdpNmNetworkConfiguration”没有配置ipv4MulticastIpAddress。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 为目标“UdpNmCluster.UdpNmNetworkConfiguration”配置ipv4MulticastIpAddress属性值，并保存修改。

报错信息

[constr_3423] Each StateDependentStartupConfig of a Process shall reference at least one ModeDeclaration in functionGroupState.

可能原因
  1. 目标“Process”的子元素“StateDependentStartupConfig”中没有配置“ModeInMachineInstanceRef”项。
  2. 目标“Process”子元素“StateDependentStartupConfig”下存在“ModeInMachineInstanceRef”项，但“ModeInMachineInstanceRef”中没有配置“TargetModeDeclaration”属性。

处理步骤

  1. 双击对应的错误描述信息，定位至报错具体位置。

  2. 根据业务需求，配置“StateDependentStartupConfig”子元素“ModeInMachineInstanceRef”（functionGroupState下），并为“ModeInMachineInstanceRef.TargetModeDeclaration”属性引用所需“ModeDeclaration”功能状态，并保存修改。

报错信息

[constr_3424] A StateDependentStartupConfig shall never reference the ModeDeclaration that has the shortName Off in the role functionGroupState.

可能原因

在“StateDependentStartupConfig”的子元素functionGroupState中，存在引用了shortName为“Off”的“ModeDeclaration”的functionGroupState。

处理步骤
  1. 双击对应的错误描述信息，将定位到报错具体位置。
  2. 根据具体业务需求将该functionGroupState引用其他shortName不为“Off”的“ModeDeclaration”，并保存修改。

报错信息

[constr_3429] CppImplementationDataType of category VARIANT is not allowed to aggregate a templateArgument that points to an Allocator in the role allocator.

可能原因

“CppImplementationDataTypes”的category属性值为“VARIANT”，且其下的子元素templateArgument的allocator属性未设置为空。

处理步骤
  1. 双击对应的错误描述信息，定位至报错的具体位置。
  2. 将templateArgument的allocator属性配置为空，或将“CppImplementationDataTypes”的category属性值更改为非“VARIANT”，并保存修改。

报错信息

[constr_3433] When CppImplementationDataType.category is set to ARRAY, templateArgument must be configured.

可能原因

“StdCppImplementationDataType”元素的category属性配置为“ARRAY”时，没有配置子元素“TemplateArgument”。

处理步骤

  1. 双击对应的错误描述信息，定位至报错具体位置。

  2. 根据业务需求，配置“StdCppImplementationDataType”的子元素“TemplateArgument”，并保存修改。

报错信息

[constr_3434] When CppImplementationDataType.category is set to VECTOR, templateArgument must be configured.

可能原因

“StdCppImplementationDataType”元素的category属性值为“VECTOR”时，没有配置子元素“TemplateArgument”。

处理步骤

  1. 双击对应的错误描述信息，定位至报错具体位置。

  2. 根据业务需求，配置“StdCppImplementationDataType”的子元素“TemplateArgument”，并保存修改。

报错信息

[constr_3443] The definition of a namespace for a StdCppImplementationDataType of category VALUE is not allowed. For this value of category the std namespace is already assumed by the usage of the StdCppImplementationDataType.

可能原因

在category属性值为“VALUE”的“StdCppImplementationDataType”元素下配置了namespace。

处理步骤
  1. 双击对应的错误描述信息，定位至报错的具体位置。
  2. 删除“StdCppImplementationDataType”下的“SymbolProps”，或者修改“StdCppImplementationDataType”的category，使其不为“VALUE”，并保存修改。

报错信息

[constr_3447] The sizeOfArrayLengthField of an ApSomeipTransformationProps can be set to 0 only when all the SomeipDataPrototypeTransformationProps elements that reference this ApSomeipTransformationProps do not have reference values of the Vector or ASSOCIATIVE_MAP data type.

可能原因

一个“SomeipDataPrototypeTransformationProps”下不存在属于“VECTOR”或“ASSOCIATIVE_MAP”数据类型的引用值，但其引用了“ApSomeipTransformationProps”，且此“ApSomeipTransformationProps”的sizeOfArrayLengthField属性值为“0”。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置（“ApSomeipTransformationProps”）。
  2. 根据业务需求，选择合适的方式处理：

    方式一：修改“ApSomeipTransformationProps.sizeOfArrayLengthField”值为“0”，并保存修改。

    方式二：修改报错关联的category为“VECTOR”或“ASSOCIATIVE_MAP”的数据类型配置项，保证category值非“VECTOR”或“ASSOCIATIVE_MAP”，或者找到报错“ApSomeipTransformationProps”关联的“SomeipDataPrototypeTransformationProps”，在其子元素“PortInterfaceElementInImplementationDatatypeRef”中删除对该数据类型的引用，并保存配置。

报错信息

[constr_3485] For a ServiceInstanceToMachineMapping, if the ServiceInstanceToMachineMapping.secureComPropsForUdp references the TlsSecureComProps, the "serviceInstance" cannot reference the ProvidedApServiceInstance and RequiredApServiceInstance at the same time.

可能原因

“ServiceInstanceToMachineMapping.secureComPropsForUdp”引用了“TlsSecureComProps”，且“ServiceInstanceToMachineMapping”的serviceInstance同时引用了“ProvidedApServiceInstance”和“RequiredApServiceInstance”两个元素。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 配置“ServiceInstanceToMachineMapping”的serviceInstance，确保没有同时引用“ProvidedApServiceInstance”和“RequiredApServiceInstance”，然后保存配置。

报错信息

[constr_3486] For a ServiceInstanceToMachineMapping, if the ServiceInstanceToMachineMapping.secureComPropsForTcp references the TlsSecureComProps, the "serviceInstance" cannot reference the ProvidedApServiceInstance and RequiredApServiceInstance at the same time.

可能原因

“ServiceInstanceToMachineMapping.secureComPropsForTcp”引用了“TlsSecureComProps”，且“ServiceInstanceToMachineMapping”的serviceInstance同时引用了“ProvidedApServiceInstance”和“RequiredApServiceInstance”这两个元素。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 配置“ServiceInstanceToMachineMapping”的serviceInstance，确保没有同时引用“ProvidedApServiceInstance”和“RequiredApServiceInstance”，然后保存配置。

报错信息

[constr_3487] If TransportProtocol is set to tcp for ServiceInterfaceDeployment referenced by ProvidedSomeipServiceInstance and that referenced by RequiredSomeipServiceInstance, then ServiceInstanceToMachineMapping cannot reference ProvidedSomeipServiceInstance and RequiredSomeipServiceInstance at the same time.

可能原因

存在一个“ProvidedSomeipServiceInstance”和一个“RequiredSomeipServiceInstance”都引用了transportProtocol属性值为“tcp”的“ServiceInterfaceDeployment”，并在一个“ServiceInstanceToMachineMapping”元素中同时引用了此“RequiredSomeipServiceInstance”和“ProvidedSomeipServiceInstance”。

处理步骤

  1. 双击对应的错误描述信息，定位至报错具体位置。

  2. 根据业务需求修改“ServiceInstanceToMachineMapping”的引用，确保引用的“ProvidedSomeipServiceInstance”和“RequiredSomeipServiceInstance”两者引用的“ServiceInterfaceDeployment”的“TransportProtocol”属性值不都为“tcp”。

    也可以修改“ProvidedSomeipServiceInstance”或“RequiredSomeipServiceInstance”引用的“ServiceInterfaceDeployment”的“TransportProtocol”属性值，保证两者不同时为“tcp”。

  3. 保存修改。

报错信息

[constr_3495] The value range of 'DoIpInstantiation.eid' must be [0,0xFFFFFFFFFFFF].

可能原因

“DoIpInstantiation.eid”值不在取值范围内。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 将“DoIpInstantiation.eid”配置为[0，0xFFFFFFFFFFFF]，并保存配置。

报错信息

[constr_3496] The value range of 'DoIpInstantiation.gid' must be [0,0xFFFFFFFFFFFF].

可能原因

“DoIpInstantiation.gid”值不在取值范围内。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 将“DoIpInstantiation.gid”配置为[0，0xFFFFFFFFFFFF]，并保存配置。

报错信息

[constr_3497] The 'DoIpInstantiation.maxRequestBytes' is mandatory and the value range must be [0,4294967295].

可能原因

“DoIpInstantiation.maxRequestBytes”值未配或不在取值范围内。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 将“DoIpInstantiation.maxRequestBytes”配置为[0，4294967295]，并保存配置。

报错信息

[constr_3499] The value range of 'DoIpRequestConfiguration.startAddress' must be (0,65535].

可能原因

“DoIpRequestConfiguration.startAddress”值不在取值范围内。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 将“DoIpRequestConfiguration.startAddress”配置为（0，65535]，并保存配置。

报错信息

[constr_3527] The PhmLogicalExpression ('shortName') cannot be referenced by multiple PhmRule '[shortName1, shortName2]'.

可能原因

目标“PhmLogicalExpression”被多个“PhmRule”引用。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 根据业务需求，修改相关引用值“PhmRule”的“Expression”属性值，保证每个“PhmRule.expression”都配置了不同的引用值（“PhmLogicalExpression”），并保存修改。

报错信息[1]

[constr_3528] The value of domainId of DdsProvidedServiceInstance 'DdsProvidedServiceInstance' must be in the range of 0 to 1, or 11 to 63.

报错信息[2]

[constr_3528] The value of domainId of 'DdsRequiredServiceInstance' must be in the range of 0 to 63.

可能原因
  • [1]：“DdsProvidedServiceInstance.domainId”属性值不在取值范围[0,1]或[11,63]内。
  • [2]：“DdsRequiredServiceInstance.domainId”属性值不在取值范围[0,63]内。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 按照如下对应方案解决：
    • [1]：修改“DdsProvidedServiceInstance.domainId”属性值，确保在取值范围[0,1]或[11,63]内，并保存修改。
    • [2]：修改“DdsRequiredServiceInstance.domainId”属性值，确保在取值范围[0,63]内，并保存修改。

报错信息

[constr_3529] The value of DdsProvidedServiceInstance.serviceInstanceId shall be in the range of 0..65534.

可能原因

“DdsProvidedServiceInstance.serviceInstanceId”值不在取值范围[0,65534]内。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 将“DdsProvidedServiceInstance.serviceInstanceId”值修改到取值范围[0,65534]内，并保存修改。

报错信息

[constr_3537] The LocalSupervision ('shortName') cannot be refrenced by multi GlobalSupervisions '[shortName1, shortName2]'.

可能原因

目标“LocalSupervision”被多个“GlobalSupervision.localSupervision”所引用。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 根据业务需求，修改相关“GlobalSupervision.localSupervision”引用值，保证各引用值唯一性，即各“GlobalSupervision.localSupervision”都引用不同的“LocalSupervision”，并保存修改。

报错信息

[constr_3538] Multiple ServiceInstanceToMachineMappings configured with the same CommunicationConnector cannot reference the same AdaptivePlatformServiceInstance.

可能原因

引用了同一个“CommunicationConnector”的多个“ServiceInstanceToMachineMapping”元素同时引用了同一个“AdaptivePlatformServiceInstance”。

说明：“ServiceInstanceToMachineMapping”包含“SomeipServiceInstanceToMachineMapping”和“DdsServiceInstanceToMachineMapping”；“AdaptivePlatformServiceInstance”包含“ProvidedApServiceInstance”和“RequiredApServiceInstance”。

处理步骤

  1. 双击对应的错误描述信息，定位至报错具体位置。

  2. 根据业务需求修改报错“ServiceInstanceToMachineMapping”元素的“CommunicationConnector”属性，使不同的“ServiceInstanceToMachineMapping”引用不同的“CommunicationConnector”。

    或修改报错“ServiceInstanceToMachineMapping”元素的serviceInstance聚合属性，使“ServiceInstanceToMachineMapping”元素所引用的serviceInstance不存在相同的引用。

  3. 保存修改。

报错信息

[constr_3539] The SupervisionCheckpoint ('shortName') cannot be refrenced by multi AliveSupervisions '[shortName1, shortName2]'.

可能原因

目标“SupervisionCheckpoint”被多个“AliveSupervision”所引用。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 根据业务需求，重新设置各个报错“AliveSupervisionCheckpoint”引用值，保证此引用值唯一，即一个“SupervisionCheckpoint”只能被一个“AliveSupervision”引用，并保存修改。

报错信息

[constr_3540] The SupervisionCheckpoint ('shortName') referenced by the attributes initialCheckpoint, finalCheckpoint, transition.source or transition.target of LogicalSupervision cannot be referenced by other LogicalSupervisions '[shortName1, shortName2]'

可能原因

一个“LogicalSupervision”下的initialCheckpoint、finalCheckpoint、“Transition.source”、“Transition.target”中引用的“SupervisionCheckpoint”，同时被其他“LogicalSupervision”引用。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 根据业务需求，修改被“LogicalSupervision”重复引用的“SupervisionCheckpoint”，保证各“LogicalSupervision”下引用的“SupervisionCheckpoint”唯一，并保存修改。

报错信息

[constr_3541]qosProfile of DdsProvidedServiceInstance must be set.

可能原因

“DdsProvidedServiceInstance”元素的qosProfile属性未配置属性值。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 配置“DdsProvidedServiceInstance”元素的qosProfile属性值，并保存修改。

报错信息

[constr_3542]qosProfile of DdsRequiredServiceInstance must be set.

可能原因

“DdsRequiredServiceInstance”元素的qosProfile属性未配置属性值。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 配置“DdsRequiredServiceInstance”元素的qosProfile属性值，并保存修改。

报错信息

[constr_5000] The value range of 'DoIpRequestConfiguration.endAddress' must be (0,65535].

可能原因

“DoIpRequestConfiguration.endAddress”值不在取值范围内。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 将“DoIpRequestConfiguration.endAddress”配置为（0，65535]，并保存配置。

报错信息

[constr_5004] Each Process shall be mapped by a ProcessToMachineMapping to one Machine.

可能原因

“Process”没有通过“ProcessToMachineMapping”与任何一个“Machine”进行映射。

处理步骤

  1. 双击对应的错误描述信息，定位至报错具体位置。

  2. 根据业务需求，在目标“Process”下配置“ProcessToMachineMapping”元素，并配置其“Process”和“Machine”属性，分别引用本“Process”下的process和映射的machine，并保存修改。

报错信息

[constr_5047] The value of a TlsSecureComProps.category can only be TLS_SERVER or TLS_CLIENT.

可能原因

“TlsSecureComProps.category”配置的值为非规定的字符。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. “TlsSecureComProps.category”配置为“TLS_SERVER”或“TLS_CLIENT”，并保存配置。

报错信息

[constr_5048] For a TlsSecureComProps, when the TlsSecureComProps.category is set to TLS_SERVER, the TlsCryptoCipherSuite aggregation element shall meet at least one of the following conditions:
A TlsCryptoCipherSuite.certificate is referenced by a CryptoServiceCertificate.
The TlsPskIdentity element is added for the preceding aggregation element and referenced by a CryptoServiceKey.

可能原因

“TlsCryptoCipherSuite.certificate”没有引用“CryptoServiceCertificate”，且“TlsPskIdentity”没有引用“CryptoServiceKey”。

处理步骤
  1. 双击对应的错误描述信息，定位至报错具体位置。
  2. 为“TlsCryptoCipherSuite.certificate”引用“CryptoServiceCertificate”，或为“TlsPskIdentity”引用“CryptoServiceKey”，然后保存配置。

报错信息

[constr_5052] Multiple SOME/IP AdaptivePlatformServiceInstances that reference the same SomeipServiceInterfaceDeployment cannot be mapped to the same IP address or port number through SomeipServiceInstanceToMachineMapping.

可能原因
  1. 目标“SomeipServiceInstanceToMachineMapping”元素中serviceinstance聚合属性中存在引用了相同“SomeipServiceInterfaceDeployment”的“AdaptivePlatformServiceInstances”。
  2. 存在两个及以上配置了相同“CommunicationConnector”和端口号（即tcpPort或udpPort）的“SomeipServiceInstanceToMachineMapping”元素的serviceinstance聚合属性引用了相同“SomeipServiceInterfaceDeployment”的“AdaptivePlatformServiceInstances”。

处理步骤

  1. 双击对应的错误描述信息，定位至报错具体位置。

  2. 根据业务需求修改报错“SomeipServiceInstanceToMachineMapping”元素的端口号或者修改该元素的“CommunicationConnector”属性引用值，使不同的“ServiceInstanceToMachineMapping”元素引用不同的“CommunicationConnector”，且每个“CommunicationConnector”绑定的“IPAddress”也不同，并保存修改。

报错信息

[constr_5239] The value of CryptoKeySlotContentAllowedUsage.allowedKeyslotUsage is out of the specified range.

可能原因

“CryptoKeySlotContentAllowedUsage.allowedKeyslotUsage”不在规范的范围内。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置（“CryptoKeySlotContentAllowedUsage”）。
  2. 配置“CryptoKeySlotContentAllowedUsage.allowedKeyslotUsage”在规范的范围内，并保存修改。

报错信息

[constr_6300] For 'E2EProfileConfiguration_shortName' that is associated with DdsProvidedServiceInstance or ProvidedSomeipServiceInstance, its 'maxDeltaCounter' should be set to the maximum value of the mapping data type.

可能原因

被“DdsProvidedServiceInstance”或“ProvidedSomeipServiceInstance”引用的“E2EProfileConfiguration”，其maxDeltaCounter属性值未被设置为如下数据类型对应的最大值。

  • PROFILE_04：65535（UINT16_MAX）
  • PROFILE_05：255（UINT8_MAX）
  • PROFILE_06：255（UINT8_MAX）
  • PROFILE_07：4294967295（UINT32_MAX）
  • PROFILE_11：255（UINT8_MAX）
  • PROFILE_22：255（UINT8_MAX）

例如：若“E2EProfileConfiguration.profileName”值为“PROFILE_04”，则对应的最大值为“65535”。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置“E2EProfileConfiguration”。
  2. 根据业务需求，修改“E2EProfileConfiguration.maxDeltaCounter”的值为对应数据类型的最大值（如“65535”），并保存修改。

报错信息

[constr_6301] The 'windowSizeInvalid' value of 'profile_6301_warning_01' must be a positive integer not greater than that of 'windowSizeValid'.

可能原因

同一“E2EProfileConfiguration”下的属性windowSizeInvalid和windowSizeValid不满足关系式：windowSizeInvalid ≤ windowSizeValid。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 根据业务需求，修改windowSizeInvalid或windowSizeValid值，直至满足条件（windowSizeInvalid ≤ windowSizeValid），并保存修改。

报错信息

[constr_6302] The 'windowSizeInit' of 'E2EProfileConfiguration_shortName' must be a positive integer not greater than that of 'windowSizeValid'.

可能原因

同一“E2EProfileConfiguration”下的属性windowSizeInit和windowSizeValid不满足关系式：windowSizeInit ≤ windowSizeValid。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置。
  2. 根据业务需求，修改windowSizeInit或windowSizeValid值，直至满足条件（windowSizeInit ≤ windowSizeValid），并保存修改。

报错信息

[constr_3412] An OsModuleInstantiation in the Machine shall own at least one ResourceGroup.

可能原因

在Machine中的OsModuleInstantiation没设置ResourceGroup。

处理步骤
  1. 双击对应的错误描述信息，定位至所提示的错误项的具体位置OsModuleInstantiation。
  2. 为OsModuleInstantiation配置一个ResourceGroup，保存配置。
父主题： Constraints错误


Schema告警

句式

Element 'XXX' must have no element [children], and the value must be valid.

举例

ARData00002: The XML description is not valid with respect to the AUTOSAR XML schema: cvc-complex-type.2.2: Element 'CATEGORY' must have no element [children], and the value must be valid.

描述

表示“XXX”（CATEGORY）属性的值必须配置为一个有效值。

如果不配置，或配置无效的值都会报此错误。

可能原因

“XXX”（CATEGORY）属性值没有配置或者配置值为无效值（正确有效值请参考AUTOSAR官方提供的Manifest文档）。

处理步骤
  1. 双击告警信息行跳转到对应的ARXML文件中。
  2. 判断告警元素是否为工程必备元素。
    • 如果该元素（CATEGORY）没有实际作用，则直接删除。
    • 如果该元素（CATEGORY）是工程中必备的元素，则将其配置为正确的值。

句式

Invalid content was found starting with element 'XXX' .

举例

ARData00002: The XML description is not valid with respect to the AUTOSAR XML schema: cvc-complex-type.2.4.a: Invalid content was found starting with element 'IMPLEMENTATION-DATA-TYPE-EXTENSION'

描述

表示“XXX”（IMPLEMENTATION-DATA-TYPE-EXTENSION）标签是一个无效的标签，系统无法识别。

可能原因

可能是AUTOSAR版本不兼容造成的，或者使用的标签不符合AUTOSAR规范。

处理步骤
  1. 双击告警信息跳转到对应的ARXML文件中。
  2. 将告警元素（IMPLEMENTATION-DATA-TYPE-EXTENSION）以及其下的所有属性全部删除。如图1所示，删除并重新配置红色框中所有元素。
图1 告警元素

句式

Invalid content was found starting with element 'XXX' . No child element is expected at this point.

举例

ARData00002: The XML description is not valid with respect to the AUTOSAR XML schema: cvc-complex-type.2.4.d: Invalid content was found starting with element 'FRAG-SIZE'. No child element is expected at this point.

描述

表示“XXX”（FRAG-SIZE）元素不是期望的子元素。

可能原因

可能的原因是“XXX”（FRAG-SIZE）元素不是AUTOSAR规范定义的元素，可能是自定义的元素，不在AUTOSAR规范内，请确认这些元素的来源，不在规范内的元素不能够直接使用MMC配置，建议删除这些元素。

处理步骤
  1. 双击告警信息跳转到对应的ARXML文件中。
  2. 确认告警元素的来源，不在AUTOSAR规范内的元素不能够直接使用MMC配置，建议删除这些元素。

    如图2所示，删除红色框内元素内容。
图2 告警元素

句式

Attribute 'XXX' must appear on element 'YYY'.

举例

ARData00002: The XML description is not valid with respect to the AUTOSAR XML schema: cvc-complex-type.4: Attribute 'DEST' must appear on element 'SERVICE-INTERFACE-REF'.

描述

表示“YYY”（SERVICE-INTERFACE-REF）元素标签中必须带有“XXX”（DEST）标签。

可能原因

“YYY”（SERVICE-INTERFACE-REF）元素标签中缺少“XXX”（DEST）标签。

处理步骤
  1. 双击告警信息行跳转到对应的ARXML文件中。
  2. 将“XXX”（DEST）标签及相关属性值添加到“YYY”（SERVICE-INTERFACE-REF）标签中。

    如图3所示，“SERVICE-INTERFACE-REF”标签不能单独出现，它必须带有“DEST”标签以及其属性值。将“DEST”标签及相关属性值添加到“SERVICE-INTERFACE-REF”'标签中即可消除告警信息。“DEST”标签的属性值需要依据“SERVICE-INTERFACE-REF”应用对象的类型确定，本例子中“SERVICE-INTERFACE-REF”标签的引用对象类型为SOMEIP-SERVICE-INTERFACE-DEPLOYMENT，所以将“DEST”标签赋值为DEST=“SOMEIP-SERVICE-INTERFACE-DEPLOYMENT”。
图3 告警元素

句式

Value 'XXX' is not facet-valid with respect to enumeration '[YYY, ZZZ]' . It must be a value from the enumeration.

举例

ARData00002: The XML description is not valid with respect to the AUTOSAR XML schema: cvc-enumeration-valid: Value 'in' is not facet-valid with respect to enumeration '[IN, INOUT, OUT]'. It must be a value from the enumeration.

描述

表示属性值“XXX”（in）不是规定的枚举类型。

可能原因

枚举值不在系统定义的范围内，导致系统无法识别。

处理步骤
  1. 双击告警信息跳转到对应的ARXML文件中。
  2. “XXX”（in）修改成“YYY”或者“ZZZ”（IN/INOUT/OUT其一）。

句式

Value '' is not facet-valid with respect to pattern '(0[xX][0-9a-fA-F]+)|(0[0-7]+)|(0[bB][0-1]+)|(([+\-]?[1-9][0-9]+(\.[0-9]+)?|[+\-]?[0-9](\.[0-9]+)?)([eE]([+\-]?)[0-9]+)?)|\.0|INF|-INF|NaN' for type 'XXXX'.

举例

ARData00002: The XML description is not valid with respect to the AUTOSAR XML schema: cvc-pattern-valid: Value '' is not facet-valid with respect to pattern '[a-zA-Z][a-zA-Z0-9_]*' for type 'CATEGORY-STRING--SIMPLE'.

描述

表示属性值命名不符合规范。

可能原因

属性值没有配置或者命名不符合规范。

处理步骤
  1. 双击告警信息跳转到对应的ARXML文件中。
  2. 根据告警提示信息上的正则表达式规则修改告警信息。如图4所示，例子中CATEGORY属性没有配置导致的告警，告警提示信息中[a-zA-Z][a-zA-Z0-9_]*的正则表达式说明“CATEGORY”的命名必须以字母开头，且整个名字只能由现字母和数字组成（需要对正则表达式有一定了解），根据提示可以将“CATEGORY”配置为一个符合规范的名字。如果CATEGORY属性没有被使用，也可以直接删除<CATEGORY></CATEGORY>标签。
图4 告警元素
父主题： AP常见报错处理


FAQ

  • MMC解压完启动异常
  • 如何解决在Properties界面配置属性值后，重复出现错误弹窗情况
  • 如何解决启动MMC报错的问题
  • 如何解决MMC功能缺失的问题
  • 如何解决新建工程中的AUTOSAR文件被同名文件覆盖后，使用AUTOSAR示例编辑器打开或AUTOSAR Explorer展开未同步更新的问题
  • 导入文件夹时软件长时间未响应
  • 用户导入的arxml文件较大导致软件卡顿的问题
父主题： MDC Manifest Configurator 使用指南


MMC解压完启动异常

问题现象

在启动MMC时，提示如下报错，且无法打开工具。

  • 报错提示一：

  • 报错提示二：

  • 报错提示三：

原因分析

问题发生的可能原因如下。

  • 针对提示一：工具解压不完整。
  • 针对提示二：启动工具的用户权限低于解压工具的用户权限。
  • 针对提示三：使用的工作空间被已经打开的MMC或其他工具所占用。

处理步骤

  • 针对原因一：先删除现有安装包，重新解压安装压缩包。
  • 针对原因二：使用解压的用户再次启动工具。
  • 针对原因三：替换或新建当前MMC的工作空间。
  • 其他原因请联系华为技术支持处理。
父主题： FAQ


如何解决在Properties界面配置属性值后，重复出现错误弹窗情况

问题

在MMC的“Properties”窗口修改属性值后，不断出现如下错误弹窗，影响正常的属性配置。

回答

解决方案如下：
  1. 关闭当前“Properties”视图。
  2. 在界面上方菜单栏中选择“Window > Show View > Properties”，在新打开的“Properties”窗口中进行属性编辑。

另外，可以参考如下两种方法避免上述问题。

  • 在“Properties”窗口中单击需要修改的属性值，输入正确的预期值，再按“Enter”。
  • 右键单击目标工程，并选择“Modular Configurator”，在打开的模块化界面中进行元素属性的增删改查。

父主题： FAQ


如何解决启动MMC报错的问题

问题

如何处理在启动MMC时，提示报错，无法打开工具的情况？

回答

  • 当启动MMC时，弹出如下报错提示，可能原因为工具解压不完整，请先删除先有安装包，重新解压安装压缩包。

  • 当启动MMC时，弹出如下报错提示，可能原因为启动工具的用户权限低于解压工具的用户权限，请保证启动用户和解压用户一致。

  • 当启动MMC时，弹出如下提示，可能原因为使用的工作空间被已经打开的工具所占用，请替换或新建工作空间。

父主题： FAQ


如何解决MMC功能缺失的问题

问题

如何解决MMC工具栏中缺失本文档所描述的功能的问题？

回答

重新解压安装MMC。

父主题： FAQ


如何解决新建工程中的AUTOSAR文件被同名文件覆盖后，使用AUTOSAR示例编辑器打开或AUTOSAR Explorer展开未同步更新的问题

问题

新建工程中的AUTOSAR文件被同名文件覆盖后，使用AUTOSAR示例编辑器打开或AUTOSAR Explorer展开未同步更新。

回答

解决方案如下：

  • 方案一：再次完成文件覆盖的操作，并使用AUTOSAR示例编辑器或AUTOSAR Explorer查看同步情况。
  • 方案二：重启工程。
    1. 右键单击目标工程，选择“Close Project”，关闭工程。
    2. 右键单击该工程，选择“Open Project”，打开工程。
    3. 使用AUTOSAR示例编辑器或AUTOSAR Explorer查看同步情况。
父主题： FAQ


导入文件夹时软件长时间未响应

问题

导入文件夹时软件长时间未响应。

回答

可能是选择的文件夹过大或者层级过深（例如：根目录），请重新选择文件夹。

规格：100MB

父主题： FAQ


用户导入的arxml文件较大导致软件卡顿的问题

问题

用户导入的arxml文件较大导致软件卡顿的问题。

回答

可能是由于内存不够导致软件卡顿，解决方法是在MMC工具根目录中找到mdc_manifest_configurator.ini文件，添加如下内容，指定软件执行时的JVM内存。

示例：--launcher.XXMaxPermSize 256m -vmargs -Xms128m -Xss4m -XX:MaxPermSize=256m -Xmx4096m

父主题： FAQ


常用首选项配置参考

配置专家模式属性视图

通过配置专家模式属性视图，可以开启语义选项卡和默认选项卡，用于配置元模型定义的属性。

  1. 在顶部菜单栏选择“Windows > Preferences”，进入首选项配置界面。

  2. 配置专家模式属性视图。
    1. 选择“Sirius > Sirius Properties View”，进入专家模式属性视图配置界面。
    2. 开启传统选项卡。
      • 勾选“Show Semantic Tab”：开启语义选项卡。
      • 勾选“Show Default Tab”：开启默认选项卡。
    3. （可选）配置选项卡名称的最大大小，单位为字符，默认为20字符。
    4. 单击“Apply and Close”，保存配置。

  3. 配置相应的选项卡。
    • 配置语义选项卡。

      打开配置画布，在画布中选择目标元素，并在下方“Properties”窗口中单击“Semantic”选项卡，配置元模型定义的属性。

    • 配置默认选项卡。

      在“MMC Explorer”视图中选择目标元素，并在下方“Properties”窗口中单击“Default”选项卡，配置元模型定义的属性。

父主题： MDC Manifest Configurator 使用指南


MDC Development Studio 使用指南

本文档详细描述了使用MDC Development Studio开发车载应用软件的过程和常用操作指导。

  • 认识MDC Development Studio
  • 准备工作
  • 启动MDS
  • （可选）激活License
  • 了解MDS工作界面
  • 以MDC工程开发AP应用
  • 以SCFI工程开发AP应用
  • 常用操作指导
  • FAQ


认识MDC Development Studio

  • 产品概述
  • 关键概念
父主题： MDC Development Studio 使用指南


产品概述

MDC Development Studio（下文简称MDS）是一款面向智能驾驶或辅助驾驶系统开发者的集成开发工具，主要用于智能驾驶计算平台的应用开发，提供了代码自动生成、编译构建、运行调试、性能分析、内存检查和覆盖率报告等功能。

  • 当前智能驾驶计算平台提供的SDK及配套工具遵循AUTOSAR Adaptive Platform的19-11标准版本，相关标准及细则请参见官网。
  • MDS工具基于Eclipse平台开发，主要涉及Eclipse CDT基础功能，如需下载安装第三方软件，请使用Eclipse官方平台。
  • 安装第三方插件时，请确保软件来源可靠。
图1 MDS组件

MDS支持以软件为中心的快速迭代开发模式，具备以下功能：

  • 自动代码生成：支持通过输入的ARXML配置文件自动生成对应的代码和配置文件。
  • 工程管理：支持创建或导入一个工程，并根据需求配置工程属性。
  • 代码编辑：支持引用查看、宏展开、函数跳转、自定义代码块、智能补全、即时显错等功能。
  • 编译构建：支持cmake安全构建方式。
  • 运行调试：支持远程在计算平台系统环境中运行和调试工程。
  • 内存分析：检测发现代码中内存相关的问题。
  • 性能分析：支持分析查看应用运行期间的关键信息。
  • 覆盖率报告：包括行覆盖率，函数覆盖率和分支覆盖率。
  • 图形化打包工具：支持生成用户应用包和主机厂集成软件包。
父主题： 认识MDC Development Studio


关键概念

  • 软件开发工具链
  • AUTOSAR Adaptive Platform
父主题： 认识MDC Development Studio


软件开发工具链

为构建智能驾驶计算平台开发生态系统，计算平台提供了一套高效便捷、灵活开放和安全可信的工具链，其覆盖了软件开发集成、调测、标定、路测仿真及故障诊断等汽车安全的研发生命周期。软件开发集成工具主要包括本文描述的应用开发工具MDC Development Studio（下文简称MDS），以及配置文件开发工具MDC Manifest Configurator（下文简称MMC）和AI集成开发工具MindStudio，它们协同开发关系如图1所示。

图1 计算平台工具链

MDC Development Studio

MDS是计算平台的IDE（Integrated Development Environment）集成开发工具，主要用来进行源码编辑、编译、调试和性能调优等。其还有一个很重要的功能，是以计算平台的配置工具MMC输出的ARXML文件作为输入，通过代码自动生成功能生成计算平台软件与智能驾驶应用软件之间的通信框架代码，智能驾驶功能软件和应用软件再基于生成的通信框架代码进行独立开发。

MDC Manifest Configurator

MMC是计算平台配置文件的配置工具，用于配置计算平台软件系统（由计算平台软件、智能驾驶功能软件和应用软件组成）。其遵循了AUTOSAR Adaptive Platform规范，对软件进行了服务化设计和抽象化设计，并对抽象后的参数进行配置，输出“.arxml”格式文件，可作为MDS工具代码生成功能的输入。

MindStudio

MindStudio是AI（Artificial Intelligence）算子开发和AI模型管理工具，支持把基于TensorFlow、Caffe等框架生成的神经网络模型转换为可以在计算平台芯片上执行的网络模型。

MindStudio还支持AI仿真和AI性能分析功能，使用详情请参见《MindStudio用户指南》。

父主题： 关键概念


AUTOSAR Adaptive Platform

AUTOSAR Adaptive Platform（下文简称AP）基于ECU（Electronic Control Unit）微处理器的标准化平台，支持高智能驾驶场景、车载和车外高速通信功能，提供高性能计算、通讯机制和灵活的软件配置。

智能驾驶计算平台不仅要求软件满足严格的完整性和安全性，还需要随着外部系统的发展在车辆生命周期内迭代更新。故在AUTOSAR应用开发过程中，需要调用AP平台提供通信管理（CM，Communication Management）功能和执行管理（EM，Execution Management）功能，并使用AP平台提供的各类配置文件（DDS协议配置、SOME/IP协议配置等）进行应用部署和运行。

MDS中的代码生成功能可以根据用户输入的ARXML文件，解析生成AUTOSAR应用所需要的AP平台接口代码和配置文件。MDS具体的输入和输出如图1所示。

  • 输入：输入的ARXML文件需要满足AUTOSAR Manifest Specification的规范定义。图中ARXML文件的模块划分为计算平台的系统框架设计：Machine Manifest（物理机或虚拟机配置）、System Manifest（系统配置）、Service Instance Manifest（服务接口配置）和Application Manifest（应用配置）。在实际配置过程中，用户可根据实际业务需求决定是否将模块配置存放于一个ARXML文件中。
  • 输出：
    • 接口代码文件指定“generated”文件路径输出，生成的接口代码以C++实现，主要是AUTOSAR CM、PHM等模块的通信框架的接口封装，包括“.cpp”源文件和“.h”头文件。
    • 配置文件指定“outputcfg”文件路径输出，生成的配置文件主要是AUTOSAR底层通信协议相关的配置，包括JSON文件和XML文件。
图1 MDS工具的输入与输出
父主题： 关键概念


准备工作

  • 系统要求
  • 获取软件
  • 搭建编译环境
父主题： MDC Development Studio 使用指南


系统要求

为避免因工程过大、运行过频造成的运行缓慢或内存溢出，运行MDS工具的PC须安装X86_64 Ubuntu20.04（桌面版）的操作系统，且最低满足表1要求。

表1 系统要求

项目

说明

内存

8GB

CPU
  • Intel六代酷睿i5
  • 4核
  • 2.5GHz

空闲磁盘空间

40GB

网卡

传输速率千兆

系统语言

en_US.UTF-8

系统缩放与布局

100%
父主题： 准备工作


获取软件

  1. 登录华为技术支持网站。
  2. 在网站首页选择“智能汽车解决方案 > 智能驾驶”，进入“智能驾驶”页面。
  3. 下载MDS安装包。

    1. 在“智能驾驶”页面选择“MDC Development Tool”。
    2. 单击“软件”页签，选择目前软件包所属版本。
    3. 在软件列表中，下载MDC_Development_Studio-{version}-Ubuntu{osversion}.tar.gz和对应的数字签名证书。

  4. 下载版本配套的配置编译环境所需的软件包。

    1. 返回“智能驾驶”页面，选择对应的产品形态入口，如“MDC 610”。
    2. 单击“软件”页签，选择目前软件包所属版本。
    3. 在软件列表中，下载所需软件包与其对应的数字签名证书。

      先下载并解压MDC_KIT-{version}-{type}.tar.gz，并在解压完的“mdc_devel”和“mdc_tool”目录下获取表1中对应的软件包。

      表1 软件包列表

      软件包a

      说明

      MDC_SDK-{version}-Ubuntu{osversion}-llvm-{type}.tar.gz

      二次开发包，包含llvm编译器、编译框架和平台ARXML文件。

      MDC_AOS_rpmlist-{version}-llvm-{type}.tar.gz

      第三方库包。

      MDC_Codegen_SDK-{version}-Ubuntu{osversion}.tar.gz

      生成代码和配置文件的功能依赖。

      a：

      • 请根据实际操作系统版本获取对应{osversion}的软件包。
      • 针对SDK包和rpm包，{type}为dev的包为调试阶段的增量包，在Development版本中需要同时安装{type}为prod和dev的包。

  5. 请参考下载网页上的《OpenPGP验证指南与工具》，对软件包进行PGP数字签名校验。数字签名证书可用于对软件包的完整性验证。如果校验失败，请不要使用该软件包，先联系华为技术支持工程师解决。

    使用软件包安装/升级之前，也需要按上述过程先验证软件包的数字签名，确保软件包未被篡改。

解压软件包

  1. 在软件包安装目录，右键单击空白处选择“打开终端”。

    安装目录不能包含中文和空格。

  2. 建议使用非root用户解压软件包。

    tar -zxf MDC_Development_Studio-{version}-Ubuntu{osversion}.tar.gz

父主题： 准备工作


搭建编译环境

  • 搭建交叉编译环境：具体请参见工具适配的MDC计算平台设备对应产品文档中“编译环境搭建指南 > 搭建编译环境”章节。

    若需要安装第三方库，请参见工具适配的MDC计算平台设备对应产品文档中“编译环境搭建指南 > 安装第三方库”章节。

  • 对于MDC 610/620产品，如需搭建本地编译环境，请参见工具适配的MDC计算平台设备对应产品文档中“调测指南（X86平台环境） > ... > 安装与启停”章节。
父主题： 准备工作


启动MDS

建议使用普通用户启动MDS。

操作步骤

  1. 在MDS安装目录中双击软件图标 [image] ，运行MDS。
  2. 选择工作空间。

    1. 在“Workspace”处确认工作空间路径。
    2. （可选）勾选弹窗左下角“Use this as the default and do not ask again”，以方便后续使用。
    3. 单击“Launch”。

    • 请勿将工作空间目录设置为MDS的安装目录，或名称带有空格/特殊字符的目录。
    • MDS不能与其他工具共用同一工作空间。
    • 针对版本升级过的MDS，可能存在工作空间兼容性问题，建议创建新工作空间。

父主题： MDC Development Studio 使用指南


（可选）激活License

请向华为技术支持工程师获取MDS License文件，并在有效期内使用。

操作步骤

  1. 首次启动MDS未激活License或者超过宽限期时，会自动弹出图1。如果没有自动跳出License管理界面，请在界面上方菜单栏中选择“Help > License Manager”，进入“License Manager”管理窗口。

    图1 License管理窗口

    表1 Information页签的参数解释

    信息栏

    参数

    说明

    License Information

    No.

    销售项序号

    Item

    销售项名称

    Expiration Date

    过期时间

    Grace Period

    宽限天数

    ESN Information

    ESN

    显示当前正在使用的License文件中的ESN信息。若未导入过License文件，显示“Please activate license”。

  2. 在“License Manager”窗口下“Control”页签中单击“Browse...”按钮，在弹出的文件选择框中选择License文件。

    图2 导入License

    License文件需小于1M且为合法License文件，否则将激活失败。

  3. 导入License文件后，单击“Verify”进行合法性校验。

    • 校验成功：返回信息“Verify successful”。
    • 校验失败：返回错误信息。

      若校验失败，请用户对License文件进行检查并重新申请下载正确的License文件。

  4. 单击“Apply”进行激活。

    • 激活成功：返回提示信息“Successful activation”。
    • 激活失败：返回提示信息“Activation fails！Please verify the activation file！”。

  5. 激活成功后将在“Information”页签下显示License文件相关信息。

    • 临时性License文件信息如图3所示。
      图3 License信息

    • 永久性License文件信息如图4所示。
      图4 License信息

  6. 单击“Confirm”完成激活。
父主题： MDC Development Studio 使用指南


了解MDS工作界面

首次进入MDS，工作界面显示如下：

在菜单栏中选择“Window > Perspective > Reset Perspective...”，可将当前透视图重置为其默认布局。工具默认布局说明如下：

此处介绍了开发过程中常用的工具，对于不熟悉使用方法的工具可以悬停在工具按钮上，通过显示的Tips查看工具功能。

视图区域 | 视图/工具说明
菜单栏 | MDS工具全菜单。
工具栏 | 用于一键生成代码和配置文件。
 | 用于一键刷新Targets节点。
 | 用于一键编译工程。
 | 用于一键运行工程，可以在右侧 [image] 栏，选择所需远程配置项或新建远程配置项。
 | 用于一键调试工程，可以在右侧 [image] 栏，选择所需远程配置项或新建远程配置项。
 | 用于创建各类工程/文件。
 | 用于生成用户应用包。
 | 用于生成主机厂集成软件包。
 | 用于SCFI工程的各类功能。
 | 用于Perf性能分析。
 | 用于全局搜索，按照关键字进行全局搜索。
 | 用于切换其他透视图。
 | 用于切换当前透视图。
资源管理视图 | 显示当前集成环境中加载的所有项目和各个项目的文件列表。
编辑器 | 编写代码或者文件之处。在菜单栏中选择“Window > Preferences > C/C++ > Editor”，可以自定义代码编辑器。
大纲视图 | 显示当前活动编辑器中所打开文件的纲要，如函数、变量等。
控制台视图 | 打印各类日志信息。
父主题： MDC Development Studio 使用指南


以MDC工程开发AP应用

MDS支持智能驾驶计算平台的AP（AUTOSAR Adaptive Platform）应用开发，本节提供了相关开发功能的操作指导。

  • 开发流程
  • 创建MDC工程
  • 导入MDC工程
  • 配置MDC工程属性
  • 生成代码和配置文件
  • 新建AP模板
  • 构建工程
  • 远程运行工程
  • 远程调试工程
  • 远程测试工程
  • MDC工程Perf性能分析
  • Memcheck内存分析
  • Asan内存分析
父主题： MDC Development Studio 使用指南


开发流程

  1. 创建或导入一个MDC工程，具体操作请参见创建MDC工程或导入MDC工程。
  2. （可选）配置MDC工程属性，包括Toolchain、CMake等属性设置，具体操作请参见配置MDC工程属性。
  3. 自动生成代码和配置文件，具体操作请参见生成代码和配置文件。
  4. （可选）创建AP模板，方便进行和业务相关的代码开发，具体操作请参见新建AP模板；使用编辑器编辑代码，编辑器主要功能请参见C/C++编辑器。
  5. 检视代码并构建工程。

    进行编译配置，并选择对应的编译器构建工程。请参见构建工程。

  6. 开始远程运行或调测工程，具体操作请参见远程运行工程或远程调试工程/远程测试工程。

    如需在运行过程中进行性能或内存分析，具体操作请参见MDC工程Perf性能分析或Memcheck内存分析章节。

父主题： 以MDC工程开发AP应用


创建MDC工程

操作步骤

  1. 启动MDS。
  2. 打开MDC工程配置窗口。

    • 在界面上方菜单栏中选择“File > New > MDC Project”。
    • 若MDS中无工程，可在 [image] 视图中选择 [image] 。

  3. 命名工程。

    在“New MDC Project”弹窗“Project name”处输入工程名称，此处以“mdc_project”为例。

    • 工程名不能包含中文和特殊字符。
    • 工程名不能使用CMakeLists中已声明的依赖库名称。

  4. 配置工程的SDK。

    • 下拉选择适配版本的SDK，SDK说明如下：

      SDK路径

      说明

      clang-aos_sea-aarch64-/usr/local/mdc_sdk/dp_sea/mdc_cross_compiler

      支持使用clang编译、运行在AOS（arm）系统安全执行区（Safety Exe Area ，下文简称SEA ）的MDC工程。

      clang-aos_gea-aarch64-/usr/local/mdc_sdk_llvm/dp_gea/mdc_cross_compiler

      支持使用clang编译、运行在AOS （arm）系统的MDC工程。

      clang-aos_sea-aarch64-/usr/local/mdc_sdk_llvm/dp_sea/mdc_cross_compiler

      支持使用clang编译、运行在AOS（arm）系统安全执行区（Safety Exe Area ，下文简称SEA ）的MDC工程。

      gcc-linux-x86-/opt/platform/mdc_platform

      支持使用gcc编译、运行在Ubuntu 20.04（x86）系统的MDC工程。
    • 使用自定义SDK，参考如下操作：
      1. 单击“Edit...”。
      2. 在“Core Build Configuration”弹窗中单击“Add...”，导入自定义SDK。
      3. 选中导入的自定义SDK，并单击 [image] ，即可在workspace空间下创建MDC工程。

  5. （可选）导入ARXML文件。

    1. 在“New MDC Project”窗口中单击 [image] 。
    2. 在出现的如下界面中单击 [image] ，在弹窗中选择“.arxml”文件所在路径，并单击“OK”。

  6. 完成MDC工程的创建，并查看生成工程的目录结构。

    1. 单击 [image] ，即完成工程创建。
    2. 在 [image] 视图中展开“mdc_project”工程目录。

      自动生成的配置文件的说明如下：

      配置文件

      说明

      工程名/modules/CMakeLists.txt

      用于自动添加子模块，具体配置说明请参考新建AP模板。

      工程名/tests/CMakeLists.txt

      用于自动添加子模块，具体操作请参考远程测试工程。

      工程名/CMakeLists.txt

      自动调用通用AP库公用变量。

父主题： 以MDC工程开发AP应用


导入MDC工程

本节介绍如何通过MDS的工程导入功能快速创建MDC工程，即将已有代码工程导入MDS后成为MDC工程，实现不同开发环境下工程的迁移。

  • 建议待导入的MDC工程大小≤1G，否则可能因文件过大导致工具无法继续正常运行。

    当工具因导入文件过大卡住时，可尝试重启恢复。

  • 建议非MDC工程代码及配置文件的总大小≤5GB，文件夹目录深度≤100层，否则可能导致工具无法继续正常运行。

    当工具因文件夹目录过深导致响应过慢时，请减少目标文件夹目录层级，并尝试重新导入。

操作步骤

  1. 在界面上方菜单栏中选择“File > Import...”。
  2. 在“Select”弹窗中选择“MDC > Import as a MDC Project”，再单击 [image] 。

  3. 单击“Browse...”导入已有MDC工程，参考如下说明选择参数，再单击 [image] 。

    • （推荐）不勾选“Create link in workspace”：拷贝工程并导入MDS，单击 [image] ，跳转至步骤4。
    • 勾选“Create link in workspace”：直接从选择的工程路径中打开工程，跳转至步骤5。

  4. （可选）参考创建MDC工程，设置工程名和SDK。
  5. （可选）确认SDK。当如下Select SDK栏中SDK为空或显示不是所需SDK时，请下拉选择所需SDK。

  6. 工程导入成功后，可在 [image] 视图查看导入工程目录。
父主题： 以MDC工程开发AP应用


配置MDC工程属性

通过设置属性配置项方式，实现SDK的切换或编译及构建相关属性的个性化配置。

请勿随意破坏或修改工程文件（如后缀为.project、..cproject的文件），否则可能会导致工程不可用。

前提条件

MDS中已存在MDC工程。

操作步骤

  1. 打开MDC工程的属性配置窗口。

    在 [image] 视图中，右键单击目标MDC工程，并选择“Properties”。

  2. 配置Toolchain属性。

    1. 在属性配置窗口左侧导航栏中，选择“Build & Execution > Toolchains”。

    2. 在打开的“Toolchains”页签中，可参考如下设置说明修改Toolchains默认配置。

      属性

      说明

      Name

      当前Toolchain配置项名称。

      SDK

      计算平台SDK目录。

      CMake

      CMake工具所在目录。

      Make

      Make工具所在目录。

      C Compiler

      C编译器所在目录，在SDK目录下。

      C++ Compiler

      C++编译器所在目录，在SDK目录下。

      Linker

      Linker工具所在目录，在SDK目录下。

      Gcov

      Gcov工具所在目录，在SDK目录下。
      说明：

      不支持输入中文和空格。
    3. 单击 [image] ，保存以上配置。

  3. 配置CMake属性。

    1. 在属性配置窗口左侧导航栏中，选择“Build & Execution > CMake”。

    2. 在打开的“CMake”页签中，可参考如下设置说明修改cmake默认配置。

      项目

      设置说明

      Name

      CMake当前配置项名称，不支持输入空格。

      Build type

      工程构建类型，类型包括Debug、Release、RelWithDebInfo和MinSizeRel。

      Toolchain

      Toolchains配置，根据Toolchain配置名称进行选择。

      CMake options

      自定义CMake选项，当存在编译类参数“DCMAKE_BUILD_TYPE”时，此参数设置项将被“Build type”覆盖。

      Source path

      单击“Browse...”，选择源文件路径。

      Binary path

      单击“Browse...”，选择二进制文件保存的路径。

      Build options

      输入make命令选项。

      Install options

      输入make install命令选项。
    3. 单击 [image] ，保存以上配置。

  4. （可选）管理toolchains/cmake属性配置。

    可通过如下方式管理toolchains/cmake属性配置列表。

    • 新增配置项：单击 [image] ，新增对应属性的配置项。
    • 删除配置项：选中窗口左侧列表中需要删除的配置项，再单击 [image] 。

      当列表中仅剩一条配置时，不可删除。

    • 重置配置项：单击 [image] ，将当前打开的配置项恢复至默认配置。
    • 保存配置：单击 [image] ，保存并生效当前配置项的配置。
    • 错误信息显示：当配置项填充报错时，将光标悬浮至报错图标即可显示。

      报错状态下，新增、删除、选择和保存按钮均处于失效状态。

  5. 使以上的所有的toolchains/cmake属性配置生效，并关闭配置窗口。

    确认配置无误后，单击窗口右下方 [image] 。

父主题： 以MDC工程开发AP应用


生成代码和配置文件

MDS支持通过输入的ARXML配置文件自动生成对应的代码和配置文件。

如需使用命令行方式生成代码和配置文件，请参考如何使用命令行方式生成代码和配置文件。

前提条件

  • 已 激活license 。
  • 工作台已有默认设置。如需将透视图恢复到默认布局，选择“Window > Perspective > Reset Perspective”。
  • 本地已准备配置完整，且经过MMC充分校验的ARXML配置文件。
  • 已获取MDC_Codegen_SDK-{version}-Ubuntu{osversion}.tar.gz。

操作步骤

  1. 使用mdc用户解压MDC_Codegen_SDK-{version}-Ubuntu{osversion}.tar.gz包，获得“com.huawei.mdc.codegensdk.update-{version}.zip”包和version.json文件。
  2. 将上一步获得的version.json文件拷贝至MDS工具子目录“plugins/”下。
  3. 在MDS工具的目录下执行如下命令，安装“com.huawei.mdc.codegensdk.update-{version}.zip”包。

    ./mdc_development_studio -application org.eclipse.equinox.p2.director -repository 'jar:file:{Codegen_update_path}/com.huawei.mdc.codegensdk.update-1.0.0.zip!/' -installIU com.huawei.mdc.codegen.aos.feature.feature.group -installIU com.huawei.vrtf.generator.feature.feature.group -noSplash

    其中，{Codegen_update_path}需要替换为“com.huawei.mdc.codegensdk.update-1.0.0.zip”包的绝对路径。

  4. 往目标工程中导入本地ARXML配置文件。

    1. 在 [image] 视图中，右键单击目标工程，并选择“Import Arxml Files”。
    2. 在弹窗中单击 [image] 选择文件夹所在路径。
    3. 单击 [image] ，即完成导入。

  5. 生成代码和配置文件。

    1. 在 [image] 视图中选中目标工程。
    2. 单击工具栏中 [image] 。

      单击 [image] 后，工具会自动校验MDS、Codegen_SDK及MDC_SDK的版本信息，校验通过后才会执行生成代码和配置文件的动作，如校验不通过会有弹窗提示，请先保证MDS/Codegen_SDK/MDS_SDK的版本符合要求，再执行此操作。

      • 校验要求如下：
        • Codegen_SDK和MDC_SDK版本是否一致。
        • MDS和Codegen_SDK/MDC _SDK接口版本是否兼容。
        • 未配置MDS_SDK时，只校验MDS和Codegen_SDK接口版本是否兼容。
      • 如无需校验，可以通过如下偏好设置方法取消。
        1. 在上方菜单栏中选择“Window > Preferences”。
        2. 在“Preference”弹窗左侧菜单中选择“CodeGen”。
        3. 在“CodeGen”页签下取消勾选“Check codeGenSDK version”，并单击“Apply and Close”保存设置。
    3. 在“Select Module”界面，勾选需要解析的模块，然后单击 [image] 。
    4. 观察 [image] 视图中的日志输出，代码生成过程中返回的信息示例如下，请以实际为准：
      [INFO]: Generation started on the [Core Types] module.
[INFO]: Generation ended on the [Core Types] module.
[INFO]: Generation started on the [Execution Management] module.
[INFO]: Generation ended on the [Execution Management] module.
...
[INFO]: Generation started on the [XXX] module.
[INFO]: There are no elements generated in configuration file of XXX.
[INFO]: Generation ended on the [XXX] module.
[INFO]: Generation ended on all modules.

  6. 展开 [image] 视图中目标工程的目录，确认已生成“generated”（生成代码）和“outputcfg”（配置文件）文件夹。

    请勿手动更改自动创建的“generated”和“outputcfg”文件夹名称及内容，否则可能影响运行结果。

    以向目标MDC工程中导入平台MDC_Sample-{version}包如下图所示的目录为例，对应生成的“generated”和“outputcfg”目录说明如下文所示。

    图1 导入MDC工程的目录展示
    • generated：生成代码的输出目录。

      图标序号

      输出目录

      目录说明

      1

      includes

      存放CM模块的接口头文件，包括基本数据类型、PER和CRYPTO等模块接口头文件，以及“_common.h”，“_skeleton.h”或“_proxy.h”格式文件。

      2

      src

      存放CM模块用于编译的“.cpp”源码文件。
    • outputcfg：生成配置文件的输出目录

      图标序号

      输出目录

      目录说明

      1

      DataType

      输出供rtftools（在线维测工具）使用的“.msg”格式文件，“.msg”格式文件的使用方式参考工具适配的MDC计算平台设备对应产品文档中“命令参考 > 代码生成工具支持维测特性”章节。

      2

      Host0DpMachine

      输出CM、EM、SM等模块的“.json”和“.xml”格式配置文件。

父主题： 以MDC工程开发AP应用


新建AP模板

用户在应用开发过程中，可通过“New MDC Module”功能在MDS上新建对应MDC工程的依赖库或独立模块的模板，从而提高开发效率。

前提条件

MDS中存在已完成生成代码和配置文件的MDC工程。

操作步骤

  1. 打开Module配置窗口。

    在 [image] 视图中，右键单击目标MDC工程，并选择“New > MDC Module”。

  2. 配置新建Module。

    在“New MDC Module”弹窗中完成如下操作：

    1. “Module name”：输入模版名称。
    2. “Build type”：单击 [image] 选择模版类型，包括executable（可执行文件），library/static（静态库）和library/shared（动态库）类型。
    3. “Language standard”：默认“C++14”，即模版编译语言版本。
    4. “Choose service interfaces”：选择模版的服务接口。
      1. 选中并下拉目标服务接口所属根节点（Executable类）。
      2. 根据业务需求勾选一个或多个目标Executable下已定义服务接口（Service Interface类）。

        完成勾选后，将指定对应Service Interface的“.cpp”文件。

    5. 单击 [image] ，使以上配置生效。
    图1 Module配置演示

父主题： 以MDC工程开发AP应用


构建工程

本节介绍了MDS默认提供的cmake安全构建方式。

如需使用命令行方式编译MDC工程，请参考如何使用命令行方式编译工程。

前提条件

已配置编译环境。

操作步骤

  1. （可选）选择编译工程所需SDK。

    1. 在 [image] 视图中，右键单击目标工程，并选择“Change SDK”。
    2. 在打开SDK菜单中选择所需SDK。

  2. 编辑目标“CMakeLists.txt”模板文件。

    1. 在 [image] 视图中，选择需要构建的工程app目录下的“CMakeLists.txt”模板文件，根据模板内注释提示进行编辑并保存。
      • 由于默认采用cmake的构建方式，故用户自定义的编译选项（头文件路径、库文件路径、库文件等）应添加在工程app目录下的“CMakeLists.txt”中。
      • 用户自定义的头文件存放路径不应含有“/usr/”字段，否则易与SDK默认的头文件存放路径混淆，从而影响升级时的工程转换功能。

    2. 保存代码编辑器中的内容，可使用快捷键“Ctrl+S”快速保存。可参考如下操作方法，开启编辑器自动保存功能：
      1. 在界面上方菜单栏中选择“Window > Preferences”。
      2. 在“Preferences”弹窗中选择“General > Workspace > Build”。
      3. 在打开的“build”页签中开启“Save automatically before build”选项。

  3. 编译目标工程或工程组件。

    • 编译目标工程
      1. 在 [image] 视图中，选中目标工程。
      2. 单击工具栏中 [image] ，进行工程编译。
      3. 在 [image] 中查看构建输出内容和运行结果。

        若未打开 [image] 视图，在界面上方菜单栏中选择“Window > Show View > Console”打开。

    • 编译目标工程组件
      1. 在 [image] 视图中，选中目标工程。
      2. 单击工具栏中 [image] ，刷新Targets节点。

        刷新后，Targets中将生成各工程组件对应节点，如下所示：

        节点名称根据Modules中的命名自动生成。

      3. 双击Targets目录下目标工程组件，即可进行编译。
      4. 在 [image] 中查看构建输出内容和运行结果。

        若未打开 [image] 视图，在界面上方菜单栏中选择“Window > Show View > Console”打开。

  4. 确认工程或工程组件已构建成功。

    此处以工程构建为例，若 [image] 打印的信息中含有如下加粗部分内容，则表示构建成功（回显内容仅供参考，请以实际为准）。

    Build Start Project: mdc_project, Type: Debug.
/usr/bin/cmake -G "Unix Makefiles" -DCMAKE_TOOLCHAIN_FILE=/usr/local/mdc_sdk_llvm/dp_gea/toolchain.cmake -DCMAKE_MAKE_PROGRAM=/usr/bin/make -DCMAKE_BUILD_TYPE=Debug /home/mdc/mds_workspace/mdc_project
-- The C compiler identification is Clang 12.0.1
-- The CXX compiler identification is Clang 12.0.1
-- Check for working C compiler: /usr/local/mdc_sdk_llvm/dp_gea/mdc_cross_compiler/bin/clang
-- Check for working C compiler: /usr/local/mdc_sdk_llvm/dp_gea/mdc_cross_compiler/bin/clang -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/local/mdc_sdk_llvm/dp_gea/mdc_cross_compiler/bin/clang++
-- Check for working CXX compiler: /usr/local/mdc_sdk_llvm/dp_gea/mdc_cross_compiler/bin/clang++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Toolchain file: /usr/local/mdc_sdk_llvm/dp_gea/toolchain.cmake
-- SOMEIP find package cmake: /usr/local/mdc_sdk_llvm/dp_gea/mdc_cross_compiler/sysroot/usr/lib/cmake/ara-com/../someip
-- SOMEIP package found
-- SOMEIP_INCLUDE_DIR: /usr/local/mdc_sdk_llvm/dp_gea/mdc_cross_compiler/sysroot/usr/include
-- SOMEIP_LIBRARY: /usr/local/mdc_sdk_llvm/dp_gea/mdc_cross_compiler/sysroot/usr/lib/libsomeip.so
-- ara-com FOUND.
-- SOMEIP find package cmake: /usr/local/mdc_sdk_llvm/dp_gea/mdc_cross_compiler/sysroot/usr/lib/cmake/ara-com/../someip
-- SOMEIP package found
-- SOMEIP_INCLUDE_DIR: /usr/local/mdc_sdk_llvm/dp_gea/mdc_cross_compiler/sysroot/usr/include
-- SOMEIP_LIBRARY: /usr/local/mdc_sdk_llvm/dp_gea/mdc_cross_compiler/sysroot/usr/lib/libsomeip.so
-- Configuring done
-- Generating done
-- Build files have been written to: /home/mdc/mds_workspace/mdc_project/build/cmake-build-debug-default_toolchain/clang-aos_gea-aarch64
/usr/bin/make
Scanning dependencies of target hello_world
[ 50%] Building CXX object modules/hello_world/CMakeFiles/hello_world.dir/src/main.cpp.o
[100%] Linking CXX executable hello_world
[100%] Built target hello_world
Build complete.
    • 由工程构建产生的二进制文件、“includes”文件等显示在“Project Explorer”视图中。
    • “Outline”视图填充了代码创建的对象。例如：在“Outline”视图中选择一个工程后，在编辑器中将突出显示相应文本。

父主题： 以MDC工程开发AP应用


远程运行工程

通过MDS的远程运行功能在计算平台系统环境中运行MDC工程。

  • 本章节仅适用于Development版本中调试使用。
  • 如果涉及自定义命令输入，请谨慎操作，以免对远程主机造成不可预估的影响。

前提条件

  • 已准备了计算平台设备和X86_64的PC。
  • “Project Explorer”中已有交叉编译环境下编译通过的MDC工程。
  • 已安装haveged工具。相关参考命令如下：
    • 安装工具：sudo apt install haveged，安装后默认进入启动状态。
    • 查询工具状态：sudo service haveged status。

      若为如下信息，则表示工具正在运行。

      若为如下信息，则表示工具为退出状态。

    • 在工具退出状态时启动服务：sudo service haveged start。

    MDS使用/dev/random设备从操作系统中获取随机数用于加密SSH连接。/dev/random产生随机数的原理是利用当前系统的熵池来计算出固定一定数量的随机比特，然后将这些比特作为字节流返回，当熵池可用数据不够时，/dev/random会阻塞MDS。因此需要安装haveged工具，这是一个基于HAVEGE算法的不可预测随机数生成器，可以给熵池补熵。

操作步骤

  1. 打开“Run Configurations”运行配置窗口。

    单击选中目标MDC工程，并在工具栏中选择“Run> Run Configurations...”。

  2. 打开目标工程的远程运行配置页面。

    1. 在“Run Configurations”窗口中，单击左侧菜单栏“MDC Remote Application”下自动创建的对应工程的远程运行配置项。

      可通过双击“MDC Remote Application”新建目标工程的远程运行配置项。

    2. （可选）如需在运行前执行自定义命令（例如export JAVA_HOME=/directory_to_jdk/），可以在“Commands to execute before application”栏输入需要执行的命令（多条命令用“;”隔开）。

      请谨慎使用自定义命令，特别是带有reboot、rm、mv等选项的高危指令，以保证计算平台的正常运行。

  3. 在“Main”页签下选择可执行程序和对应远程运行参数。

    1. 单击“Search Project...”按钮，在弹窗中选择目标工程编译生成的可执行文件，并单击“OK”。

    2. 单击“Manifest”栏下拉按钮，选择下拉框中可执行文件对应的配置文件。

    3. 不勾选“Run with chroot”。
    4. 单击“Connection”栏的“New”按钮，新建远程连接项，完成如下配置。
      • 若已有具备运行环境的远程主机或在创建MDC工程时配置过远程连接项，可直接在“Connection”栏的下拉框中选择已有远程连接项。且单击“Edit...”按钮可以更新已有远程连接项的配置参数。
      • 一个远程连接项最多可支持同时打开的通道数是有限的，具体取决于SSH服务端的配置。
      1. 弹窗中默认选择“SSH”远程连接协议，并单击“OK”。
      2. 在远程连接项配置弹窗中设置如下参数：
        • “Connection name”：输入远程连接项目名称。
        • “Host”：输入计算平台的IP地址。
        • “User”：输入登录计算平台的用户名。

          具体用户名和对应密码请参考工具适配的MDC计算平台设备对应产品文档中“调测指南（MDC平台环境） > 登录设备”章节。

        • “Password”：输入用户密码。
        • “Port”：输入与SSH服务对应的端口号。
      3. 单击 [image] 。

    5. 单击最下方的“Browse”按钮，选择远程绝对路径，实现将本地MDC工程远程拷贝至计算平台上。

      若出现如下连接错误提示，可参考“如何解决远程连接失败问题”解决。

    6. （可选）若用户有以下业务场景需求，可根据实际情况勾选：
      • 运行时进程对计算平台应用存在依赖：勾选“Run with pmupload.”。
      • 只运行，不执行拷贝动作：勾选“Skip download to target path.”。
      • 只实现将文件拷贝至计算平台系统指定目录下，不运行：勾选“Skip launch.”。

    7. 单击右下方“Apply”，保存以上配置。

  4. （可选）在“Arguments”页签下配置程序运行参数或添加自定义配置文件。

    • 配置程序运行参数

      在“Arguments”页签中输入对应参数值，参数作用的程序为“Main”页签下指定的可执行文件（Executable）。

    • 添加自定义配置文件
      1. 使用SSH工具将自定义配置文件拷贝至目标计算平台系统中。
      2. 在“Arguments”页签中输入自定义配置文件在计算平台中的绝对路径，再单击“Apply”，保存配置。

        自定义配置文件将在可执行文件启动后执行。

  5. 完成远程运行配置项的创建。

    单击“Run Configurations”窗口右下方 [image] ，保存窗口中所有配置并关闭窗口，使配置项得以应用。

  6. 远程运行目标工程。

    1. 在 [image] 视图中选中目标工程。
    2. 在MDS工具栏如远程运行工程操作演示所示位置，选择已创建的远程运行配置项。
    3. 单击 [image] ，开始远程运行。
    图1 远程运行工程操作演示

  7. 在界面下方“Console”控制台中查看工程远程运行日志。
父主题： 以MDC工程开发AP应用


远程调试工程

完成MDC工程编译后，可通过配置远程运行项，在智能驾驶计算平台上调试目标工程。

  • 本章节仅适用于Development版本中调试使用。
  • 如果涉及显示个人数据或隐私数据，需要遵循所适用国家的法律或公司用户隐私政策，以确保客户的个人数据受到充分的保护；数据仅供显示，MDS不会保存。
  • 如果涉及自定义命令输入，请谨慎操作，以免对远程主机造成不可预估的影响。

前提条件

硬件

计算平台硬件设备，X86_64 PC

系统

X86_64 Ubuntu 20.04（桌面版）

其他
  • “Project Explorer”中已有通过编译的MDC工程，即已存在可执行文件。
  • 在计算平台中安装gdbserver，在开发环境中安装gdb，且gdbserver和gdb版本一致，安装方法请参考如何在计算平台系统中安装binutils等第三方库和如何在开发环境中安装gdb。

操作步骤

  1. 打开调试配置窗口。

    在 [image] 视图中，右键单击目标MDC工程，并选择“Debug As > Debug Configurations”。

  2. 打开目标工程的远程运行配置页面。

    单击配置窗口左侧菜单栏“MDC Remote Application”下自动创建的Debug运行配置项。

    可通过双击“MDC Remote Application”新建目标工程的Debug运行配置项。

  3. （可选）如需在运行前执行自定义命令，可以在“Commands to execute before application”栏输入需要执行的命令（多条命令用“;”隔开）。

    例如：配置环境变量，输入执行命令export JAVA_HOME=/directory_to_jdk/。

    请谨慎使用自定义命令，特别是带有reboot、rm、mv等选项的高危指令，以保证计算平台的正常运行。

  4. 在“Main”页签下选择可执行文件和远程运行参数。

    1. 单击“Search Project...”按钮，在弹窗中选择目标工程编译生成的可执行文件，并单击“OK”。

    2. 单击“Manifest”栏下拉按钮，选择下拉框中可执行文件对应的配置文件。

    3. 单击“Connection”栏的“New”按钮，新建远程连接项，完成如下配置。
      • 若已有具备运行环境的远程主机或在创建MDC工程时配置过远程连接项，可直接在“Connection”栏的下拉框中选择已有远程连接项。且单击“Edit...”按钮可以更新已有远程连接项的配置参数。
      • 一个远程连接项最多可支持同时打开的通道数是有限的，具体取决于SSH服务端的配置。
      1. 弹窗中默认选择“SSH”远程连接协议，并单击“OK”。
      2. 在远程连接项配置弹窗中设置如下参数：
        • “Connection name”：输入远程连接项目名称。
        • “Host”：输入计算平台的IP地址。
        • “User”：输入登录计算平台的用户名。

          具体用户名和对应密码请参考工具适配的MDC计算平台设备对应产品文档中“调测指南（MDC平台环境） > 登录设备”章节。

        • “Password”：输入用户密码。
        • “Port”：输入与SSH服务对应的端口号。
      3. 单击 [image] 。

    4. 单击最下方的“Browse”按钮，选择远程绝对路径，实现将本地MDC工程远程拷贝至计算平台上。

      若出现如下连接错误提示，可参考“如何解决远程连接失败问题”解决。

    5. （可选）若用户有以下业务场景需求，可根据实际情况勾选：
      • 运行时进程对计算平台应用存在依赖：勾选“Run with pmupload.”。
      • 只运行，不执行拷贝动作：勾选“Skip download to target path.”。
      • 只实现将文件拷贝至计算平台系统指定目录下，不运行：勾选“Skip launch.”。

    6. 单击右下方“Apply”，保存以上配置。

  5. 在“Debugger”页签下配置gdb的安装路径。

    1. （可选）根据实际需求选择代码调试停止的位置。
      • 调试停止在用户手动添加的断点处，去除“Stop on startup at”栏的勾选即可。
      • 调试停止在指定行，手动修改“Stop on startup at”栏参数即可。

    2. （可选）单击“GDB debugger”栏中“Browse...”选择gdb安装路径。
    3. 在子页签“Gdbserver Settings”下的“Port number”栏配置对应端口号。

  6. （可选）在“Arguments”页签下配置程序运行参数或添加自定义配置文件。

    • 配置程序运行参数

      在“Arguments”页签中输入对应参数值，参数作用的程序为“Main”页签下指定的可执行文件（Executable）。

    • 添加自定义配置文件
      1. 使用SSH工具将自定义配置文件拷贝至目标计算平台系统中。
      2. 在“Arguments”页签中输入自定义配置文件在计算平台中的绝对路径，再单击“Apply”，保存配置。

        自定义配置文件将在可执行文件启动后执行。

  7. 单击窗口右下角“Apply and Close”，保存以上所有页签的配置并关闭窗口。
  8. 远程调试目标工程。

    1. 在 [image] 视图中选中目标工程。
    2. 在MDS工具栏如远程运行工程操作演示所示位置，选择已创建的远程调试配置项。
    3. 单击 [image] ，开始远程调试。
    图1 远程运行工程操作演示

  9. 结合“Variables”视图变量值的变化和“Console”控制台应用程序的运行日志，开始调试。

父主题： 以MDC工程开发AP应用


远程测试工程

MDS集成了测试框架Gtest，提供新建单元测试文件的可视化向导，即使用代码覆盖率检测功能对运行期间的执行代码进行测试，检测报告包括行覆盖率，函数覆盖率和分支覆盖率。

  • 本章节仅适用于Development版本中调试使用。
  • 如果涉及自定义命令输入，请谨慎操作，以免对远程主机造成不可预估的影响。
  • 前提条件
  • 创建单元测试文件
  • 检测代码覆盖率
  • 查看代码覆盖信息
  • 设置覆盖率报告显示效果
父主题： 以MDC工程开发AP应用


前提条件

前提条件

硬件

计算平台硬件设备，x86_64 PC

系统

X86_64 Ubuntu 20.04（桌面版）

其他
  • “Project Explorer”中已有交叉编译环境下通过Debug类型编译的MDC工程。
  • 存在有效gcov工具路径，gcov工具已集成在交叉编译环境包中。
  • 已在计算平台系统中安装了Gtest库。若尚未安装，请先参见工具适配的MDC计算平台设备对应产品文档中“编译环境搭建指南 > 安装第三方库”章节，分别在交叉编译环境和计算平台系统环境中配置lyum源，并通过lyum install gtest.aarch64和lyum install gtest-devel.aarch64分别安装Gtest库。
  • 在计算平台中安装gdbserver，在开发环境中安装gdb，且gdbserver和gdb版本一致，安装方法请参考如何在计算平台系统中安装binutils等第三方库和如何在开发环境中安装gdb。
父主题： 远程测试工程


创建单元测试文件

  1. 新建测试文件。

    在 [image] 视图中右键单击目标工程，并选择“New > MDC Test Module”。

  2. 配置测试文件参数。

    1. 在打开的测试文件配置窗口中进行如下选择。
      • 选择 [image] ：

        在“Module name”框内输入以“.cpp”为后缀的测试文件名称，且文件名只能包含字母、下划线和数字。

      • 选择 [image] ：
        1. 在“Module name”框内输入以“.cpp”为后缀的测试文件名称，且文件名只能包含字母、下划线和数字。
        2. 参考表1 GoogleTest Fixture事件机制，勾选所需事件机制。

          表1 Googletest Fixture事件机制说明

          函数类型

          功能说明

          SetUp()

          在所有用例前执行。

          TearDown()

          在所有用例后执行。

          SetUpTestCase()

          在第一个用例前执行。

          TearDownTestCase()

          在最后一个用例后执行。
    2. 单击 [image] ，使以上配置生效。

  3. 查看生成的测试模板。

    在 [image] 视图中，打开目标工程新建测试模板下“src”目录下的文件，对应模板效果如下：
    • Googletest Case模板

    • Googletest Fixture模板

  4. 在测试模板中编写UT测试代码。

    • Googletest Case模板：在模板中按需求编写单元测试代码。
    • Googletest Fixture模板：按实际需求自行实现“SetUp()”，“TearDown()”，“SetUpTestCase()”或“TearDownTestCase()”方法，且class名需要和函数TEST_F()中的第一个参数名相同。

父主题： 远程测试工程


检测代码覆盖率

  1. 打开“Run Configurations”运行配置窗口。

    单击选中目标MDC工程，并在工具栏中选择“Run > Run Configurations...”，打开“Run Configurations”窗口。

  2. 打开对应工程的远程运行配置页面。

    1. 在“Run Configurations”窗口中，双击左侧菜单栏“MDC Coverage”自动创建的对应工程的远程运行配置项。
    2. （可选）如需在运行前执行自定义命令（例如export JAVA_HOME=/directory_to_jdk/），可以在“Commands to execute before application”栏输入需要执行的命令（多条命令用“;”隔开）。

      请谨慎使用自定义命令，特别是带有reboot、rm、mv等选项的高危指令，以保证计算平台的正常运行。

  3. 在“Main”页签下配置目标工程的远程运行配置项。

    1. 单击“Search Project...”按钮，在弹窗中选择目标工程编译生成的可执行文件，并单击“OK”。

    2. 单击“Manifest”栏下拉按钮，选择下拉框中可执行文件对应的配置文件。

    3. 不勾选“Run with chroot”。
    4. 单击“Connection”栏的“New”按钮，新建远程连接项，完成如下配置。
      • 若已有具备运行环境的远程主机或在创建MDC工程时配置过远程连接项，可直接在“Connection”栏的下拉框中选择已有远程连接项。且单击“Edit...”按钮可以更新已有远程连接项的配置参数。
      • 一个远程连接项最多可支持同时打开的通道数是有限的，具体取决于SSH服务端的配置。
      1. 弹窗中默认选择“SSH”远程连接协议，并单击“OK”。
      2. 在远程连接项配置弹窗中设置如下参数：
        • “Connection name”：输入远程连接项目名称。
        • “Host”：输入计算平台的IP地址。
        • “User”：输入登录计算平台的用户名。
        • “Password”：输入用户密码，并勾选“Password based authentication”。
        • “Port”：输入与SSH服务对应的端口号。
      3. 单击 [image] 。

    5. 单击最下方的“Browse”按钮，选择远程绝对路径，以实现将本地MDC工程远程拷贝至计算平台系统。
    6. （可选）若用户有以下业务场景需求，可根据实际情况勾选：
      • 只运行，不执行拷贝动作：勾选“Skip download to target path”。
      • 只实现将文件拷贝至计算平台系统指定目录下，不运行：勾选“Skip launch”。
    7. 单击右下方“Apply”，保存以上配置。

  4. （可选）在“Arguments”页签下配置程序运行参数或添加自定义配置文件。

    • 配置程序运行参数

      在“Arguments”页签中输入对应参数值，参数作用的程序为“Main”页签下指定的可执行文件（Executable）。

    • 添加自定义配置文件
      1. 使用SSH工具将自定义配置文件拷贝至目标计算平台系统中。
      2. 在“Arguments”页签中输入自定义配置文件在计算平台中的绝对路径，再单击“Apply”，保存配置。

        自定义配置文件将在可执行文件启动后执行。

  5. 单击窗口右下角“Apply and Close”，保存以上所有页签的配置并关闭窗口。
  6. 远程运行目标工程。

    1. 在 [image] 视图中选中目标工程。
    2. 在MDS工具栏选择框中选择已创建的远程运行配置项。

    3. 单击选择框左侧运行按钮 [image] ，开始远程运行。

  7. 查看覆盖率报告。

    1. 在界面下方 [image] 控制台中查看工程远程运行日志，等待程序运行结束。
    2. Gcov工具运行结束将自动打开覆盖率报告列表。

      汇总数据包括程序运行过程中每个文件的行覆盖率、分支覆盖率和函数覆盖率。覆盖率达到80%及以上将显示绿色，80%以下显示红色。

      若出现覆盖率报告为空的情况，请检查是否满足如下运行条件：

      1. 正确安装交叉编译环境，且aarch64-target-linux-gnu-gcov工具已存在于交叉编译环境中。
      2. 目标工程下的新建模板文件夹中“CMakeLists.txt”文件已配置如下gcov编译参数。
        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fprofile-arcs -ftest-coverage")
      3. UT测试程序已正常运行。运行成功界面显示如下：

        表1 图示例说明

        图标序号

        显示说明

        1

        “hellomdc.cpp”是被测试文件示例，文件代码左侧的分支标识具体含义请参考查看代码覆盖信息，右下方“MDC Gcov”窗口为详细的代码覆盖率数据。

        2

        “hello_mdc_ut.cpp”是测试代码示例（使用了Googletest Case模板），“Console”窗口显示的是测试文件的运行日志。

父主题： 远程测试工程


查看代码覆盖信息

  1. 在打开的覆盖率报告窗口中，双击文件名称。

    也可以在 [image] 视图中打开源码文件，即在编辑器中打开对应文件。

  2. 在编辑器中查看左边的指示器来确定当前行的分支覆盖情况，如下所示：

    分支标记

    说明

    表示完全覆盖。

    表示当前代码仅执行部分分支。

    表示当前代码行完全没执行。

    鼠标悬浮至对应代码行上会显示对应的分支覆盖信息。

父主题： 远程测试工程


设置覆盖率报告显示效果

  1. 打开偏好设置窗口。

    在界面上方菜单栏中选择“Window > Preferences”。

  2. 打开“Coverage Settings”页签。

    单击左侧导航栏中选择“C/C++ > Coverage”。

  3. 参考如下参数说明，配置覆盖率报告显示相关参数。

    参数项

    操作说明

    Show line

    勾选即显示行覆盖率。

    Show branch

    勾选即显示分支覆盖率。

    Show function

    勾选即显示函数覆盖率。

    Exclude compiler generated code line

    勾选即过滤编译器自动生成的代码行覆盖信息，并重新生成覆盖率报告。

    Exclude throw branch

    勾选即过滤throw异常分支信息，并重新生成覆盖率报告。

  4. 单击“Apply and Close”，保存以上配置。
父主题： 远程测试工程


MDC工程Perf性能分析

MDS支持两种perf性能分析模式，计数模式和采样模式。

在计算平台应用开发过程中，可使用命令perf stat（计数模式）查看应用运行期间的整体信息，如需查看热点函数或调用栈可使用命令perf record和perf report（采样模式），命令说明如下：

  • perf stat：此命令用于统计并返回MDC工程整个生命周期的信息，包括执行程序的CPU时间、程序在运行过程中发生的上下文切换次数和CPU迁移次数等。
  • perf record和perf report：这两个命令在MDS中成对使用，帮助用户方便查找应用程序或者系统内核中的热点函数。perf record用于记录一段时间内系统/进程的性能数据，数据包括程序中各符号表的采样数以及符号表采样数占程序总采样数的百分比，记录的数据将自动生成“perf.data”文件。perf report则用于解析perf record记录的文件数据。

如果涉及自定义命令输入，请谨慎操作，以免对远程主机造成不可预估的影响。

  • X86环境下，暂不支持MDC工程Perf性能分析。
  • 本章节仅适用于Development版本中调试使用。
  • On-CPU火焰图（函数调用图）
  • Stat统计
  • TopN热点函数
  • 差分火焰图
父主题： 以MDC工程开发AP应用


On-CPU火焰图（函数调用图）

用于采集并以图形界面显示程序火焰图及函数调用图。

前提条件

目标MDC工程已通过编译。

操作步骤

  1. 打开MDC工程的perf配置页面。

    1. 单击选中目标MDC工程，并在工具栏中选择“Run > Configurations...”，打开“Run Configurations”窗口。
    2. 在“Run Configurations”窗口中，双击左侧菜单栏“Profile with Perf”创建目标工程的perf远程运行配置项，并打开对应的perf配置页面。

    3. （可选）如需在运行前执行自定义命令（例如export JAVA_HOME=/directory_to_jdk/），可以在“Commands to execute before application”栏输入需要执行的命令（多条命令用“;”隔开）。

      请谨慎使用自定义命令，特别是带有reboot、rm、mv等选项的高危指令，以保证计算平台的正常运行。

  2. 在“Main”页签下完成以下操作，配置目标工程的远程运行参数。

    1. 单击“Search Project...”按钮，在弹窗中选择目标工程编译生成的可执行文件，并单击“OK”。

    2. 单击“Manifest”栏下拉按钮，选择下拉框中可执行文件对应的配置文件。

    3. 不勾选“Run with chroot”。
    4. 单击“Connection”栏的“New”按钮，新建远程连接项，完成如下配置。
      • 若已有具备运行环境的远程主机或在创建MDC工程时配置过远程连接项，可直接在“Connection”栏的下拉框中选择已有远程连接项。且单击“Edit...”按钮可以更新已有远程连接项的配置参数。
      • 一个远程连接项最多可支持同时打开的通道数是有限的，具体取决于SSH服务端的配置。
      1. 弹窗中默认选择“SSH”远程连接协议，并单击“OK”。
      2. 在远程连接项配置弹窗中设置如下参数：
        • “Connection name”：输入远程连接项目名称。
        • “Host”：输入计算平台的IP地址。
        • “User”：输入登录计算平台的用户名。

          具体用户名和对应密码请参考工具适配的MDC计算平台设备对应产品文档中“调测指南（MDC平台环境） > 登录设备”章节。

        • “Password”：输入用户密码。
        • “Port”：输入与SSH服务对应的端口号。
      3. 单击 [image] 。

    5. 单击最下方的“Browse”按钮，选择远程绝对路径，实现将本地MDC工程远程拷贝至计算平台上。

      若出现如下连接错误提示，可参考“如何解决远程连接失败问题”解决。

    6. （可选）若用户有以下业务场景需求，可根据实际情况勾选：
      • 运行时进程对计算平台应用存在依赖：勾选“Run with pmupload.”。
      • 只运行，不执行拷贝动作：勾选“Skip download to target path.”。
      • 只实现将文件拷贝至计算平台系统指定目录下，不运行：勾选“Skip launch.”。

    7. 单击右下方“Apply”，保存以上配置。

  3. 打开“Perf Options”页面，并完成以下操作，配置perf性能分析相关参数。

    1. 选择“show report view”。
    2. 根据实际业务需要设置“Timeout”时间，单位为“秒（s）”，即当分析时间达到设定时间，将自动停止perf分析，此参数适用于死循环程序。

  4. （可选）在“Arguments”页签下配置程序运行参数或添加自定义配置文件。

    • 配置程序运行参数

      在“Arguments”页签中输入对应参数值，参数作用的程序为“Main”页签下指定的可执行文件（Executable）。

    • 添加自定义配置文件
      1. 使用SSH工具将自定义配置文件拷贝至目标计算平台系统中。
      2. 在“Arguments”页签中输入自定义配置文件在计算平台中的绝对路径，再单击“Apply”，保存配置。

        自定义配置文件将在可执行文件启动后执行。

  5. 单击配置窗口右下方 [image] 。
  6. 开启目标工程的perf性能分析。

    1. 在 [image] 视图中选中目标工程。
    2. 在MDS工具栏的运行选项中选择新建的perf配置项。

    3. 单击工具栏中运行按钮 [image] ，开始远程运行并解析目标工程。

  7. 查看目标工程的perf性能分析结果。

    1. 查看“Console”窗口中数据采集结果，如下所示：

      如中途需要手动定位采集结束点，单击“Console”窗口 [image] 按钮。

    2. 待数据采集完毕（包括手动停止采集数据），界面将弹出“Perf Profile View”窗口，并以树状图的形式显示程序中调用的命令和模块被采样的次数，以及符号表采样次数占总采样次数的百分比，同时展示了函数符号表之间的调用关系，如下所示：

      在编辑器的“Perf Analysis Graph”窗口中，将以火焰图和调用图的形式呈现分析结果，如下所示：

      图1 火焰图
      图2 调用图
    3. （可选）再次查看火焰图和调用图。
      • 方法一：build目录下将自动生成“perf/xxx”文件夹，其中的“xxx”为时间戳，用于区分不同时刻运行perf命令生成的数据文件。当“Perf Profile View”窗口或“Perf Analysis Graph”关闭时，可通过双击此文件夹下的相应文件再次打开。
      • 方法二：单击“File > Save As”，保存火焰图和调用图到自定义路径下。进入自定义路径下，打开火焰图和调用图。

      性能分析数据会在计算平台系统的应用运行目录下增量保存，如不需要请自行删除。

父主题： MDC工程Perf性能分析


Stat统计

用于统计并返回程序整个生命周期的信息，包括执行程序的CPU时间、程序在运行过程中发生的上下文切换次数或CPU迁移次数等。

前提条件

目标MDC工程已通过编译。

操作步骤

  1. 完成1~2操作。
  2. 打开“Perf Options”页面，并完成以下操作，配置perf性能分析相关参数。

    1. 选择“show stat view”。
    2. 根据实际业务需要设置“Timeout”时间，单位为“秒（s）”，即当分析时间达到设定时间，将自动停止perf分析，此参数适用于死循环程序。

  3. （可选）在“Arguments”页签下配置程序运行参数或添加自定义配置文件。

    • 配置程序运行参数

      在“Arguments”页签中输入对应参数值，参数作用的程序为“Main”页签下指定的可执行文件（Executable）。

    • 添加自定义配置文件
      1. 使用SSH工具将自定义配置文件拷贝至目标计算平台系统中。
      2. 在“Arguments”页签中输入自定义配置文件在计算平台中的绝对路径，再单击“Apply”，保存配置。

        自定义配置文件将在可执行文件启动后执行。

  4. 单击配置窗口右下方 [image] 。
  5. 开启目标工程的perf性能分析。

    1. 在 [image] 视图中选中目标工程。
    2. 在MDS工具栏的运行选项中选择新建的perf配置项。

    3. 单击工具栏中运行按钮 [image] ，开始远程运行并解析目标工程。

  6. 查看目标工程的perf性能分析结果。

    在“Console”窗口中查看总体的解析数据，分析结果如下：

    如中途需要手动定位采集结束点，单击“Console”窗口 [image] 按钮。

父主题： MDC工程Perf性能分析


TopN热点函数

用于采集并以图形界面显示程序中符号表CPU使用率。

前提条件

目标MDC工程已通过编译。

操作步骤

  1. 完成1~2操作。
  2. 打开“Perf Options”页面，并完成以下操作，配置perf性能分析相关参数。

    1. 选择“show top view”。

      用于控制图形界面程序符号表的显示数量，请按需配置。

    2. 根据实际业务需要设置“Timeout”时间，单位为“秒（s）”，即当分析时间达到设定时间，将自动停止perf分析，此参数适用于死循环程序。

  3. （可选）在“Arguments”页签下配置程序运行参数或添加自定义配置文件。

    • 配置程序运行参数

      在“Arguments”页签中输入对应参数值，参数作用的程序为“Main”页签下指定的可执行文件（Executable）。

    • 添加自定义配置文件
      1. 使用SSH工具将自定义配置文件拷贝至目标计算平台系统中。
      2. 在“Arguments”页签中输入自定义配置文件在计算平台中的绝对路径，再单击“Apply”，保存配置。

        自定义配置文件将在可执行文件启动后执行。

  4. 单击配置窗口右下方 [image] 。
  5. 开启目标工程的perf性能分析。

    1. 在 [image] 视图中选中目标工程。
    2. 在MDS工具栏的运行选项中选择新建的perf配置项。

    3. 单击工具栏中运行按钮 [image] ，开始远程运行并解析目标工程。

  6. 查看目标工程的perf性能分析结果。

    在编辑器的“Perf Analysis Graph”窗口中，将以条形图的形式呈现分析结果，如下图所示：

父主题： MDC工程Perf性能分析


差分火焰图

MDS工具支持以差分火焰图的方式展示代码修改前后的性能差异，以提供性能优化结果参考。

背景信息

差分火焰图生成的业务流程如下：

  1. 比对通过采集代码修改前后数据生成的“.unfold”文件，生成差值文件（“.svg”文件）。

    以修改前函数调用栈中的数据生成的“.unfold”文件为基准，对比其修改后生成的“.unfold”文件，生成差值。

    仅比对10MB以内的“.unfold”文件。

  2. 根据差值正负进行染色，生成差分火焰图，性能差异可通过生成的颜色体现。
    表1 颜色说明

    颜色a

    说明

    暖色调

    正值

    冷色调

    负值

    白色

    性能不变

    红色

    性能衰退

    蓝色

    性能优化

    a：差值的绝对值越大，颜色越深。

前提条件

目标MDC工程已通过编译。

操作步骤

  1. 完成1~2操作。
  2. 采集修改前后的代码，生成“.unfold”文件。

    • 方式一：通过Perf性能分析工具生成“.unfold”文件。

      参考On-CPU火焰图（函数调用图），在代码修改前后分别执行采集命令（Perf），即可在目标工程内“build/”目录下生成对应的“.unfold”文件。

      图1 “.unfold”文件
    • 方式二：通过命令行在计算平台中生成“.unfold”文件。
      1. 在计算平台中执行如下命令采集数据，具体参数含义可以通过perf --help命令查看。

        perf record -F 99 -g --call-graph fp -p $pid -o $folder_name/$tmp_perf.data -- sleep 60

        perf script -i $folder_name/$tmp_perf.data > $folder_name/$name.unfold

      2. 将生成的“.unford”文件拷贝至MDS工程目录下。

  3. 比对生成的两个“.unfold”文件，生成“.svg”文件。

    • 快捷比对：同时选中需比对的两个“.unfold”文件，右键单击其中任一文件选择“Profile > Generate differential flame graph”。
    • 按需比对：右键单击其一“.unfold”文件选择“Profile”，会出现如表2所示选项，可以根据需要管理并比对目标文件。
      表2 “Profile”选项说明

      选项

      说明

      Generate flame graph

      将目标“.unfold”文件转成“.svg”文件后，自动打开对应火焰图。

      Select left file for diff perf

      将选中的文件作为第一个输入文件，可重复操作，以最后一次选中的为准。

      工具将按照文件前后顺序比对文件，“.svg”文件即为后位文件比对前位文件的结果。

      Generate differential flame graph with 'perf.unfold'

      <file_name>为变量值，即上一次选中的“.unfold”文件名，将此次选中的“.unfold”文件与上一次选中的作比对。

      选择此项后，会自动出现“Diff Perf”窗口。

      Clear previous selections

      清除此前的选择。

    比对完成后，目标工程的“build/”目录下会生成一个output_*.svg文件。

  4. 通过差分火焰图查看分析结果。

    双击上一步生成的“.svg”文件，分析结果对应的差分火焰图将展示在编辑器的“Perf Analysis Graph”窗口中。

    生成的“.svg”矢量图也可直接用本地浏览器打开。

父主题： MDC工程Perf性能分析


Memcheck内存分析

MDS集成了valgrind的内存检测工具memcheck，用于检测发现代码中内存相关的问题，如使用未初始化的内存、读/写已经被释放的内存、读/写内存越界、读/写不恰当的内存栈空间和内存泄漏等，并输出分析报告，也可通过分析报告找到问题代码的具体位置，进行内存修复。在MDS中可使用可视化界面进行常用配置项的配置，对运行在计算平台系统上的应用进行指定参数的检查。Valgrind Memcheck基本原理是通过模仿CPU的工作模式对每一个操作进行验证。

  • 本章节仅适用于Development版本中调试使用。
  • 当前aarch64版本的valgrind不支持-fstack-check安全编译选项。
  • 如果涉及自定义命令输入，请谨慎操作，以免对远程主机造成不可预估的影响。
  • 如需在X86环境下运行，需要在X86环境下安装“Memcheck内存分析工具”参考命令如下：
    • 确认是否安装工具命令：valgrind --version，若返回版本号，说明已安装，否则未安装。
    • 安装工具命令：sudo apt-get install valgrind。

前提条件

  • MDS中已存在通过编译的MDC工程。
  • 已在MDC中安装valgrind。

打开AddressSanitizer编译参数后，Memcheck内存分析无法正常使用。建议完成Asan内存分析后，注释AddressSanitizer编译参数，然后重新编译工程。

操作步骤

  1. 打开MDC工程的memcheck配置页面。

    1. 在 [image] 视图中，右键单击目标MDC工程，并选择“Debug As > Run Configurations...”，打开“Debug Configurations”窗口。
    2. 在“Debug Configurations”窗口中，双击左侧菜单栏“MDC Memcheck”创建目标工程的memcheck远程运行配置项，并打开对应的memcheck配置页面。

      此处运行项名称以默认生成的“mdc_memcheck Configuration(1)”为例，下文将继续延用此示例。

    3. （可选）如需在运行前执行自定义命令（例如export JAVA_HOME=/directory_to_jdk/），可以在“Commands to execute before application”栏输入需要执行的命令（多条命令用“;”隔开）。

      请谨慎使用自定义命令，特别是带有reboot、rm、mv等选项的高危指令，以保证计算平台的正常运行。

  2. 在“Main”页签下完成以下操作，配置目标工程的远程运行参数。

    1. 单击“Search Project...”按钮，在弹窗中选择目标工程编译生成的可执行文件，并单击“OK”。

    2. 单击“Manifest”栏下拉按钮，选择下拉框中可执行文件对应的配置文件。

    3. 单击“Connection”栏的“New”按钮，新建远程连接项，完成如下配置。
      • 若已有具备运行环境的远程主机或在创建MDC工程时配置过远程连接项，可直接在“Connection”栏的下拉框中选择已有远程连接项。且单击“Edit...”按钮可以更新已有远程连接项的配置参数。
      • 一个远程连接项最多可支持同时打开的通道数是有限的，具体取决于SSH服务端的配置。
      1. 弹窗中默认选择“SSH”远程连接协议，并单击“OK”。
      2. 在远程连接项配置弹窗中设置如下参数：
        • “Connection name”：输入远程连接项目名称。
        • “Host”：输入计算平台的IP地址。
        • “User”：输入登录计算平台的用户名。

          具体用户名和对应密码请参考工具适配的MDC计算平台设备对应产品文档中“调测指南（MDC平台环境） > 登录设备”章节。

        • “Password”：输入用户密码。
        • “Port”：输入与SSH服务对应的端口号。
      3. 单击 [image] 。

    4. 单击最下方的“Browse”按钮，选择远程绝对路径，实现将本地MDC工程远程拷贝至计算平台上。

      若出现如下连接错误提示，可参考“如何解决远程连接失败问题”解决。

    5. （可选）若用户有以下业务场景需求，可根据实际情况勾选：
      • 运行时进程对计算平台应用存在依赖：勾选“Run with pmupload.”。
      • 只运行，不执行拷贝动作：勾选“Skip download to target path.”。
      • 只实现将文件拷贝至计算平台系统指定目录下，不运行：勾选“Skip launch.”。

    6. 单击右下方“Apply”，保存以上配置。

      若在5中勾选了参数“Run with pmupload.”，在调测阶段进行内存分析时，需要先给pmupload加551的权限，才能使用pmupload方式拉起进程。

      命令示例：chmod 551 /usr/bin/mdc/base-plat/process-manager/bin/pmupload

  3. 在“Options”页签下完成以下操作，配置目标工程内存分析的运行参数。

    1. 完成memcheck工具运行参数的配置。
      图1 参数配置示例
      参考如下参数说明表，并根据实际业务需要修改默认参数。

      项目栏

      参数

      说明

      Basic Options

      Trace children on exec

      默认不勾选，不会追踪子进程的执行情况。

      须知：

      若在5中勾选了参数“Run with pmupload.”，请勾选参数“Trace children on exec”，保证程序能追踪子进程的执行情况。

      Child silent after fork

      默认勾选，表示显示调用fork函数子进程产生的所有运行日志。

      Error Options

      Callers in stack trace

      默认显示函数调用的函数（以函数名区分）最大为12层。

      若设置过高会导致内存消耗过度，影响valgrind的运行速度。

      Limit errors reported

      默认勾选，当错误总数达到10,000,000个或错误种类达到1,000个时，将中断执行。

      Show errors below main

      默认不勾选，表示在main函数中，不再显示报告出错调用栈以下的所有函数信息。

      Max stack frame size (byte)

      默认参数值为“2,000,000”，表示被调程序能使用的最大栈空间，单位为“字节”。

      set main thread's stack size (byte)

      默认不勾选，表示主线程的栈大小，单位为“字节”。

      Set waiting time (s)

      默认不勾选，表示自动终止程序的触发（超出）时间，单位为“秒”。

      Memcheck Options

      check for memory leaks

      默认勾选，表示需要检查内存泄露。

      leak resolution

      默认设置为“high”，此参数用于判断存在内存泄露的栈是否属于同类内存泄漏，只对报告显示起作用，可根据实际调用栈的数量选择判断条件：

      • low：只要前两层栈匹配，就认为是同类内存泄漏。
      • med：只要前四层栈匹配，就认为是同类内存泄漏。
      • high：所有层次的栈都必须匹配，才认为是同类内存泄漏。

      show reachable blocks

      默认不勾选，表示内存泄漏检测器只报告无指针指向的内存块，若勾选还将报告有指针指向的内存块。

      显示的内存泄漏类型如下：

      • definitely lost：确认丢失，即程序中存在内存泄露，优先级大于possibly lost。

        程序结束后一块动态分配的内存仍未释放，且通过程序内的指针变量均无法访问这块内存，则会报这个错误。

      • possibly lost：可能丢失，即程序中可能存在内存泄露。

        程序结束后一块动态分配的内存仍未释放，且通过程序内的指针变量均无法访问这块内存的起始地址，但可以访问其中的某一部分数据，则会报这个错误。

      undefined value errors

      默认勾选，表示需要检测出引用未初始化值的错误代码。

      track origins of uninitialized values

      默认不勾选，表示不追踪未初始化值引用的根源。

      show possibly lost blocks in leak check

      默认勾选，表示程序结束时查找可能存在内存泄漏的代码块。

      Extra Options

      除了以上常用参数，用户还可以在此添加其他所需参数，多个参数使用空格分开，输入格式为“<命令参数> ...”。

      如：--xtree-leak=no --freelist-vol=100000

  4. （可选）在“Arguments”页签下配置程序运行参数或添加自定义配置文件。

    • 配置程序运行参数

      在“Arguments”页签中输入对应参数值，参数作用的程序为“Main”页签下指定的可执行文件（Executable）。

    • 添加自定义配置文件
      1. 使用SSH工具将自定义配置文件拷贝至目标计算平台系统中。
      2. 在“Arguments”页签中输入自定义配置文件在计算平台中的绝对路径，再单击“Apply”，保存配置。

        自定义配置文件将在可执行文件启动后执行。

  5. 单击配置窗口右下方 [image] 。
  6. 使用memcheck对目标工程进行内存分析。

    1. 在 [image] 视图中选中目标工程。
    2. 在MDS工具栏的运行选项中选择新建的memcheck运行配置项（“mdc_memcheck Configuration(1)”）。
    3. 单击工具栏中运行按钮 [image] ，开始远程运行并解析目标工程。

  7. 查看内存分析报告。

    memcheck运行项运行完毕后，将自动弹出 [image] 窗口，用于查看内存分析报告。

    • 当目标工程无内存泄漏， [image] 窗口无报告生成，并输出提示语“Valgrind found no problems to report”。
    • 当目标工程中存在内存泄漏，可通过双击带 [image] 标记的信息项，跳转至具体报错位置（代码行）。

      以“mdc_memcheck Configuration(1)”内存泄漏数据为例，报告如下，此时双击图中高亮信息项，将跳转至如图2所示报错代码行。

      图2 内存泄漏具体位置

父主题： 以MDC工程开发AP应用


Asan内存分析

MDS集成了内存检测工具Asan（AddressSanitizer），能检测内存踩栈、野指针、数组下标越界、多次释放内存、内存泄漏等问题。推荐在代码上库前和进程出现coredump时使用Asan工具进行扫描。

  • 本章节仅适用于Development版本中调试使用。
  • 如果涉及自定义命令输入，请谨慎操作，以免对远程主机造成不可预估的影响。
  • 前提条件
  • 操作步骤
  • Asan错误示例
父主题： 以MDC工程开发AP应用


前提条件

  • MDS中已存在通过编译的MDC工程。
  • 已在MDC中安装addr2line工具，详见如何在计算平台系统中安装binutils等第三方库。
  • 已在目标module下的“CMakeLists.txt”中添加以下内容打开AddressSanitizer编译参数。
    • 若使用llvm编译器，按需增加编译参数-shared-libasan：
      set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -fsanitize-recover=address  -fno-omit-frame-pointer -g -shared-libasan")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address -fsanitize-recover=address -fno-omit-frame-pointer -g -shared-libasan")
    • 若使用gcc编译器，按需增加编译参数-static-libasan：
      set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -fsanitize-recover=address -fno-omit-frame-pointer -g -static-libasan")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address -fsanitize-recover=address -fno-omit-frame-pointer -g -static-libasan")
父主题： Asan内存分析


操作步骤

  1. 打开MDC工程的Asan配置页面。

    1. 在 [image] 视图中，右键单击目标MDC工程，并选择“Debug As > Run Configurations...”，打开“Dekhjnhmzx
    2. mm4pm-·ug Configurations”窗口。
    3. 在“Debug Configurations”窗口中，双击左侧菜单栏“Profile with Asan”创建目标工程的Asan远程运行配置项，并打开对应的Asan配置页面。

      此处运行项名称以默认生成的“mdc_asan”为例，下文将继续延用此示例。

    4. （可选）如需在运行前执行自定义命令（例如export JAVA_HOME=/directory_to_jdk/），可以在“Commands to execute before application”栏输入需要执行的命令（多条命令用“;”隔开）。

      请谨慎使用自定义命令，特别是带有reboot、rm、mv等选项的高危指令，以保证计算平台的正常运行。

  2. 在“Main”页签下完成以下操作，配置目标工程的远程运行参数。

    1. 单击“Search Project...”按钮，在弹窗中选择目标工程编译生成的可执行文件，并单击“OK”。
    2. 单击“Manifest”栏下拉按钮，选择下拉框中可执行文件对应的配置文件。
    3. 单击“Connection”栏的“New”按钮，新建远程连接项，完成如下配置。
      • 若已有具备运行环境的远程主机或在创建MDC工程时配置过远程连接项，可直接在“Connection”栏的下拉框中选择已有远程连接项。且单击“Edit...”按钮可以更新已有远程连接项的配置参数。
      • 一个远程连接项最多可支持同时打开的通道数是有限的，具体取决于SSH服务端的配置。
      1. 弹窗中默认选择“SSH”远程连接协议，并单击“OK”。
      2. 在远程连接项配置弹窗中设置如下参数：
        • “Connection name”：输入远程连接项目名称。
        • “Host”：输入计算平台的IP地址。
        • “User”：输入登录计算平台的用户名。

          具体用户名和对应密码请参考工具适配的MDC计算平台设备对应产品文档中“调测指南（MDC平台环境） > 登录设备”章节。

        • “Password”：输入用户密码。
        • “Port”：输入与SSH服务对应的端口号。
      3. 单击 [image] 。

    4. 单击最下方的“Browse”按钮，选择远程绝对路径，实现将本地MDC工程远程拷贝至计算平台上。

      若出现如下连接错误提示，可参考“如何解决远程连接失败问题”解决。

    5. 单击右下方“Apply”，保存以上配置。

  3. 在“Options”页签下完成以下操作，配置目标工程内存分析的运行参数。

    1. 在“Int Options”区域设置各内存配置参数的取值。
    2. 在“Boolean Options”区域勾选需要检查的内存配置项。
    3. 在“Extra Options”区域输入其他需要检查的内存配置项，多个配置项之间使用冒号（:）隔开。

      具体内存配置项，请参见SanitizerCommonFlags。

    4. 单击右下方“Apply”，保存以上配置。

  4. （可选）在“Arguments”页签下配置程序运行参数或添加自定义配置文件。

    • 配置程序运行参数

      在“Arguments”页签中输入对应参数值，参数作用的程序为“Main”页签下指定的可执行文件（Executable）。

    • 添加自定义配置文件
      1. 使用SSH工具将自定义配置文件拷贝至目标计算平台系统中。
      2. 在“Arguments”页签中输入自定义配置文件在计算平台中的绝对路径，再单击“Apply”，保存配置。

        自定义配置文件将在可执行文件启动后执行。

  5. 单击配置窗口右下方 [image] 。
  6. 使用Asan对目标工程进行内存分析。

    1. 在 [image] 视图中选中目标工程。
    2. 在MDS工具栏的运行选项中选择新建的Asan运行配置项（“mdc_asan”）。

    3. 单击工具栏中运行按钮 [image] ，开始远程运行并解析目标工程。

      build目录下将自动生成“asan/xxx”文件夹，其中的“xxx”为时间戳，如需了解更多，可以查看“asan/xxx”目录下的日志文件。

      内存分析数据会在计算平台系统的应用运行目录下增量保存，如不需要请自行删除。

  7. 查看内存分析报告。

    Asan运行项运行完毕后，在“Asan Profile View”查看内存分析报告，双击定位到代码对应位置。

父主题： Asan内存分析


Asan错误示例

  • alloc-dealloc-mismatch error
  • allocation-size-too-big error
  • container-overflow
  • double_free
  • stack-buffer-overflow
  • global-buffer-overflow
  • heap-use-after-free
  • memory leaks
  • stack-buffer-underflow
父主题： Asan内存分析


alloc-dealloc-mismatch error

#include <iostream>

int main()
{
    int *f = new int[10];
    // do something
    delete[] f;
    std::cout << "Hello World!" << std::endl;
    int *ff = new int[10];
    delete ff;//boom
    return 0;
}

父主题： Asan错误示例


allocation-size-too-big error

#include <iostream>

const int  MAX_STACK_SIZE = 1024*1024*1024;

int function()
{
int *b = (int*)malloc(MAX_STACK_SIZE);// Boom!
b[0]=10;
return b[0];
}
int main()
{
std::cout << "Hello World!" << std::endl;
return function();
}

父主题： Asan错误示例


container-overflow

#include <iostream>
#include <vector>

int main()
{
std::vector<int> v(5);
v.reserve(10);
v[5] = 1;//Boom
v[10] = 1;
return 0;
}

父主题： Asan错误示例


double_free

#include <iostream>

int main() {
int *x = new int[10];
delete [] x;

// do something
std::cout << "Hello World" << std::endl;

delete [] x;
return 0;
}

父主题： Asan错误示例


stack-buffer-overflow

#include <iostream>

int main()
{
std::cout << "Hello World!" << std::endl;
char *str = (char *)malloc(10);

str[30] = '1'; // Boom !
return 0;
}

父主题： Asan错误示例


global-buffer-overflow

#include <iostream>

int x[5];
int main()
{
int b = x[5];
return b;
}

父主题： Asan错误示例


heap-use-after-free

int main() {
char *buffer = new char[40];
delete[] buffer;

// do something

buffer[0] = 42;  // Boom!
return 0;
}

父主题： Asan错误示例


memory leaks

#include <iostream>

void *p;

int main() {
p = malloc(7);
p = 0; // The memory is leaked here.
return 0;
}

父主题： Asan错误示例


stack-buffer-underflow

int main()
{
int index = -1;
char buffer[40];
buffer[index] = 10; // Boom!
return 0;
}

父主题： Asan错误示例


以SCFI工程开发AP应用

SCFI是智能驾驶计算平台基于AP标准开发的服务组件基础框架，集成了AP服务组件开发过程中的代码结构、包结构、包管理、组件标准化、服务代码框架和CMake编译构建等基础框架，支持自动生成对应的实现框架，开发者只需要简单地适配SCFI，即可在计算平台上设计开发AP组件及AP服务，以达到高效开发，聚焦于业务功能的实现的目的。

本文只介绍SCFI的界面开发流程，关于SCFI框架详细的开发流程请参见工具适配的MDC计算平台设备对应产品文档中“SCFI 使用指南”。

  • 开发流程
  • 搭建编译环境
  • 创建SCFI工程
  • 导入SCFI工程
  • 配置SCFI工程属性
  • 生成组件、代码和配置文件
  • 构建工程
  • 远程调试工程
  • 导出组件包
  • SCFI工程生成用户应用包
父主题： MDC Development Studio 使用指南


开发流程

  1. 创建SCFI工程。

    • 创建SCFI工程请参见创建SCFI工程。
    • 导入SCFI工程请参见导入SCFI工程。

  2. （可选）配置SCFI工程属性，包括Toolchain、CMake等属性设置，具体操作请参见配置SCFI工程属性。
  3. 自动生成组件代码和配置文件，具体操作请参见生成组件、代码和配置文件。
  4. 选择对应的编译器构建工程，具体操作请参见构建工程。
  5. 开始远程运行或调测工程，具体操作方法如MDC工程的远程调试方式，请参考远程运行工程或远程调试工程/远程测试工程。

    如需在运行过程中进行性能或内存分析，也可以参考介绍开发MDC工程的MDC工程Perf性能分析或Memcheck内存分析章节。

  6. （可选）导出组件包，请参见导出组件包。
父主题： 以SCFI工程开发AP应用


搭建编译环境

请参见工具适配的MDC计算平台设备对应产品文档中“平台二次开发 > SCFI 使用指南”章节，完成开发环境（Ubuntu桌面版）下交叉编译环境的搭建，用于SCFI工程编译。

父主题： 以SCFI工程开发AP应用


创建SCFI工程

前提条件

  • 已获取SCFI软件包（MDC_SCFI-{version}-Ubuntu{osversion}.tar.gz），用于构建计算平台软件基础框架。

    通过解压MDC_KIT-{version}-{type}.tar.gz包获得，存放于“mdc_tool”目录下。

  • 已将SCFI软件包解压至MDS工具解压目录“/home/MDC_Development_Studio-{version}-Ubuntu{osversion}”内。

操作步骤

  1. 启动MDS。
  2. 打开SCFI工程配置窗口。

    • 在界面上方菜单栏中选择“File > New > SCFI Project”。
    • 若MDS中无工程，可在 [image] 视图中选择 [image] 。

  3. 设置新建SCFI工程，包括工程名称和SDK路径。

    1. 输入工程名称（不能包含中文和特殊字符），此处以scfi_project为例。
    2. 指定SDK目录，即工程包仓目录。
    3. 单击 [image] ，即完成工程创建。

  4. 在 [image] 视图中查看“scfi_project”工程的目录结构。

    自动生成的SCFI工程目录说明如下：

    工程目录

    说明

    Targets

    通过组件源码生成的组件节点。

    build

    存放编译中间件及结果件。

    components

    存放生成的组件源码。

    manifest

    集成了计算平台提供的SDK包中的基础ARXML文件。

    CMakeLists.txt

    默认的顶层CMakeLists文件，用于SCFI搜索、检查环境配置和自动添加子目录下的组件工程。

    pack.json

    用于工程下应用包组件配置的配置文件。

父主题： 以SCFI工程开发AP应用


导入SCFI工程

若本地已有SCFI工程，也可直接导入。

操作步骤

  1. 在界面上方菜单栏中选择“File > Import...”。
  2. 在“Select”弹窗中选择“SCFI > Import as a SCFI Project”，再单击 [image] 。

  3. 单击“Browse...”导入已有SCFI工程，参考如下说明选择参数，再单击 [image] 。

    • （推荐）勾选“Create link in workspace”：直接从选择的工程路径中打开工程。
    • 不勾选“Create link in workspace”：拷贝工程并导入MDS中成为新的SCFI工程。

  4. 工程导入成功后，可在 [image] 视图查看导入工程目录。
父主题： 以SCFI工程开发AP应用


配置SCFI工程属性

通过设置属性配置项的方式，实现SDK的切换或编译构建相关属性的配置。

前提条件

MDS中已存在SCFI工程。

设置SCFI工程属性

  1. 打开SCFI工程的属性配置窗口。

    在 [image] 视图中，右键单击目标SCFI工程，并选择“Properties”。

  2. 配置Toolchain属性，包括依赖的SDK、编译器、工具等所在目录的设置。

    1. 在属性配置窗口左侧导航栏中，选择“Build & Execution > Toolchains”。

    2. 在打开的“Toolchains”窗口中，可参考如下属性说明修改Toolchains默认配置。
      • 不支持输入中文和空格。
      • 只支持修改Location、Cmake和Make项，其余项都自动关联SDK目录。

      属性

      说明

      “Repository Configuration”

      Location

      当前工程所关联的SDK目录。

      “Toolchains Configuration”

      Name

      当前Toolchain配置项的名称。

      SDK

      计算平台SDK目录。

      C Compiler

      C编译器所在目录，默认在SDK目录下。

      C++ Compiler

      C++编译器所在目录，默认在SDK目录下。

      Linker

      Linker工具所在目录，默认在SDK目录下。

      Gcov

      Gcov工具所在目录，默认在SDK目录下。

      CMake

      CMake工具所在目录。

      Make

      Make工具所在目录。
    3. 单击 [image] ，保存以上配置。

  3. 配置CMake属性，包括构建类型、关联的Toolchain等设置。

    1. 在属性配置窗口左侧导航栏中，选择“Build & Execution > CMake”。

    2. 可以参考如下属性说明，在打开的“CMake”页签中修改CMake默认配置。

      属性

      说明

      Name

      CMake当前配置项名称，不支持输入空格。

      Build type

      工程的构建类型，类型包括Debug、Release、RelWithDebInfo和MinSizeRel。

      Toolchain

      Toolchain配置项，根据Toolchain配置名称进行选择。

      CMake options

      自定义CMake选项，当存在编译类参数“DCMAKE_BUILD_TYPE”时，此参数设置项将被“Build type”覆盖。

      Build options

      输入make命令选项。
    3. （可选）管理CMake属性配置。可以根据实际业务需求，参考如下对应需求管理CMake属性配置列表：
      • 新增配置项：单击 [image] ，新增对应属性的配置项。
      • 删除配置项：选中窗口左侧列表中需要删除的配置项，再单击 [image] 。

        当列表中仅剩一条配置时，不可删除。

      • 重置配置项：单击 [image] ，将当前打开的配置项恢复至默认配置。
      • 保存配置：单击 [image] ，保存并生效当前配置项的配置。
      • 错误信息显示：当配置项填充报错时，将光标悬浮至报错图标即可显示。

        报错状态下，新增、删除、选择和保存按钮均处于失效状态。

    4. 单击 [image] ，保存以上配置。

  4. 使以上的所有的属性配置生效，并关闭配置窗口。

    确认配置无误后，单击窗口右下方 [image] 。

查看SDK内置组件库

  1. 在属性配置窗口左侧导航栏中选择“Build & Execution > SDK Management”。
  2. 在打开的“SDK Management”页签中查看当前工程所关联的SDK的内置组件库列表。

    用户通过install脚本安装至SDK中的组件库，会在对应信息行中显示 [image] 按钮用于删除，但内置的计算平台的组件库（即“Type”显示为“MDC”的组件库）不支持删除。

安装第三方库

安装第三方库前，请参见工具适配的MDC计算平台设备对应产品文档中“编译环境搭建指南 > 安装第三方库”章节，确认当前工程所关联SDK中的交叉编译环境已配置lyum源。

  1. 属性配置窗口左侧导航栏中，选择“Build & Execution > RPM Management”。

  2. 在打开的“RPM Management”页签的输入框中，输入root用户密码，并单击 [image] ，切换至root权限。
  3. 在出现的第三方库列表中搜索需要安装的第三方库，并单击Installation列下的 [image] 进行安装。

  4. 安装完成，单击 [image] ，使以上配置生效并关闭配置窗口。
父主题： 以SCFI工程开发AP应用


生成组件、代码和配置文件

SCFI是基于智能驾驶计算平台提供的ARXML文件和用户自定义的ARXML创建组件的，本节介绍了使用SCFI工程生成AP服务组件、代码和配置文件的方法。

如需创建自定义组件，可以直接参考创建自定义组件。

前提条件

本地已有配置完整并经过MMC充分校验的ARXML文件。

操作步骤

  1. （可选）如为MDC 610/620产品，需要使用mdc用户将MDC_Codegen_SDK-{version}-Ubuntu{osversion}.tar.gz解压到“MDC_Development_Studio-{version}-Ubuntu{osversion}/plugins/”目录下。

    tar -xzf $Codegen_SDK_path -C $mds_plugins_path --overwrite

    $Codegen_SDK_path需要替换为MDC_Codegen_SDK-{version}-Ubuntu{osversion}.tar.gz的绝对路径。

    $mds_plugins_path需要替换为MDC_Development_Studio-{version}-Ubuntu{osversion}/plugins的绝对路径。

  2. 在目标SCFI工程的“manifest/modules”目录中导入已有ARXML文件。

    1. 在 [image] 视图中，右键单击“modules”文件夹选择“Import Arxml Files”，打开ARXML文件导入窗口。
    2. 在弹窗中单击“Browse...”，选择文件夹所在路径。以导入“PLATFORM_Sample/manifest/develop/scfi_sample/”目录下的ARXML示例文件为例。

    3. 单击 [image] ，导入指定本地目录下的ARXML文件。
    4. 同理导入“PLATFORM_Sample/manifest/deploy/scfi_sample/”下的ARXML文件。

      导入结果如下所示：

  3. 生成AP服务组件、代码和配置文件。

    1. 在 [image] 视图中，右键单击目标工程选择“Scfi Tool > Create And Refresh Components”。

      选择“Create And Refresh Components”后，工具会自动校验MDS、Codegen_SDK及MDC_SDK的版本信息，校验通过后才会执行生成代码和配置文件的动作，如校验不通过会有弹窗提示，请先保证MDS/Codegen_SDK/MDS_SDK的版本符合要求，再来执行此操作。

      • 校验要求如下：
        • Codegen_SDK和MDC_SDK版本是否一致。
        • MDS和Codegen_SDK/MDC _SDK接口版本是否兼容。
        • 未配置MDS_SDK时，只校验MDS和Codegen_SDK接口版本是否兼容。
      • 如无需校验，可以通过如下偏好设置方法取消。
        1. 在上方菜单栏中选择“Window > Preferences”。
        2. 在“Preference”弹窗左侧菜单中选择“CodeGen”。
        3. 在“CodeGen”页签下取消勾选“Check codeGenSDK version”，并单击“Apply and Close”保存设置。

      视图中显示如下内容。

    2. 在控制台中输入“yes”，按回车键，系统显示“Begin to reparse manifest info...”，请耐心等待约一分钟，系统开始生成代码和配置文件。

      • 显示信息仅供参考，请以实际为准。
      • Create和Refresh功能在不同的控制台窗口，如果想要查看创建组件的日志，请在控制台视窗右侧单击倒三角 [image] ，选择“CDT Build Console”，进入窗口查看日志。
    3. 根据系统提示输入“yes”或者“yes2all”，按回车键，系统开始刷新“scfi_sample”、“generated”和“outputcfg”文件夹。

  4. 确认已生成AP服务组件框架，包括可执行文件、代码和配置文件目录。

    展开 [image] 视图中目标SCFI工程目录，查看自动生成的文件目录。

    请勿手动更改自动生成的“scfi_sample”、“generated”和“outputcfg”文件夹名称及内容，否则可能影响运行结果。

scfi_sample目录说明

生成的scfi_sample目录为AP服务组件框架集成目录，所含子目录和说明如下所示：

表1 scfi_sample目录说明
子目录/文件 | 说明
config | 组件相关的配置文件所在目录。
include | 头文件所在目录。
manifest | 组件相关的ARXML文件所在目录。
src | 编译文件所在目录，如以“.cpp”为后缀的文件。
changelog.txt | 记录组件修改历史的文件。
CMakelists.txt | 设置组件编译逻辑的配置文件。
component.xml | 组件描述文件。

generated目录说明

生成的generated目录为代码输出目录，所含的子目录和说明如下所示：

表2 generated目录说明
图标序号 | 子目录 | 说明
1 | includes | 存放CM模块的接口头文件，包括基本数据类型、PER和CRYPTO等模块接口头文件，以及“_common.h”，“_skeleton.h”或“_proxy.h”格式文件。
2 | src | 存放CM模块用于编译的“.cpp”格式文件。

outputcfg目录说明

生成的outputcfg目录为配置文件的输出目录，所含子目录和说明如下所示：

表3 outputcfg目录说明
图标序号 | 子目录 | 说明
1 | DataType | 输出供rtftools（在线维测工具）使用的“.msg”格式文件。“.msg”格式文件的使用方式，请参见工具适配的MDC计算平台设备对应产品文档中“命令参考 > 代码生成工具支持录制回放特性”章节。
2 | Host0DpMachine | 输出CM、EM、SM等模块的“.json”和“.xml”格式配置文件。

创建自定义组件

  1. 新建SCFI工程组件。

    在 [image] 视图中，右键单击目标SCFI工程，并选择“New > SCFI Componet”。

  2. 配置新建组件。

    在“New SCFI Componet Wizard”弹窗中完成如下操作：

    1. 为组件命名。
    2. 选择组件模版类型，包括executable（可执行文件）、library/static（静态库）和library/shared（动态库）类型。
    3. 默认“C++14”，即模版编译语言版本。
    4. 单击 [image] ，使以上配置生效。

（可选）安装组件包

用户可以将组件安装到包仓便于后续使用。

  1. 在 [image] 视图中，右键单击“Targets”目录下的组件，并选择“Install”。
  2. 组件将自动安装到SDK相应的目录下的包仓中。

    安装示例目录为“/usr/local/mdc_sdk_llvm/dp_gea/user_repo/lib”，打印示例如下：
    2022-05-09 16:30:26,850 [SCFI][INFO]: Make install success!
2022-05-09 16:30:26,850 [SCFI][ INFO]: The command is executed successfully.
Run cmd complete.

    SDK升级后，已经安装的组件包将自动删除，需要重新手动安装。

父主题： 以SCFI工程开发AP应用


构建工程

本节介绍了MDS默认提供的CMake安全构建方式。

前提条件

已配置编译环境。

操作步骤

  1. 生成组件节点。

    在 [image] 视图中选中目标SCFI工程，并单击工具栏中 [image] 加载CMake信息，即可在Targets目录下生成组件节点。

  2. （可选）管理组件依赖库或第三方依赖库。

    在“Project Explorer”视图中，右键单击SCFI工程“Targets”目录下的组件，并选择“Dependency Preference”。

    • 展示当前组件下的所有依赖库

      在“Preferences”弹窗中选择“Display Dependency”页签。

    • 管理当前组件的依赖库或第三方依赖库
      在“Preferences”弹窗中选择组件所需SDK依赖库和第三方库。
      • 在“SDK Management”页签中选择SDK依赖库。
        1. 打开“SDK Management”页签，查看SDK依赖库列表。
        2. 根据实际业务需求开启对应依赖库（ [image] > [image] ），即添加对应依赖库。
        3. 在弹出的添加依赖库的确认框中单击“Yes”。
        4. 单击“Apply and Close”，使以上配置生效并关闭窗口。

      • 在“RPM Management”页签中选择第三方依赖库。
        1. 打开“RPM Management”页签，查看第三方库列表。
        2. 开启（ [image] > [image] ）所需已安装（ [image] ）的第三方依赖库，若所需依赖库显示 [image] ，请先单击 [image] 完成安装再添加。
        3. 单击“Apply and Close”，使以上配置生效并关闭窗口。
        图1 “RPM Management”页签视图（第三方库的版本号以实际为准）

  3. 编译目标组件，构建SCFI工程。

    1. （可选）如需切换编译器（SDK），在 [image] 视图中，右键单击“Targets”目录下需要编译的组件选择“Build Menu > Change SDK”，并在出现的SDK菜单中选择所需SDK。
    2. 在 [image] 视图中，右键单击SCFI工程的“Targets”目录需要编译的组件，并选择“Build Menu > Build”。
    3. 在 [image] 中查看构建打印信息和运行结果。

      若未打开 [image] 视图，在界面上方菜单栏中选择“Window > Show View > Console”打开。

  4. 确认构建成功。若 [image] 打印的信息结尾含有如下加粗部分内容，表示构建成功。

    ...
[100%] Built target scfi_sample
2021-12-16 15:30:28,983 [SCFI][[1;37mINFO[0m]: Build scfi_sample target success!
2021-12-16 15:30:28,984 [SCFI][[1;37mINFO[0m]: The command is executed successfully.

（可选）校验工程

  1. 在 [image] 视图中，右键单击目标SCFI工程，并选择“Scfi Tool > Scfi Validation”。
  2. 观察校验结果。

    配置合法的打印示例如下：

    2021-09-26 21:42:23,493 [SCFI][INFO]: Project validation completed!
2021-09-26 21:42:23,493 [SCFI][INFO]: The command is executed successfully.

    用户可以在任意开发阶段校验工程及组件配置的合法性。

父主题： 以SCFI工程开发AP应用


远程调试工程

  • 如果用户使用MDB工程配置生成SCFI工程，不建议进行远程调试，请直接在计算平台上部署运行。
  • 本章节仅适用于Development版本中调试使用。

SCFI工程的远程运行、测试、性能分析等功能与MDC工程相同，具体方法可以参考MDC工程的相关章节。

任务目的 | 参考目录
远程运行工程 | 远程运行工程
远程调试工程 | 远程调试工程
远程测试工程 | 远程测试工程
Perf性能分析 | MDC工程Perf性能分析
Memcheck内存分析 | Memcheck内存分析
Asan内存分析 | Asan内存分析
父主题： 以SCFI工程开发AP应用


导出组件包

  1. 在 [image] 视图中，右键单击SCFI工程“Targets”目录下需要导出的组件，并选择“Export”。
  2. 在“Export Configuration”弹窗中进行导出设置。

    项目

    设置说明

    “Machine Selection”

    若当前检测到outputcfg中存在当前组件关联Process信息，则需选择Machine。

    “Path Seletion”

    通过“Browse...”按钮选择导出路径。

  3. 单击“OK”，组件包将以设置的包类型导出至指定目录。
父主题： 以SCFI工程开发AP应用


SCFI工程生成用户应用包

操作步骤

  1. 在 [image] 视图中，右键单击目标工程选择“Scfi Tool > Application Package”。
  2. 在配置弹框的Selectable列表中选择需要打包的组件，单击“>”按钮可把需要打包的组件置为已经选择状态。

  3. 单击 [image] ，完成基础包的配置。
  4. （可选）执行以下步骤生成用户应用包。

    1. 单击“Next>”按钮，程序会自动进行预打包，预打包成功后会进入应用包配置页面，用户可在预览页面进行应用包内容的配置。

    2. 完成配置后，单击“Finish”。
    3. 在弹出的密码框下，输入当前用户的密码。

父主题： 以SCFI工程开发AP应用


常用操作指导

本章节介绍了MDS在开发过程中常用的操作指导。

  • 设置智能补全快捷键
  • C/C++编辑器
  • CMake编辑器
  • Shell编辑器
  • 导出文件
  • 导出工程
  • 删除工程
  • 操作EGit
  • 管理远程文件
  • 生成用户应用包
  • 生成主机厂集成软件包
  • 根据PID进行Perf性能分析
父主题： MDC Development Studio 使用指南


设置智能补全快捷键

MDS支持在代码编辑器中设置智能补全快捷键。

  1. 打开首选项设置窗口。

    在界面上方菜单栏中选择“Window > Preferences”。

  2. 打开按键管理页签。

    在“Preferences”窗口左侧菜单栏中选择“General > Keys”。

  3. 设置智能补全快捷键，及相关参数配置。

    在打开的“Keys”窗口中完成如下操作：
    1. 输入关键字“content”进行过滤。
    2. 查看代码提示的默认快捷键，或自定义代码提示快捷键。
      • 查看：在过滤结果中找到“Content Assist”，查看其“Binding”列信息，如“Ctrl+Space”。
      • 自定义：双击“Content Assist”项，并在下方“Binding”输入框内编辑快捷键。
    3. 使以上设置生效，并关闭窗口。

      单击窗口右下方按钮“Apply and Close”。

父主题： 常用操作指导


C/C++编辑器

在C/C++编辑器中提供了引用查看、宏展开、函数跳转、自定义代码块、智能补全、即时显错等功能，有利于配置高效的代码开发环境。

  • 查看引用
  • 宏展开
  • 索引刷新
  • 跳转至已定义/声明函数
  • 代码着色
  • 自定义代码风格
  • 自定义代码块
  • 代码智能补全
  • 即时显错
  • Outline符号列表
父主题： 常用操作指导


查看引用

MDS支持查看符号引用关系或函数调用关系。

操作步骤

  1. 在MDS界面进行代码开发时，在编辑器中选中目标符号或函数。
  2. 以快捷键的方式查看代码的符号引用关系或函数调用关系，并确保使用的快捷键不与其他应用的快捷键重复。

    • 查看符号引用关系

      使用快捷键“Ctrl+Shift+G”，并在出现的“Search”窗口中查看。

    • 查看函数调用关系

      使用快捷键“Ctrl+Alt+H”，并在出现“Call Hier”窗口中查看。

父主题： C/C++编辑器


宏展开

MDS支持宏展开功能，即光标停留在宏位置，能够根据目标变量递归展开。

操作步骤

在MDS代码编辑器内选中宏并按快捷键“Ctrl+=”，在弹窗中查看对应宏定义的宏表达式。

父主题： C/C++编辑器


索引刷新

MDS支持在代码开发过程中对MDC工程进行索引刷新。

操作步骤

  1. 刷新目标MDC工程中的索引。

    右键单击目标工程，并选择“Index > Rebuild”，即可全量刷新目标工程的索引。

  2. （可选）查看索引刷新进度。

    1. 打开视图管理窗口。

      在界面上方菜单栏中选择“Window > Show View > Other...”。

    2. 打开进度查看视图。

      在“Show View”弹窗中选择“General > Progress”。

    3. 在打开的“Progress”视图中，观察索引刷新进度，如下所示：

父主题： C/C++编辑器


跳转至已定义/声明函数

MDS支持在浏览代码时转到定义或者声明的函数。

操作步骤

  1. 选中MDS界面编辑器中需要了解其已定义声明函数的代码。
  2. 按住“Ctrl”，并单击鼠标左键进行跳转。

    跳转至定义或者声明的函数，并高亮显示定义的函数名称。

父主题： C/C++编辑器


代码着色

MDS支持对新引入的基础数据类型做代码着色的增强，自定义着色模板。

操作步骤

  1. 打开首选项设置窗口。

    在界面上方菜单栏中选择“Window > Preferences”。

  2. 打开代码着色配置页签。

    在弹窗左侧菜单栏中选择“C/C++ > Editor > Syntax Coloring”。

  3. 进行代码着色相关参数配置。在“Syntax Coloring”页签中完成如下操作：

    1. 下拉“Element”框中“Code”项。
    2. 以“Build-in types”为例，单击选中“Build-in types”。
    3. 通过勾选“Element”框右侧代码着色相关参数进行配置，可在下方“Preview”框中预览配置效果。
    4. 单击“Apply and Close”，生效以上配置并关闭“Preferences”窗口。

父主题： C/C++编辑器


自定义代码风格

MDS支持自定义代码风格模板，即编码过程中可以自动规范风格。此功能目前支持代码风格模板自定义导入/导出，一键规范代码。

设置自定义代码风格

  1. 打开首选项设置窗口。

    在界面上方菜单栏中选择“Window > Preferences”。

  2. 打开代码风格配置页签。

    在弹窗左侧菜单栏中选择“C/C++ > Code Style > Formatter”。

  3. 在“Formatter”页签中选择、新建、编辑或导入代码风格模板，再单击“Apply and Close”生效配置并关闭“Preferences”窗口。

    若要编辑已有/新建代码风格模板，可参考如下操作步骤：

    • 选择默认模板

      在“Formatter”页签下“Active profile”的下拉框中选择已有模板，并单击右侧“Edit...”。

    • 选择自定义模板
      • 已有自定义模板：在“Formatter”页签下“Active profile”的下拉框中选择已有模板，并单击右侧“Edit...”。
      • 新建自定义模板：单击“New...”新建风格模板，在弹窗中为模板命名，并按需选择代码风格模板（勾选下方“Open the edit dialog now”），再单击“OK”。

      编辑自定义模板时，请避免“Line Wrapping”页签下“Default indentation for wrapped lines”和“Default indentation for initializer lists”的值大于“Maximum line width”的值，建议取值为2、4或8。

应用自定义代码风格

在设置自定义代码风格中选择对应代码风格模板，开发代码时按快捷键“Ctrl+Shift+F”即可应用该模板风格。

父主题： C/C++编辑器


自定义代码块

MDS支持自定义代码块，以便在输入字符时自动提示字符相关的函数、类和符号，但不支持自定义带有特殊字符的代码块。

操作步骤

  1. 打开首选项设置窗口。

    在界面上方菜单栏中选择“Window > Preferences”。

  2. 打开代码模板管理页签。

    在“Preferences”窗口左侧菜单栏中选择“C/C++ > Editor > Templates”。

  3. 新增模板。

    单击“Templates”页签右侧“New...”按钮，打开新增模板配置窗口。

  4. 设置新增模板。

    在“New Template”弹窗中完成如下操作：
    1. 为新模板命名，用于代码开发过程中关键字联想。
    2. （可选）用于描述代码块用途、区别的标识语等。
    3. 输入自定义计算平台代码块。可单击下方按钮“Insert Variable...”，快捷输入常用变量。
    4. 单击“OK”，完成新模块创建。

  5. 使以上配置生效，并关闭“Preferences”窗口。

    单击“Preferences”窗口右下方“Apply and Close”。

  6. 使用自定义代码块。

    在编辑器中开发代码时，可通过输入代码块名称，再按“Ctrl+Space”键选择输入对应自定义代码块。

父主题： C/C++编辑器


代码智能补全

MDS支持在代码编辑器中输入字符时自动提示字符相关的函数、类、符号或自定义代码块。

前提条件

已设置智能补全快捷键。

操作步骤

  1. 在代码开发过程中使用代码补全功能。

    1. 在编辑代码时按默认快捷键（Ctrl+Space）。

      若快捷键无效，确认是否与其他应用快捷键冲突，可通过设置智能补全快捷键中修改快捷键的方式解决。

    2. 在提示弹框中选择所需代码块，即进行代码补全。

父主题： C/C++编辑器


即时显错

MDS支持编码过程中显示编码的错误信息。

操作步骤

  1. 使用通用文本编辑器（Generic Text Editor）打开目标文件。

    在“Project Explorer”视图中，右键单击目标文件选择“Open With > Generic Text Editor”。

  2. 在代码开发过程中查看详细错误信息。

    在编辑器中编写代码时，将实时显示编码的错误位置，单击错误行左侧提示按钮即可查看详细错误信息。

父主题： C/C++编辑器


Outline符号列表

MDS支持将源码文件的符号、类、变量、函数以列表的形式展示出来。

操作步骤

  1. 打开“Outline”视图。

    在界面上方菜单栏中选择“Window > Show View > Outline”。

  2. 在编辑器中编写代码，“Outline”视图会显示当前文件的符号、类、变量和函数列表。

父主题： C/C++编辑器


CMake编辑器

前提条件

已设置智能补全快捷键。

操作步骤

  1. 在 [image] 视图中双击“CMakeLists.txt”文件或后缀为“.cmake”的文件，即可打开CMake编辑器。

  2. 在编辑器中编辑代码时或使用快捷键“Ctrl+Space”。

  3. 选择提示框内有需要输入的代码模板，双击代码模板或使用“Enter”键进行选择，即可补全当前代码块。

父主题： 常用操作指导


Shell编辑器

  • 代码智能补全
  • 自定义代码模板
父主题： 常用操作指导


代码智能补全

前提条件

已设置智能补全快捷键。

操作步骤

  1. （可选）创建“.sh”或“.bash”格式文件，以创建“.sh”格式为例。

    1. 右键单击 [image] 视图中目标工程，并选择“New > File”。
    2. 在“Create New File”弹窗中，为文件命名，并加上后缀“.sh”或“.bash”（以“.sh”为例），再单击 [image] 。

    3. 在“Project Explorer”视图中查看已创建“.sh”格式文件。

  2. 在 [image] 视图中双击后缀为“.sh”或“.bash”的文件，即可打开Shell编辑器。

  3. 在编辑器中编辑代码时或使用快捷键“Ctrl+Space”，在代码下方将出现代码联想提示。

  4. 如果在下方提示框内有需要输入的代码模板，双击选中所需代码模板即可补全当前代码块。
父主题： Shell编辑器


自定义代码模板

如需自定义Shell代码模板，请参考如下步骤修改或新增。

  1. 在界面上方菜单栏中选择“Window > Preferences”。
  2. 在“Preferences”弹窗左侧选择“Shell Template”，打开Shell模板管理页签。

    如下所示，上方框显示已存在Shell模板，下方框显示模板预览效果。

  3. 根据实际业务需求，通过页签右侧按钮管理Shell代码模板，按钮说明如下：

    按钮

    说明

    “New...”

    用于新建自定义代码模板。

    “Edit...”

    用于编辑被选中的代码模板。

    “Remove”

    删除被选中的代码模板。

    “Restore Removed”

    撤销上一次的删除操作。

    “Revert to Default”

    撤销上一次的编辑操作。

    “Import...”

    从本地导入代码模板。

    “Export...”

    导出左侧框内选中的代码模板。

  4. 单击下方“Apply and Close”，使以上配置生效并关闭窗口。

    “Restore Defaults”按钮用于回复默认配置，如还需进入其他页签操作，单击“Apply”即可。

  5. 在Shell编辑器中编辑代码时，通过模版名称提示关联模版的代码。
父主题： Shell编辑器


导出文件

本节以导出生成的“.json”配置文件为例，介绍如何在MDS中导出自动生成的配置文件。

前提条件

已完成生成代码和配置文件。

操作步骤

  1. 在 [image] 视图中，展开目标工程下 [image] 文件夹。
  2. 右键单击需要导出的配置文件（以“machine_manifest.json”为例），并选择 [image] 。
  3. 在“Export”弹窗中选择“General > File System”，再单击 [image] 。

  4. 导出目标配置文件。在出现的新窗口中完成如下操作：

    1. 在左侧选择框内勾选配置文件所在文件夹，右侧选择框内勾选目标配置文件。
    2. 在“To directory”栏内输入或单击“Browse...”指定文件导出路径（以“/home/mdc/workspace”为例）。

      不支持导出至当前工作空间中。

    3. 单击 [image] ，配置文件将导出至指定本地路径。

  5. 获取已导出配置文件。

    1. 进入文件导出目录“/home/mdc/workspace”。
    2. 找到目标配置文件“machine_manifest.json”。

父主题： 常用操作指导


导出工程

MDS支持工程（当前仅支持MDC工程）快速导出功能，以实现不同开发环境下工程的迁移。

前提条件

  • 确认工作台已有默认设置。可通过在菜单栏中选择“Window > Perspective > Reset Perspective...”，恢复工作台默认布局。
  • MDS中存在MDC工程。

操作步骤

  1. 在 [image] 视图中，右键单击目标工程选择 [image] 。
  2. 在“Export”弹窗中选择“MDC > Export MDC Project”，再单击 [image] 。

  3. 导出目标工程。在出现的新窗口中完成如下操作：

    1. 在左侧选择框中勾选需要导出的工程，右侧框将显示工程具体内容。
    2. 单击“Browse...”指定导出工程路径。
    3. 单击 [image] ，完成目标工程的导出。

父主题： 常用操作指导


删除工程

操作步骤

  1. 在 [image] 视图中，右键单击目标工程，并选择“Delete”。
  2. 根据实际业务需求，在“Delete Resources”弹窗中进行对应操作步骤：

    • 仅删除MDS中的工程，仍保留对应本地文件。

      单击“OK”即可。

    • 删除MDS中的工程，并删除对应本地文件。
      1. 勾选“Delete project contents on disk (cannot be undone)”。
      2. 单击“OK”。

父主题： 常用操作指导


操作EGit

使用MDS时，可通过Git在编码界面将工程加入Git版本控制中，或将远程仓库代码Clone至本地。

  • 导入并安装Egit
  • 创建本地仓库
  • Clone远程仓库
  • 管理EGit仓
父主题： 常用操作指导


导入并安装Egit

操作步骤

  1. 下载Egit软件包。建议5.7版本。
  2. 打开MDS，选择“Help > Install New Software...”。
  3. 在“Install”页面单击“Add...”，完成以下配置。

    1. Name：输入Egit的名称。
    2. Location：单击“Archive”选择EGit软件包。
    3. 单击“Add”。
    4. 勾选“Name”列下的以下选项，单击“Next >”。

    5. 勾选“I accept the terms of the license agreement”，单击“Finish”。
    6. 在“Certificates”弹框，勾选证书来源，单击“Accept selected”。
    7. 在“Software Updates”弹框，单击“Restart Now”。

  4. 单击界面右上方工具栏中新建透视图按钮 [image] ，在“Open Perspective”弹窗口中双击 [image] 打开。
父主题： 操作EGit


创建本地仓库

操作步骤

将本地代码加入到Git版本控制中，在Git中管理仓库，使用Git做图形化操作。

  1. 在Git透视图中，单击“Git Repositories”窗口上方按钮 [image] 。
  2. 在弹出的“Create a Git Repository”窗口中单击“Browse...”选择所需本地代码文件，再单击“Create”。

    图1 “Create a Git Repository”窗口操作演示

父主题： 操作EGit


Clone远程仓库

将远程仓库的代码克隆至本地，在Git中管理仓库，使用Git做图形化操作。

  1. 单击“Git Repositories”视图上方按钮 [image] 。
  2. 在弹出的“Source Git Repository”窗口中设置远程Git仓地址（“URI”），设置完成后其余配置项将自动添加，再单击“Next >”。

    图1 “Source Git Repository”窗口操作演示

  3. 在“Create a Git Repository”窗口中选择文件夹，创建Git仓。

    图2 “Create a Git Repository”窗口操作演示
    若已存在Git仓，在出现的分支选择窗口“Branch Selection”中，根据业务需要选择需要的远程代码分支勾选，再单击“Next >”。
    图3 “Branch Selection”窗口操作演示

  4. 在出现的“Local Destination”窗口中单击“Browse”指定本地存放位置，其他配置默认，再单击 [image] 。

    图4 “Local Destination”窗口操作演示

  5. 右键单击“Git Repositories”视图中的“Working Tree”文件夹选择“Import Projects...”导入远程工程。

    图5 “Git Repositories”视图操作演示

  6. 在弹出的“Import Projects from File System or Archive”窗口中确认导入Git仓和工程，再单击 [image] 。

    图6 “Import Projects from File System or Archive”窗口操作演示

  7. 导入成功后可在界面左侧“Git Repositories”视图中查看Clone工程。
父主题： 操作EGit


管理EGit仓

  1. 完成创建本地仓库或Clone远程仓库。

    若已有本地Git仓请单击“Git Repositories”视图上方按钮 [image] ，将仓库添加至Git视图中进行管理。

  2. 在项目透视图 [image] 中修改工程文件并保存。
  3. 单击MDS界面右上角工具栏中按钮 [image] ，切换回Git透视图。

    Git工作界面的“Git Staging”视图中“Unstaged Changes”框将显示修改过的文件。
    图1 “Git Staging”视图“Unstaged Changes”框

  4. 右键单击“Git Staging”视图“Unstaged Changes”框中的目标文件选择“Add to Index” 。

    图2 “Git Staging”视图操作演示

  5. 填写完“Commit Message”后，单击界面右下角 [image] 提交。
  6. 查看分支的历史提交记录。

    在“Git Repositories”视图中右键单击目标工程选择“Show In > History”。

    图3 “Git Repositories”视图操作演示

父主题： 操作EGit


管理远程文件

MDS集成了远程文件管理器，开发者可以通过管理器直接在MDS中管理远程文件，有效提高开发效率。

本章节仅适用于Development版本中调试使用。

打开远程管理视图

MDS界面控制台视图中，远程管理视图默认开启。用户也可以在MDS界面上方菜单栏中选择“Window > Show View > File Explorer”。

远程管理视图打开如下，如需同时显示本地和远程路径，可以单击视图右上角 [image] 同时打开两个环境目录：

远程参数配置

  1. 单击 [image] 视图右上角设置按钮 [image] 。
  2. 参考如下关键项/安装的操作说明，在“Preferences (Filtered)”弹窗中管理远程连接项。

    页签

    项/按钮

    功能

    操作说明

    File Transfer

    List of source files allowed to be transferred without asking

    允许在不询问的情况下传输源文件列表
    • 勾选：允许在不询问的情况下传输源文件列表
    • 取消勾选：不建议传输源文件，在拷贝源文件或包含源文件所在的文件夹时会弹出是否继续传输的询问提示框。

    默认不勾选。

    Remote Connection

    Remote Service

    选择远程服务协议

    仅支持SSH。

    新增远程连接项

    单击按钮，在弹窗中设置如下远程连接参数：

    • “Connection name”：远程连接项命名。
    • “Host”：主机IP地址。
    • “User”：登录用户名。
    • “Password”：登录用户的密码。
    • “Port”：端口号。

    编辑已有远程连接项

    选中目标项，并单击按钮，在弹窗中修改相关参数。

    删除已有远程连接项

    选中目标项，并单击按钮即可删除。

    开启远程连接

    选中目标项，并单击按钮，开启与远程主机的连接。

    关闭远程连接

    选中目标项，并单击按钮，关闭与远程主机的连接。

拷贝远程文件

  1. 确认开启目标远程连接项后，将在视图 [image] 右侧显示远程主机目录。
  2. 直接将 [image] 下的文件或 [image] 一侧本地文件拖至视图 [image] 另一侧目标远程目录下，单次拷贝的文件大小上限为1G。

    同时，也支持将远程目录下的文件拖至本地或者当前MDS [image] 中。

操作远程文件

在 [image] 中，可通过右键单击目标远程文件对其进行管理，菜单栏功能说明如下：

选项 | 功能说明
Open | 打开文件，文件将编辑器中打开，支持在线修改文本文件。
Copy | 复制文件夹/文件。
Copy File Path | 拷贝文件夹/文件的全路径。
Paste | 粘贴文件夹/文件。
Delete | 删除文件夹/文件。
Refresh | 刷新当前目录。
Permission | 修改选中文件夹/文件的权限。
New Folder | 支持为当前目录创建子目录。
Show Command Shell | 打开远程终端，同时打开的窗口数量上限为8。
父主题： 常用操作指导


生成用户应用包

前提条件

  • 已完成交叉编译环境的搭建，详见搭建编译环境。
  • 已经将SCFI软件包“MDC_SCFI-{version}-Ubuntu{osversion}.tar.gz”解压至MDS工具解压目录“/home/MDC_Development_Studio-{version}-Ubuntu{osversion}”内。

操作步骤

  1. 单击工具栏中的 [image] 。
  2. 在“Application Cluster Package”页面，配置用户应用包信息。

    1. 配置基础信息。
      • Package Name：生成的用户应用包的名称。
      • Vendor Name：供应商名称。
      • Version：应用包版本号。
      • Image Size：文件分区大小。单位是MB，取值为正整数，文件大小应小于文件分区。分区大小不能大于当前构建机空闲磁盘空间大小。
      • Output Path：打包后生成的路径。
    2. 在“Preview”区域，单击右键添加文件和目录。

      目录结构，请参见工具适配的MDC计算平台设备对应产品文档中“CI构建软件包 > ... > 规划应用目录”章节。

      • Mod：配置文件权限。如需修改单击“Mod”列手动输入。
      • Owner:Group：文件属组，除root用户外，其他用户应采用编号进行配置。root用户配置为“root:root”，mdc用户配置为“1000:1000”。如需修改单击“Owner:Group”列手动输入。

        执行命令id <username>查询用户ID和属组。例如id mdc，执行结果如下所示：

        uid=1000(mdc) gid=1000(mdc) groups=1000(mdc)
    3. （可选）在“Softlink”区域空白处，双击添加软链接。
      • Mod：配置文件权限。如需修改单击“Mod”列手动输入。
      • Owner:Group：文件属组，除root用户外，其他用户应采用编号进行配置。root用户配置为“root:root”，mdc用户配置为“1000:1000”。如需修改单击“Owner:Group”列手动输入。
    4. 单击 [image] 。
    5. 在“Password”界面，输入当前用户的密码。

      打包成功后会在“Output Path”定义的目录下生成用户应用包“{Package name1}-{version}.zip”。

如需使用命令行生成用户应用包，请参见工具适配的MDC计算平台设备对应产品文档中“CI构建软件包 > ... > 打包”章节。

父主题： 常用操作指导


生成主机厂集成软件包

前提条件

  • 已完成交叉编译环境的搭建，详见搭建编译环境。
  • 已经将SCFI软件包“MDC_SCFI-{version}-Ubuntu{osversion}.tar.gz”解压至MDS工具解压目录“/home/MDC_Development_Studio-{version}-Ubuntu{osversion}”内。
  • （可选）已获取第三方库软件包“MDC_AOS_rpmlist-{version}-llvm-prod.tar.gz”。
  • 已获取用户应用包。具体步骤请参见生成用户应用包。
  • （可选）已获取计算平台软件包“MDC_Upgrade_Package-{version}-llvm-{type}.tar.gzzip”。
  • （可选）已参见工具适配的MDC计算平台设备对应产品文档中的“基础特性开发指南 > MCU二次开发指南”章节，获取MCU二次开发包“MCU-{version}.tar.gz”。

操作步骤

  1. 单击工具栏中 [image] 。
  2. 在“Merge Application Package”界面，配置集成应用包信息。

    1. 配置基础信息。
      • Package Name：生成的集成应用包的名称。
      • Vendor Name：供应商名称。
      • Version：集成应用包版本号。
      • Image Size：文件分区大小。单位是MB，数值只支持正整数，待打包的文件内容大小应小于文件分区。分区大小不能大于当前构建机空闲磁盘空间大小。
    2. 在“Preview”区域，单击右键添加用户应用包。

      用户应用包的格式为ZIP，否则工具会报错。

    3. （可选）在“Rpmlist”区域，单击右键添加第三方库软件包。

      输入GEA域需要的第三方库。多个三方库使用英文逗号隔开。

      输入多个三方库时请使用英文逗号隔开。

    4. 单击“Next>”。

  3. 在“Upgrade Package”界面，配置主机厂集成软件包信息。

    1. 配置基础信息。
      • Package Name：生成的主机厂集成软件包的名称。
      • VenManuf Name：主机厂名称。
      • VehManuf Version：主机厂版本。
      • Product Type：产品类型，该字段为预留字段，暂未使用。
      • Output Path：打包后生成的路径。
    2. （可选）在“Preview”区域，单击右键添加计算平台软件包或者MCU二次开发包。
    3. 单击 [image] 。
    4. 在“Password”界面，输入当前用户的密码。

      打包成功后会在“Output Path”定义的目录下生成主机厂集成软件包“{Package name1}-{VehManuf version}.zip”。

如需使用命令行生成主机厂集成软件包，请参见工具适配的MDC计算平台设备对应产品文档中“CI构建软件包 > ... > 打包”章节。

父主题： 常用操作指导


根据PID进行Perf性能分析

本章节仅适用于Development版本中调试使用。

前提条件

  • 已有一个正在运行的进程
  • 已获取该进程的PID

操作步骤

  1. 单击工具栏中 [image] ，选择“Tools Configurations...”。
  2. 在“Tools Configurations”窗口中，双击左侧菜单栏“Perf Attach Pid”创建目标工程的perf远程运行配置项，并打开对应的perf配置页面。

  3. 在“Perf Options”页签完成以下操作，配置perf性能分析相关参数。

    1. 说明选择所需perf命令。

      具体请参见MDC工程Perf性能分析。

    2. 在“Perf Params”区域，配置Perf参数。
      1. Pid attach to：输入PID。
      2. Frequence：分析频率。默认为每秒10次。
    3. 在“Remote connection related configuration”区域，配置远程连接。

      具体请参见管理远程文件。

    4. 根据实际业务需要设置“Timeout”时间，单位为“秒（s）”，即当分析时间达到设定时间，将自动停止perf分析，此参数适用于死循环程序。

    5. 单击“Apply”。
    6. 单击“Run”。
    7. 查看目标工程的perf性能分析结果。

      具体请参见MDC工程Perf性能分析。

父主题： 常用操作指导


FAQ

  • MDS解压完启动异常
  • 如何在计算平台系统中安装binutils等第三方库
  • 如何在开发环境中安装gdb
  • 如何在开发环境中使用protobuf库
  • 如何使用命令行方式生成代码和配置文件
  • 如何使用命令行方式编译工程
  • 如何处理新旧版本工作空间兼容性问题
  • 如何处理CDT源码中存在的无限弹窗情况
  • 如何处理在MDS中连接计算平台报错问题
  • 如何解决启动MDS报错的问题
  • 如何解决MDS功能缺失的问题
  • 在Development版本中，如何解决MDS调试报错Internal Error
  • 如何解决Ctrl+左键单击无法跳转到定义或声明函数的问题
  • 如何解决在性能分析调用图中，收缩节点时由于边没有正常收起出现异常线条
  • 如何关闭SDK和计算平台版本不匹配弹框
  • 如何解决C/C++编辑器中语法错误没有提示的问题
  • 如何解决远程连接失败问题
  • 如何解决编译器版本号一致时运行弹框问题
  • 如何关闭编译时提示未生成代码和配置文件的提示框问题
  • 通信矩阵
父主题： MDC Development Studio 使用指南


MDS解压完启动异常

问题现象

在启动MDS时，提示如下报错，且无法打开工具。

  • 报错提示一：

  • 报错提示二：

原因分析

问题发生的可能原因如下。

  • 针对提示一的原因：工具解压不完整。
  • 针对提示二的原因：使用的工作空间被已经打开的MDS或其他工具所占用。

处理步骤

  • 针对原因一：先删除现有安装包，重新解压安装压缩包。
  • 针对原因二：替换或新建当前MDS的工作空间。
  • 其他原因请联系华为技术支持处理。
父主题： FAQ


如何在计算平台系统中安装binutils等第三方库

在Development版本中，可以参考如下步骤在计算平台系统中安装binutils等第三方库。

操作步骤

  1. 参见工具适配的MDC计算平台设备对应产品文档中“编译环境搭建指南 > 安装第三方库”章节。

    表1 第三方库说明

    第三方库名称

    说明

    gdbserver

    远程调试的依赖

    valgrind

    Memcheck内存分析的依赖

    binutils

    二进制工具集，asan需要依赖addr2line

  2. 确认目标第三方库安装成功。

    执行name --version命令查询目标第三方库版本号信息，若返回相应版本号信息则安装成功。

父主题： FAQ


如何在开发环境中安装gdb

在Development版本中，如需远程调试在计算平台中运行的应用程序，必须先在开发环境中安装gdb。

操作步骤

  1. 单击进入网址，获取gdb源码包（gdb-9.2.tar.xz）。
  2. 解压gdb源码包。

    在gdb源码压缩包目录下执行命令tar -xvf gdb-9.2.tar.xz。

  3. 新建编译目录“gdb-9.2/build”。

    进入“gdb-9.2”目录，并执行命令mkdir build。

  4. （可选）执行如下命令安装编译所需依赖。

    sudo apt install libz-dev libreadline-dev libexpat1-dev texinfo

  5. 编译并安装gdb。

    1. 配置用于编译的makefile文件，在新建的编译目录（gdb-9.2/build）下执行如下命令：

      ./../configure --prefix=$pwd/gdb_9.2 --enable-gdb-build-warnings=,-Wno-unused --enable-build-with-cxx --enable-werror --with-separate-debug-dir=/usr/lib/debug --disable-sim --disable-rpath --without-stage1-ldflags --disable-libmcheck --with-system-readline --with-expat --without-libexpat-prefix --without-lzma --without-libunwind --enable-64-bit-bfd --with-system-zlib --without-intel-pt --without-mpfr --enable-targets=aarch64-linux-gnu --without-babeltrace --without-guile --disable-tui --without-python --disable-inprocess-agent

    2. 执行编译命令make -j 12，编译完成即安装成功。

      可通过命令ls gdb/gdb查看通过编译的gdb文件。

父主题： FAQ


如何在开发环境中使用protobuf库

此问题仅适用于MDC 610/620产品的Development版本。

操作步骤

  1. 参见《编译环境搭建指南》的“在运行环境中安装”章节，在开发环境中安装protobuf-<version>-aarch64.rpm和protobuf-devel-<version>-aarch64.rpm。

    执行protoc --help，确认安装成功，安装成功如下所示：

  2. 使用root用户登录计算平台。
  3. 创建protobuf接口文件（.proto），在文件中定义需要传输的具体数据结构，定义方法请参考protobuf官网。
  4. 参考如下命令，使用protobuf提供的编译器（protoc）将“.proto”文件编译成目标语言（Java、C++、Python等）的代码文件。

    protoc --proto_path=$IMPORT_DIR --cpp_out=$DST_DIR $SRC_DIR/addressbook.proto

    命令使用示例：
    [root@AOS proto]# protoc --cpp_out=output ./addressbook.proto
[root@AOS proto]# ls output/
addressbook.pb.cc   addressbook.pb.h
    • --proto_path：指定import修饰符扫描的文件夹（“.proto”文件之间相互依赖），可指定多次。
      • 如指定多次，被指定的文件夹将按照先后指定顺序被扫描。
      • 如无指定，将使用当前文件夹作为扫描文件夹。
    • --cpp_out：指定源码文件的输出目录，--java_out和--python_out分别为生成java和python代码路径。
    • $SRC_DIR/addressbook.proto：指定的“.proto”接口文件。

  5. 将“$DST_DIR”目录下的源码文件拷贝至MDS内目标工程的目录下（请根据实际工程结构规划）。
父主题： FAQ


如何使用命令行方式生成代码和配置文件

在Development版本中，智能驾驶计算平台提供了使用MDS生成代码的命令行方式，以方便用户脚本化应用。

前提条件

本地已准备好通过MMC配置，且经过MMC充分校验的ARXML配置文件。

操作步骤

  1. 在Ubuntu开发环境中打开终端。
  2. 进入MDS安装目录。
  3. （可选）若还未在MDS界面激活过License，执行如下命令，激活MDS的License。

    ./generate.sh lic -a $license_path

    • lic表示License管理动作。
    • -a（--active）表示激活。
    • $license_path需要替换为License文件根目录。

    回显提示“Successful activation!”，表示License激活成功。

  4. 生成代码和配置文件至自定义文件目录。

    执行命令./generate.sh gen -i $arxml_folder -o $output_folder -r -e $arxml_exclude_folder -m $modules_name -s -q。

    • gen为代码生成指令，执行代码生成前会判断CodeGenSDK和MDS的版本是否一致，若不一致功能可能受影响，会提示用户是否继续执行代码生成，继续执行输入y，取消代码生成输入n。
    • -i（--input）表示输入目录，将$arxml_folder替换为ARXML文件或文件根目录。
    • -r（--retain）为可选命令选项，用于控制是否删除输出目录下的generated和outputcfg目录。
    • -o（--output）表示输出目录，将$output_folder替换为文件输出目录。
    • -e（--exclude）为可选命令选项，用于排除输入目录的子目录。如需使用请将$arxml_exclude_folder替换为需要排除的$arxml_folder下的子目录。
    • -m（--module）为可选命令选项，用于控制生成哪些模块的代码文件和配置文件。如需使用请将$modules_name替换为模块名称。
    • -s（--serialization）为可选命令选项，用于生成SOME/IP序列化文件。
    • -q （--quiet）为可选命令选项，表示静默模式，静默模式下不会校验CodeGenSDK版本信息
      • 执行命令./generate.sh --help查看哪些模块可执行。当前支持的模块有CoreTypes、CM、EM、PHM、IAM、SM、Per、Log、Crypto_New、NM、UCM、Tsync、Diag、DiagApp、DFX，命令中输入模块名称不区分大小写。

        仅部分产品有MCU模块，具体以实际交付的产品软件版本为准。

    • 输入/输出文件目录都不能包含空格。

    参数“-a $scfi_arxml_folder”和“-c $component_name”已定义，用于内部使用。

  5. 在指定输出目录（$output_folder）文件夹中获取生成的代码和配置文件。

    若生成过程中打印如下提示信息，忽略即可，其对功能使用无影响。

    ERROR StatusLogger Unable to load OSGI services for service class org.apache.logging.log4j.spi.Provider:java.lang.NullPointerException

父主题： FAQ


如何使用命令行方式编译工程

智能驾驶计算平台提供了使用MDS编译工程的命令行方式，以方便用户脚本化应用。

前提条件

已搭建交叉编译环境。

操作步骤

  1. 在Ubuntu开发环境中打开终端。
  2. 执行以下命令，生成用于编译的Makefile文件。

    • X86 SDK：cmake -G "Unix Makefiles" -DCMAKE_TOOLCHAIN_FILE=/opt/platform/mdc_platform/toolchain.cmake -DCMAKE_MAKE_PROGRAM=make -DCMAKE_BUILD_TYPE=Debug <path_to_project>
    • GEA域：cmake -G "Unix Makefiles" -DCMAKE_TOOLCHAIN_FILE=/usr/local/mdc_sdk_llvm/dp_gea/toolchain.cmake -DCMAKE_MAKE_PROGRAM=make -DCMAKE_BUILD_TYPE=Debug <path_to_project>
    • SEA域：cmake -G "Unix Makefiles" -DCMAKE_TOOLCHAIN_FILE=/usr/local/mdc_sdk/dp_sea/toolchain.cmake -DCMAKE_MAKE_PROGRAM=make -DCMAKE_BUILD_TYPE=Debug <path_to_project>
    • path_to_project：工程的绝对路径。
    • CMAKE_BUILD_TYPE：构建类型，可以配置为“Debug”、“Release”、“RelWithDebInfo”或“MinSizeRel”。

  3. 执行命令make编译工程。
父主题： FAQ


如何处理新旧版本工作空间兼容性问题

问题

如何处理MDS版本升级后，可能存在的工作空间兼容性问题？

回答

  1. 为新版本MDS创建新的工作空间。
  2. 以MDC工程方式导入旧工作空间下的工程，即在“Project Explorer”视图导入工程时，在“Import”窗口选择“MDC > Import as a MDC Project”。

父主题： FAQ


如何处理CDT源码中存在的无限弹窗情况

问题

如何处理在进行代码编辑时，出现的无限弹窗问题？

回答

此问题将影响MDS的代码编辑功能，并使“Open Declaration”功能失效，MDS已经通过在代码语义分析中增加判断条件的方式，规避了此问题，以使在MDS中进行正常的代码编辑和跳转。另外CDT源码对复杂的C++新语法支持还存在bug，建议不混用C/C++等语法进行开发，具体问题描述可以参考：https://bugs.eclipse.org/bugs/show_bug.cgi?id=572216和https://bugs.eclipse.org/bugs/show_bug.cgi?id=579932。

父主题： FAQ


如何处理在MDS中连接计算平台报错问题

问题

场景说明：在Development版本中，在本地可以ping通计算平台设备，并可以使用SSH功能连上设备的前提下，在MDS中连接设备时报错。

如何解决在MDS中连接设备报错的问题？

回答

根据当前环境配置代码的实际情况，在菜单栏中选择“Window > Preferences”打开“Preferences”窗口，搜索“proxy”，在弹出的如下页签中设置代理模式。

表1 代理方式说明
代理方式（Provider） | 说明
Direct | 直连模式，即不使用代理。
Manual | 自定义代理模式，即使用在MDS中配置的代理。
Native | 本地代理模式，即使用本地环境配置的代理。
父主题： FAQ


如何解决启动MDS报错的问题

问题

如何处理在启动MDS时，提示报错，无法打开工具的情况？

回答

  • 启动MDS时，弹出如下报错提示，可能原因为工具解压不完整，请先删除现有安装包，重新解压安装压缩包。

  • 启动MDS时，弹出如下提示，可能原因为使用的工作空间被已经打开的工具所占用，请替换或新建工作空间。

父主题： FAQ


如何解决MDS功能缺失的问题

问题

如何解决MDS工具栏中缺失本文档所描述的功能的问题？

回答

重新解压安装MDS。

父主题： FAQ


在Development版本中，如何解决MDS调试报错Internal Error

问题

单击“debug”后弹出“Internal Error”告警框，单击“Yes”后MDS强制关闭。

回答

在MDS安装目录下，将文件“mdc_development_studio.ini”中“-Xmx”的值改大一些（如4096）。修改后重新打开MDS，并更换一个workspace。

父主题： FAQ


如何解决Ctrl+左键单击无法跳转到定义或声明函数的问题

问题

Ctrl+左键单击无法跳转到定义或声明函数。

回答

索引未刷新，可通过右键单击工程，选择“Index > Rebuild”来主动重建索引。

父主题： FAQ


如何解决在性能分析调用图中，收缩节点时由于边没有正常收起出现异常线条

问题

在Development版本中，性能分析调用图中，收缩节点时由于边没有正常收起出现异常线条。

回答

调用图提供了隐藏/显示的功能，当调用图被隐藏后再次显示时，异常的线条会消失。隐藏/显示的功能默认打开，可单击左侧“hide/show(double click to fresh)”进行调整。

父主题： FAQ


如何关闭SDK和计算平台版本不匹配弹框

问题

在Development版本中，如何关闭SDK和计算平台版本不匹配弹框？

回答

MDS提供检查SDK交叉编译环境和计算平台运行时环境是否配套的功能。该功能默认打开，在执行远程运行相关功能时（包括运行、调试、性能分析、内存分析、覆盖率报告）默认检查。如需关闭此功能，请单击“Windows > Preferences”，选择“Run/Debug > Launching > Extended Configuration”，取消勾选“Check version before launch”。

父主题： FAQ


如何解决C/C++编辑器中语法错误没有提示的问题

问题

代码存在语法错误时编辑器没有提示？

回答

CDT源码索引功能对C++新语法支持还存在bug，开启语法分析可能存在误标记问题，该问题已提交社区：https://bugs.eclipse.org/bugs/show_bug.cgi?id=580176。

可参考如下操作步骤开启语法分析：

  1. 单击菜单栏“Window > Preferences”，打开首选项配置页。
  2. 展开C/C++，单击Code Analysis，勾选Syntax and Semantic Errors选项并保存。

父主题： FAQ


如何解决远程连接失败问题

问题

在Development版本，如何解决远程连接失败问题？

回答

需要确保输入的密码正确，网络连接正常，若仍不能解决，可参考如下操作步骤开启密码保存方式：

  1. 单击菜单栏“Window > Preferences”，打开首选项配置页。
  2. 在“Preferences”弹窗左侧菜单中选择“General > Security > Secure Storage”，勾选“Password”页签中的“UI Prompt”选项，并单击“Apply”保存修改。

  3. （可选）若完成上述步骤后，远程连接仍异常，可能是工具当前使用的密钥环文件异常，可以参考如下方法解决。

    1. 在步骤2打开的“Secure Storage”窗口中选择“Contents”页签。
    2. 选中使用中的密钥环文件（[Defalt Secure Storage]），并单击右下角删除按钮（Delete）。
    3. 单击“Apply and Close”，使修改生效并关闭窗口。

      生效后MDS将自动重启，请在重启后再次远程连接。

父主题： FAQ


如何解决编译器版本号一致时运行弹框问题

问题

如何解决编译器版本号一致时运行弹框问题？示例如下：

回答

请检查MDS所选SDK是“mdc_sdk_llvm”，如果不是请切换成“mdc_sdk_llvm”。可以参考如下步骤解决：

  1. 右键单击目标工程，在下拉菜单中选择Change SDK。
  2. 在展开的列表中检查勾选的编译器是“clang-aos_gea-aarch64-/*/mdc_sdk_llvm/dp_gea/mdc_cross_compiler”。
父主题： FAQ


如何关闭编译时提示未生成代码和配置文件的提示框问题

问题

在Development版本中，如何关闭编译时提示未生成代码和配置文件的提示框？

回答

MDS提供了编译时检查是否已经生成代码和配置文件的功能。该功能默认打开，在执行编译时默认检查。

如需关闭此功能，请单击“Windows > Preferences”，在“Preferences”界面选择“C/C++ > Build > Check”，取消勾选“Check code generation before the build.”。

父主题： FAQ


通信矩阵

表1 通信矩阵
源设备 | gdbclient | MDS
源IP | 由MDS部署所在Ubuntu机器决定，与计算平台目标IP在同一个网段 | 由MDS部署所在Ubuntu机器决定，与计算平台目标IP在同一个网段
源端口 | 随机分配 | 随机分配
目的设备 | SoC | SoC
目的IP | 192.168.10.6 | 192.168.10.6
目的端口（侦听） | 2345 | 22
协议 | TCP | TCP
端口说明 | 开发阶段通过gdbclient连接计算平台开发板进行gdb远程调试，计算平台开发板提供gdbserver，gdbclient获取到的调试信息在MDS上进行可视化展示 | 开发阶段MDS集成SSH客户端连接计算平台开发板执行远程命令或者上传下载文件，计算平台开发板提供SSH服务端
侦听端口是否可更改 | 是 | 是
认证方式 | 不涉及 | 帐号口令认证
加密方式 | 不涉及 | 基于SSH协议的AES对称加密传输
备注 | gdb远程调试仅用于开发阶段，计算平台开发版本保留gdbserver，量产版本不支持gdb远程调试 | SSH远程连接仅用于开发阶段，计算平台开发版本保留SSH服务端，量产版本不支持SSH远程连接
父主题： FAQ


MindStudio 使用指南

MindStudio支持图形化界面方式进行应用开发、调试和模型转换，同时支持网络移植、优化和分析等功能。

本章节提供的安装指南和使用指南仅用于development版本。production版本配套的Mindstudio工具包下载链接、安装与使用指导参见软件包（MindStudio_{version}_linux.tar.gz）中readme文件说明。

  • 安装与卸载
  • 操作指南


安装与卸载

本文档提供MindStudio工具在Linux环境下的安装操作指导与常见问题定位。

  • 简介
  • 安装方案
  • 安装操作（Linux）
  • 更新MindStudio
  • 卸载MindStudio
  • 常用操作
  • FAQ
父主题： MindStudio 使用指南


简介

软件包介绍

  • MindStudio：提供图形化开发界面，支持应用开发、调试和模型转换功能，同时还支持网络移植、优化和分析等功能。
  • Ascend-cann-toolkit：开发套件包。为开发者提供基于对应 AI处理器的相关算法开发工具包，旨在帮助开发者进行快速、高效的模型、算子和应用的开发。开发套件包只能安装在Linux服务器上，开发者可以在安装开发套件包后，使用MindStudio开发工具进行快速开发。
父主题： 安装与卸载


安装方案

  • 安装方案（Linux）
父主题： 安装与卸载


安装方案（Linux）

MindStudio和Ascend-cann-toolkit可以使用Linux服务器上原生桌面自带的终端gnome-terminal进行安装，也可以在Windows服务器上通过SSH登录到Linux服务器进行安装。因为MindStudio是一款GUI程序，所以在Windows服务器上通过SSH登录到Linux服务器进行安装时，需要使用集成了X server的SSH终端（比如MobaXterm，该工具版本需要为v20.2及以上）。

分部署形态

该场景下纯开发环境需要安装MindStudio和Ascend-cann-toolkit，如图1所示。昇腾AI设备上运行环境的安装操作请参见《开发环境安装指南》。

图1 分部署形态
父主题： 安装方案


安装操作（Linux）

  • 安装流程
  • 环境要求
  • 准备软件包
  • 准备安装用户
  • 安装依赖
  • 安装和配置MindStudio
  • 配置编译环境
父主题： 安装与卸载


安装流程

MindStudio安装流程如图1所示。

图1 MindStudio安装流程
父主题： 安装操作（Linux）


环境要求

MindStudio环境要求如表1所示。

表1 MindStudio环境要求

类别

限制要求

说明

硬件
  • 内存：最小4GB，推荐8GB
  • 磁盘空间：最小6GB
  • 若Linux宿主机内存为4G，在MindStudio中进行模型转换时，建议Model文件大小不超过350M，如果超过此规格，操作系统可能会因为超过安全内存阈值而工作不稳定。
  • 若Linux宿主机配置升级，比如8G内存，则相应支持的操作对象规格按比例提升。

    例如，内存由4G升级到8G，则Model文件建议大小不超过700M。

系统语言

en_US.UTF-8
  • 当前仅支持系统语言为英文。
  • 请以任意用户使用locale命令在任意路径下查询编码格式，若系统返回“LANG=en_US.UTF-8”，则表示正确；否则，请以root用户使用“vim /etc/default/locale”命令修改“LANG=en_US.UTF-8”，重启（使用reboot命令）使之生效。

系统要求
  • 操作系统可以通过SSH登录，同时打开SSH的X11Forwarding功能
  • glibc版本应大于或等于2.27
  • SSH服务的开启和X11Forwarding的配置请参见启动MindStudio时无法显示图形化界面。
    对于Docker环境，启动容器时需要映射SSH端口，如
    docker run -p {宿主机端口}：{容器内SSH端口} ...
  • 若系统glibc版本小于2.27，请参见启动MindStudio时报glibc版本太低处理。

已验证支持的操作系统
  • Ubuntu 18.04-x86_64
  • Ubuntu 18.04-aarch64
  • Ubuntu 20.04-x86_64
  • Ubuntu 20.04-aarch64
  • EulerOS 2.8-aarch64
  • EulerOS 2.9-aarch64
  • EulerOS 2.9-x86_64
  • EulerOS 2.10-aarch64
  • EulerOS 2.10-x86_64
  • OpenEuler 20.03-x86_64
  • OpenEuler 20.03-aarch64
  • OpenEuler 22.03 LTS-x86_64
  • OpenEuler 22.03 LTS-aarch64
  • CentOS 7.6/8.2-x86_64
  • CentOS 7.6/8.2-aarch64
  • 银河麒麟OS V10 SP1-aarch64
  • 中标麒麟OS 7.6-aarch64

-
父主题： 安装操作（Linux）


准备软件包

下载软件包

软件安装前，请参考表1获取所需软件包和对应的数字签名文件。

表1 软件包

软件包

说明

获取链接

MindStudio_{version}_linux_{arch}.tar.gz

MindStudio软件包，含有GUI的集成开发环境。

MindStudio安装包解压后包含以下文件：

  • bin：MindStudio的执行目录及依赖的二进制文件
  • build.txt：安装包构建信息
  • Install-Linux-tar.txt：MindStudio安装说明
  • jbr：64位系统的依赖库以及文件
  • lib：Java依赖库
  • license：所用的第三方依赖的许可证
  • LICENSE.txt：Apache Licence说明文档
  • NOTICE.txt：注意事项
  • plugins：MindStudio所用到的基本插件及Java库
  • product-info.json：MindStudio版本号以及执行文档路径
  • tools：工具库

获取软件包

Ascend-cann-toolkit_{version}_linux-{arch}.run

Ascend-cann-toolkit开发套件包，包含开发辅助工具和相关开发接口的开发套件包。

如果环境上已安装Ascend-cann-toolkit开发套件包，则无需再次获取。

  • 对于MDC产品，请在MDC软件页签下下载MDC_xxx_ACC_LIB-{software version}.tar.gz软件包，解压后即可获取该run包。
    说明：

    MDC_xxx_ACC_LIB-{software version}.tar.gz软件包中xxx表示型号，{software version}表示版本号，具体以实际获取的软件包为准。

    dev表示development版本使用的软件包，prod表示production版本使用的软件包。

获取软件包

软件完整性验证

为了防止软件包在传递过程或存储期间被恶意篡改，下载软件包时需下载对应的数字签名文件用于完整性验证。华为提供软件包PGP（后缀名为.asc）和CMS（后缀名为.p7s）两种格式的数字签名，分别用于手工验证和系统自动验证。

  • 手工验证：在软件包下载之后，请参考《OpenPGP签名验证指南》，对从网站下载的软件包进行PGP数字签名校验，确保软件包未被篡改。
    • 运营商客户请访问：http://support.huawei.com/carrier/digitalSignatureAction
    • 企业客户请访问：https://support.huawei.com/enterprise/zh/tool/pgp-verify-TL1000000054
  • 自动验证：在软件包下载之后，与软件包同步上传网管/部署工具，由网管/部署工具进行验证，确保软件包未被篡改。

如果校验失败，请重新下载软件包和数字签名再次进行校验。如果仍校验失败，请联系华为技术支持工程师解决。

注：使用软件包安装/升级之前，也需要按上述过程先验证软件包的数字签名，确保软件包未被篡改。

父主题： 安装操作（Linux）


准备安装用户

如果已安装Ascend-cann-toolkit开发套件包，请使用Ascend-cann-toolkit开发套件包的安装用户安装MindStudio。

如果未安装Ascend-cann-toolkit开发套件包（可参考《开发环境安装指南》《CANN 6.3.RC2 软件安装指南》或《CANN 6.2.RC2 软件安装指南》的“安装”章节安装），请执行如下操作创建安装用户。

创建安装用户

可使用root或非root用户进行安装。

  • 若使用root用户安装，可直接开始安装依赖。
  • 若使用已存在的非root用户安装，须保证该用户对$HOME目录具有读写以及可执行权限。
  • 若使用新的非root用户安装，则需要先创建该用户，请参见如下方法创建（请以root用户执行以下命令）。
    1. 创建用户组和安装用户并设置该用户的$HOME目录。
      其中usergroup为用户组，username为用户名。
      groupadd usergroup
useradd -g usergroup -d /home/username -m username -s /bin/bash

      以HwHiAiUser组为例，可执行如下命令创建软件包安装用户并加入到HwHiAiUser组中。

      groupadd HwHiAiUser
useradd -g HwHiAiUser -d /home/username -m username -s /bin/bash
    2. 执行以下命令设置非root用户密码。
      passwd username
父主题： 安装操作（Linux）


安装依赖

  • 依赖列表
  • 安装步骤（Ubuntu）
父主题： 安装操作（Linux）


依赖列表

安装MindStudio和Ascend-cann-toolkit开发套件包前需要安装相关依赖，依赖列表如下：

  • Ubuntu
    表1 依赖列表

    软件包

    依赖名称

    说明

    Python

    gcc
    • 编译安装Python需要的依赖。
    • libsqlite3-dev需要在Python安装之前安装，如果用户操作系统已经安装满足版本要求的Python环境，在此之后再安装libsqlite3-dev，则需要重新编译Python环境。
    说明：

    如果当前系统中gcc版本低于7.3.0，建议升级gcc版本至7.3.0及其以上版本。安装gcc-7.3.0详细操作请参见《CANN 6.3.RC2 软件安装指南》的“常用操作 > 安装7.3.0版本gcc”“章节。

    g++

    cmake

    make

    zlib1g-dev

    libbz2-dev

    libsqlite3-dev

    libssl-dev

    libffi-dev

    liblzma-dev

    Ascend-cann-toolkit开发套件包

    pciutils

    -

    net-tools

    -

    unzip

    -

    libsqlite3-dev

    -

    python

    版本要求：3.7.5

    protobuf

    版本要求：>=3.13.0

    psutil

    -

    numpy

    版本要求：>=1.13.3

    scipy

    aarch64架构需要先安装相关依赖：libblas-dev、gfortran、libblas3、liblapack-dev

    decorator

    版本要求：>=4.4.0

    sympy

    版本要求：>= 1.5.1

    cffi

    版本要求：>=1.12.3

    pyyaml

    -

    pathlib2

    -

    MindStudio

    xterm

    MindStudio显示运行依赖的库文件

    x11-apps

    firefox

    MindStudio显示html报告依赖的软件

    xdg-utils

    openssh-server

    MindStudio远程连接依赖的软件

    libdbus-glib-1-dev

    -

    gdb

    C/C++调试依赖软件

    python

    版本要求：3.7.5

    grpcio

    -

    pylint

    -

    requests

    -

    absl-py

    -

    pandas（可选）

    分析迁移工具依赖软件

    coverage（可选）

    UT工具依赖软件

    gnureadline（可选）

    需要先安装相关依赖：libffi-dev、libncurses5-dev

    TIK依赖软件

    xlrd（可选）

    创建算子工程依赖软件

    版本要求：1.2.0
父主题： 安装依赖


安装步骤（Ubuntu）

检查源

安装过程需要下载相关依赖，请确保安装环境能够连接网络。

请在root用户下执行如下命令检查源是否可用。

apt-get update

如果命令执行报错或者后续安装依赖时等待时间过长甚至报错，则检查网络是否连接或者把“/etc/apt/sources.list”文件中的源更换为可用的源或使用镜像源（以配置华为镜像源为例，可参考华为开源镜像站）。

检查root用户的umask

  1. 以root用户登录安装环境。

  2. 检查root用户的umask值。

    umask

  3. 如果umask不等于0022，请执行如下操作配置，在该文件的最后一行添加umask 0022后保存。

    1. 在任意目录下执行如下命令，打开.bashrc文件：
      vi ~/.bashrc

      在文件最后一行后面添加umask 0022内容。

    2. 执行:wq!命令保存文件并退出。
    3. 执行source ~/.bashrc命令使其立即生效。

依赖安装完成后，请用户恢复为原umask值（删除.bashrc文件中umask 0022一行）。基于安全考虑，建议用户将umask值改为0027。

配置安装用户权限

当用户使用非root用户安装时，安装MindStudio前需要下载相关依赖软件，可能需要用到提权命令，请用户自行获取所需的sudo权限，使用完成后请取消涉及高危命令的权限，否则有sudo提权风险。

安装依赖

  1. 检查系统是否安装Python依赖以及gcc等软件。

    分别使用如下命令检查是否安装gcc，make以及Python依赖软件等。
    gcc --version
g++ --version
make --version
cmake --version
dpkg -l zlib1g-dev| grep zlib1g-dev| grep ii
dpkg -l libbz2-dev| grep libbz2-dev| grep ii
dpkg -l libsqlite3-dev| grep libsqlite3-dev| grep ii
dpkg -l libssl-dev| grep libssl-dev| grep ii
dpkg -l libffi-dev| grep libffi-dev| grep ii
dpkg -l liblzma-dev| grep liblzma-dev| grep ii
dpkg -l unzip| grep unzip| grep ii
dpkg -l pciutils| grep pciutils| grep ii
dpkg -l net-tools| grep net-tools| grep ii
dpkg -l libblas-dev| grep libblas-dev| grep ii
dpkg -l gfortran| grep gfortran| grep ii
dpkg -l libblas3| grep libblas3| grep ii
dpkg -l liblapack-dev| grep liblapack-dev| grep ii
dpkg -l openssh-server| grep openssh-server| grep ii
dpkg -l xterm| grep xterm| grep ii
dpkg -l firefox| grep firefox| grep ii
dpkg -l xdg-utils| grep xdg-utils| grep ii
dpkg -l libdbus-glib-1-dev | grep libdbus-glib-1-dev  | grep ii
dpkg -l gdb | grep gdb  | grep ii

    若分别返回如下信息则说明已经安装，进入下一步（以下回显仅为示例，请以实际情况为准）。

    gcc (Ubuntu 7.3.0-3ubuntu1~18.04) 7.3.0
g++ (Ubuntu 7.3.0-3ubuntu1~18.04) 7.3.0
GNU Make 4.1
cmake version 3.10.2
ii  zlib1g-dev:arm64 1:1.2.11.dfsg-0ubuntu2 arm64        compression library - development
ii  libbz2-dev:arm64 1.0.6-8.1ubuntu0.2 arm64        high-quality block-sorting file compressor library - development
ii  libsqlite3-dev:arm64 3.22.0-1ubuntu0.3 arm64        SQLite 3 development files
ii  libssl-dev:arm64 1.1.1-1ubuntu2.1~18.04.6 arm64     Secure Sockets Layer toolkit - development files
ii  libffi-dev:arm64 3.2.1-8      arm64        Foreign Function Interface library (development files)
ii  liblzma-dev:amd64 5.2.2-1.3    amd64        XZ-format compression library - development files
ii  unzip          6.0-21ubuntu1 arm64        De-archiver for .zip files
ii  pciutils       1:3.5.2-1ubuntu1 arm64        Linux PCI Utilities
ii  net-tools      1.60+git20161116.90da8a0-1ubuntu1 arm64        NET-3 networking toolkit
ii  libblas-dev:arm64 3.7.1-4ubuntu1 arm64        Basic Linear Algebra Subroutines 3, static library
ii  gfortran       4:7.4.0-1ubuntu2.3 arm64        GNU Fortran 95 compiler
ii  libblas3:arm64 3.7.1-4ubuntu1 arm64     Basic Linear Algebra Reference implementations, shared library
ii  liblapack-dev:arm64 3.7.1-4ubuntu1 arm64        Library of linear algebra routines 3 - static version
ii  openssh-server 1:7.6p1-4ubuntu0.5 arm64        secure shell (SSH) server, for secure access from remote machines
ii  xterm          330-1ubuntu2 arm64        X terminal emulator
ii  firefox        83.0+build2-0ubuntu0.18.04.2 arm64        Safe and easy web browser from Mozilla
ii  xdg-utils      1.1.2-1ubuntu2.5 all          desktop integration utilities from freedesktop.org
ii  libdbus-glib-1-dev 0.110-2      arm64        deprecated library for D-Bus IPC (development files)
ii  gdb            8.1.1-0ubuntu1 arm64        GNU Debugger
    否则请执行如下安装命令（如果只有部分软件未安装，则如下命令修改为只安装还未安装的软件即可）：
    • 如果使用root用户安装依赖，请将步骤1至步骤2命令中的sudo删除。
    • 如果Python及其依赖是使用非root用户安装，则需要执行su - username命令切换到非root用户继续执行步骤1至步骤3。
    • libsqlite3-dev需要在Python安装之前安装，如果用户操作系统已经安装满足版本要求的Python环境，在此之后再安装libsqlite3-dev，则需要重新编译Python环境。
    sudo apt-get install -y gcc g++ make cmake zlib1g-dev libbz2-dev libsqlite3-dev libssl-dev libffi-dev unzip pciutils net-tools libblas-dev gfortran libblas3 liblapack-dev openssh-server xterm firefox xdg-utils libdbus-glib-1-dev gdb

  2. 检查系统是否安装满足版本要求的Python开发环境（具体要求请参见表1。

    执行命令python3 --version，如果返回信息满足Python版本要求，则直接进入下一步。

    否则可参考如下方式安装Python3.7.5。

    1. 使用wget下载Python3.7.5源码包，可以下载到安装环境的任意目录，命令为：
      wget https://www.python.org/ftp/python/3.7.5/Python-3.7.5.tgz
    2. 进入下载后的目录，解压源码包，命令为：
      tar -zxvf Python-3.7.5.tgz
    3. 进入解压后的文件夹，执行配置、编译和安装命令：
      cd Python-3.7.5
./configure --prefix=/usr/local/python3.7.5 --enable-loadable-sqlite-extensions --enable-shared
make
sudo make install

      其中“--prefix”参数用于指定Python安装路径，用户根据实际情况进行修改。“--enable-shared”参数用于编译出libpython3.7m.so.1.0动态库。“--enable-loadable-sqlite-extensions”参数用于加载libsqlite3-dev依赖。

      本手册以--prefix=/usr/local/python3.7.5路径为例进行说明。执行配置、编译和安装命令后，安装包在/usr/local/python3.7.5路径，libpython3.7m.so.1.0动态库在/usr/local/python3.7.5/lib/libpython3.7m.so.1.0路径。

    4. 设置Python3.7.5环境变量。
      #用于设置Python3.7.5库文件路径
export LD_LIBRARY_PATH=/usr/local/python3.7.5/lib:$LD_LIBRARY_PATH
#如果用户环境存在多个Python3版本，则指定使用Python3.7.5版本
export PATH=/usr/local/python3.7.5/bin:$PATH

      通过以上export方式设置环境变量，该种方式设置的环境变量只在当前窗口有效。您也可以通过将以上命令写入~/.bashrc文件中，然后执行source ~/.bashrc命令，使上述环境变量永久生效。注意如果后续您有使用环境上其他Python版本的需求，则不建议将以上命令写入到~/.bashrc文件中。

    5. 安装完成之后，执行如下命令查看安装版本，如果返回相关版本信息，则说明安装成功。
      python3 --version
pip3 --version

  3. 安装前请先使用pip3 list命令检查是否安装相关依赖，若已经安装，则请跳过该步骤；若未安装，则安装命令如下（如果只有部分软件未安装，则如下命令修改为只安装还未安装的软件即可）。以下依赖为必要安装依赖，其他依赖用户可根据实际需要自行安装。

    • 请在安装前配置好pip源，具体可参考配置pip源。
    • 安装前，建议执行命令pip3 install --upgrade pip进行升级，避免因pip版本过低导致安装失败。
    • 如下命令如果使用非root用户安装，需要在安装命令后加上--user，例如：pip3 install numpy --user。
    pip3 install numpy
pip3 install decorator
pip3 install sympy
pip3 install cffi
pip3 install pyyaml
pip3 install pathlib2
pip3 install psutil
pip3 install protobuf
pip3 install scipy
pip3 install requests
pip3 install grpcio
pip3 install pylint
pip3 install absl-py
    • 如果执行上述命令时报错“subprocess.CalledProcessError：Command '('lsb_release', '-a')' return non-zero exit status 1”，请参见pip3 install报错“subprocess.CalledProcessError：Command '('lsb_release', '-a')' return non-zero exit status 1”。
    • 如果执行上述命令时提示例如“Could not find <Python.h>”或者“fatal error：Python.h：No such file or directory”等信息，请参见安装依赖时提示未安装或找不到Python.h解决。

依赖安装完成后，请用户恢复为原umask值（参考检查root用户的umask，删除.bashrc文件中umask 0022一行）。基于安全考虑，建议用户将umask值改为0027。

父主题： 安装依赖


安装和配置MindStudio

  • 安装MindStudio
  • 配置MindStudio
父主题： 安装操作（Linux）


安装MindStudio

  • 当前不支持在同一服务器的同一目录安装多个MindStudio，如果系统上同一目录下已存在MindStudio，请参见卸载操作（Linux），将原MindStudio卸载后再进行安装。
  • 请使用MindStudio的安装用户登录，不支持使用其他用户登录后再切换到MindStudio的安装用户。

前提条件

  • 已完成准备软件包至安装依赖。
  • 已参考《开发环境准备》完成Ascend-cann-toolkit开发套件包的安装。

操作步骤

  1. 使用MindStudio的安装用户上传软件包至待安装环境。
  2. 解压MindStudio软件包。

    使用MindStudio的安装用户在软件包所在路径执行如下命令，解压MindStudio_{version}_linux_{arch}.tar.gz软件包。

    tar -zxvf MindStudio_{version}_linux_{arch}.tar.gz

    软件包解压后的内容以及说明请参见表1。

  3. 使用MindStudio的安装用户进入软件包解压后的MindStudio/bin目录并启动MindStudio。

    cd MindStudio/bin
./MindStudio.sh
    • 如果启动MindStudio时，出现“Failed to initialize graphics environment”、“Unable to detect graphics environment ”或“Can't connect to X11 window server using 'localhost:xxx' as the value of the DISPLAY variable”报错信息，处理方法请参见启动MindStudio时无法显示图形化界面。
    • 如果启动MindStudio时，出现“WARNING: Install the haveged service by referring to the installation guide.”提示信息，处理方式请参见启动MindStudio时提示“WARNING: Install the haveged service by referring to the installation guide.”。
    • 如果在Euler2.10启动MindStudio时，提示找不到libXext.so.6文件，请参见启动MindStudio时报“java.lang.UnsatisfiedLinkError: /home/username/MindStudio/jbr/lib/libawt_xawt.so”处理。
    • 如果启动MindStudio时，提示无法为对象堆保留足够空间，请参见设置超大内存后无法启动MindStudio处理。
    • 若想指定MindStudio的运行时环境，可在$HOME/.config/Huawei/MindStudioMS-{version}目录创建mindstudio.jdk文件，并把用户的JBR或JDK安装目录写进去。
      图1 mindstudio.jdk（示例）

父主题： 安装和配置MindStudio


配置MindStudio

  1. 进入导入设置界面，如图1所示界面。

    图1 环境设置
    • Config or installation directory：表示从自定义配置目录导入MindStudio设置。

      自定义配置目录所在路径：$HOME/.config/Huawei/MindStudioMS-{version}，MindStudio设置包括工程界面的个性化设置（例如背景色等信息）等。

    • Do not import settings：不导入设置，若选择该选项，则创建新的配置文件，默认为该选项。

    根据需要选择相关选项后，单击“OK”，进入下一步。

    • 若已经安装过低版本MindStudio，再次安装高版本时，则图1界面中会出现“Previous version”参数，表示是否从低版本导入MindStudio设置，您可以根据需要进行选择。
    • 若已经安装过相同版本MindStudio，且卸载前一版本时未删除$HOME/.cache/Huawei/MindStudioMS-{version}目录和$HOME/.config/Huawei/MindStudioMS-{version}，则安装下个版本时会从1直接进入2。

  2. 如果没有报错信息且能正常进入欢迎界面，则表示MindStudio安装成功。

    图2 欢迎界面
    表1 参数说明

    参数

    说明

    Projects页签（工程管理）

    New Project

    创建新工程。

    Open

    打开已有工程。

    Get from VCS

    用版本控制工具下载代码仓并打开。

    Customize页签（定制化个性设置）

    Color theme

    设置颜色主题。

    Accessibility

    设置辅助功能，包括设置IDE字体大小和针对红绿色视觉问题调整颜色。

    Keymap

    设置键盘映射，MindStudio会根据您的环境自动建议预定义的键盘映射，请确保它与您正在使用的操作系统匹配，或者手动选择与您习惯使用的另一个IDE或编辑器中的快捷方式匹配的操作系统。

    Import Settings…

    从自定义配置目录导入MindStudio个性化设置。

    All Settings…

    进入设置界面。

    Plugins页签（插件管理）

    Marketplace

    插件市场，可搜索并下载需要的插件。

    Installed

    查看已安装的插件。

    Learn页签（MindStudio实用帮助）

    安装成功后，MindStudio安装服务器$HOME路径会出现如下目录：

    • $HOME/.mindstudio：包括MindStudio属性文件以及隐私声明界面用户所做的操作信息。
    • $HOME/.cache/Huawei/MindStudioMS-{version}：存储MindStudio安装以及启动后的运行日志（log/idea.log）等信息。
    • $HOME/.config/Huawei/MindStudioMS-{version}：存储用户配置数据目录，包括Toolkit安装路径（mindstudio.properties文件）和工程界面的个性化设置（例如背景色等信息）等信息。

  3. 创建工程或打开已有工程。

    • 在“Projects”页签单击“New Project”，新建工程。若新建的工程为昇腾工程，如图3所示，需要配置Ascend-cann-toolkit开发套件包安装路径，单击“Change”，执行4，后续可根据界面指引进行操作。
      图3 新建昇腾算子工程（示例）
    • 在“Projects”页签单击“Open”，打开已有工程，将弹出如图4所示界面，表示MindStudio提供的功能可能会执行此工程中的潜在恶意代码，打开工程前需进行确认。
      图4 信任窗口
      • Trust projects in {此工程所在的目录}：信任此工程所在的目录下的所有工程。
      • Trust Project：信任此工程。
      • Preview in Safe Mode：在安全模式下预览此工程。
      • Don't Open：不打开此工程。
      若打开的已有工程为昇腾工程（以应用工程为例），弹出如下图5提示框，单击“OK”按钮。
      图5 未安装CANN包

      弹出如图6窗口，单击“Change”，进入4。

      图6 修改算子工程属性（示例）

    从“New Project”和“Open”入口新建工程或打开已有工程场景下，界面配置参数说明可参见《MindStudio用户指南》的“工程管理 > 工程创建 > 昇腾工程/非昇腾工程”章节。

    在“Projects”页签单击“Get from VCS”，在弹出的版本管理界面中配置Git版本库URL，单击“Clone”，将下载（默认存放至$HOME/MindstudioProjects）并打开工程。

    当从版本管理中下载并打开的工程为昇腾工程时，打开过程与从“Projects”页签单击“Open”打开已有昇腾工程过程一致。

  4. 弹出图7所示界面。

    如果出现界面显示不全等问题，请参见中文显示乱码和界面显示不全不规整处理。

    图7 选择Ascend-cann-toolkit开发套件包路径

    “CANN-Toolkit Version”中将自动添加安装用户在默认路径中安装的Ascend-cann-toolkit开发套件包版本信息，可直接选择需要的版本，单击“Finish”。

    Ascend-cann-toolkit开发套件包默认路径如下：
    • root用户：“/usr/local/Ascend/ascend-toolkit”
    • 非root用户：“${HOME}/Ascend/ascend-toolkit”

      其中${HOME}为当前用户目录。

    若需要选择已安装的其他版本可单击“CANN-Toolkit Path”选项后面的 [image] ，在弹出界面中选择Ascend-cann-toolkit开发套件包的安装路径，需要选择到版本号（x.x.x）或者latest一级。单击“OK”后，“CANN-Toolkit Version”会显示选择的Ascend-cann-toolkit开发套件包版本信息，单击“Finish”。

  5. 可选：进入MindStudio界面，在菜单栏选择File > Settings... > Plugins，搜索并安装如下插件工具。

    • Grep Console
    • Pylint

    如果在搜索插件工具时，提示网络未连接或者插件不存在，请参见在MindStudio界面安装插件时提示网络未连接或插件不存在处理。

父主题： 安装和配置MindStudio


配置编译环境

如果用户使用算子工程或应用工程开发了相关程序，需要进行工程的编译和运行，则需要配置编译环境。

MDC提供了包含gcc/llvm编译器等相关SDK的MDC_SDK软件包，安装方法参见《编译构建指南》中”搭建编译环境”章节。

父主题： 安装操作（Linux）


更新MindStudio

  • 建议不要更新MindStudio版本。
  • 如误点如下更新提示，请卸载重新安装。

父主题： 安装与卸载


卸载MindStudio

  • 卸载操作（Linux）
  • 卸载操作（Windows）
父主题： 安装与卸载


卸载操作（Linux）

如果用户不再使用MindStudio与Ascend-cann-toolkit开发套件包功能，则可以参见该章节将其卸载。如果用户只卸载Toolkit，则请慎重，可能会造成MindStudio其他功能不可用。如果用户想更换Ascend-cann-toolkit开发套件包版本，则可以参见《MindStudio用户指南》中的“基础操作 > CANN管理”章节更换新版本Ascend-cann-toolkit开发套件包。

手动卸载MindStudio

用MindStudio的安装用户，在linux系统的$HOME目录下删除MindStudio安装包解压后的目录：MindStudio。

删除命令为：

rm -rf MindStudio
卸载MindStudio不会删除如下目录中的数据：
  • $HOME/.cache/Huawei/MindStudioMS-{version}：MindStudio安装以及启动后的运行日志等信息。
  • $HOME/.config/Huawei/MindStudioMS-{version}：用户配置数据。
  • $HOME/.local/share/Huawei/MindStudioMS-{version}：用户插件信息。
  • $HOME/.mindstudio：MindStudio隐私声明界面用户所做的操作信息等配置文件。
  • MindStudioProjects：用户创建的工程。
如果用户想要完全恢复MindStudio初始配置，则请使用MindStudio安装用户进入$HOME目录分别执行如下命令，删除用户配置数据：
rm -rf .cache/Huawei/MindStudioMS-x.x/
rm -rf .config/Huawei/MindStudioMS-x.x/
rm -rf .local/share/Huawei/MindStudioMS-x.x/
rm -rf .mindstudio/
rm -rf {用户创建的工程路径}

手动卸载Ascend-cann-toolkit开发套件包

请使用如下方法卸载Ascend-cann-toolkit开发套件包：

  • 若在安装时使用root用户默认安装路径，请执行如下命令删除ascend-toolkit文件夹：

    sudo rm /usr/local/Ascend/ascend-toolkit/ -r

  • 若在安装时使用非root用户默认安装路径，请执行如下命令删除ascend-toolkit文件夹：

    sudo rm /home/${USER}/Ascend/ascend-toolkit/ -r

  • 若在安装时使用自定义安装路径，请执行如下命令删除ascend-toolkit文件夹：

    sudo rm <自定义路径>/ascend-toolkit/ -r

父主题： 卸载MindStudio


卸载操作（Windows）

如果用户不再使用MindStudio，则可以参见该章节将其卸载。如果用户想更换Ascend-cann-toolkit开发套件包版本，则可以参见《MindStudio用户指南》中的“CANN管理”章节安装新版本Ascend-cann-toolkit开发套件包。

  1. 进入C:\Users\username目录下，删除.mindstudio文件夹。
  2. 卸载MindStudio安装包。

    • 当要卸载的是由MindStudio_{version}_win.zip免安装压缩包得到的MindStudio，删除解压后的文件即可。卸载MindStudio不会删除如下目录中的数据，如有需要，请删除对应路径下的文件：
      • C:\Users\username\AppData\Local\Huawei\MindStudioMS-{version}\：MindStudio的缓存和历史记录。
      • C:\Users\username\AppData\Roaming\Huawei\MindStudioMS-{version}\：MindStudio的设置和插件。
    • 当要卸载的是由MindStudio_{version}_win.exe安装包得到的MindStudio，进入MindStudio安装路径下的bin目录，双击Uninstall.exe，弹出卸载MindStudio界面，选择需要卸载的项，单击Uninstall进行卸载。
      图1 MindStudio卸载界面

      勾选项

      说明

      Delete MindStudio {Version} caches and history

      删除MindStudio的缓存和历史记录。勾选该项，将删除对应C:\Users\username\AppData\Local\Huawei\目录下的MindStudioMS-{version}文件夹。

      Delete MindStudio {Version} settings and plugins

      删除MindStudio的设置和插件。勾选该项，将删除C:\Users\username\AppData\Roaming\Huawei\目录下的MindStudioMS-{version}文件夹。

    如果用户使用了算子样例功能，则卸载MindStudio不会删除从CANN包中同步的开发样例工程，即{MindStudio安装路径}\plugins\ascend-foundation\samples\operator_demo_projects\下的内容，如不需要该部分的内容，请手动删除。

父主题： 卸载MindStudio


常用操作

  • 查询MindStudio版本
  • 配置pip源
父主题： 安装与卸载


查询MindStudio版本

安装完成后您可以通过如下方式查询所安装MindStudio版本是否正确。

  • MindStudio安装完成后，在欢迎界面中，单击左下角的设置图标，再单击“About”，查看所安装的版本信息，如图1所示。
    图1 查询版本号
  • 进入MindStudio工程页面，单击菜单栏的“Help > About”弹出版本信息，查看版本信息是否正确。
父主题： 常用操作


配置pip源

配置pip源，配置方法如下：

  1. 使用软件包的安装用户，执行如下命令：

    cd ~/.pip

    如果提示目录不存在，则执行如下命令创建：

    mkdir ~/.pip
cd ~/.pip

  2. 编辑pip.conf文件。

    使用vi pip.conf命令打开pip.conf文件，写入如下内容：

    [global]
#以华为源为例，请根据实际情况进行替换。
index-url = https://mirrors.huaweicloud.com/repository/pypi/simple
trusted-host = mirrors.huaweicloud.com
timeout = 120

  3. 执行:wq!命令保存文件。
父主题： 常用操作


FAQ

  • 获取帮助和提出建议
  • pip3 install报错“subprocess.CalledProcessError：Command '('lsb_release', '-a')' return non-zero exit status 1”
  • 启动MindStudio时无法显示图形化界面
  • 中文显示乱码和界面显示不全不规整
  • 在MindStudio界面安装插件时提示网络未连接或插件不存在
  • 安装依赖时提示未安装或找不到Python.h
  • 调用Python脚本时提示“ModuleNotFoundError: No module named 'xxx'”
  • 启动MindStudio时报glibc版本太低
  • 启动MindStudio时报“java.lang.UnsatisfiedLinkError: /home/username/MindStudio/jbr/lib/libawt_xawt.so”
  • 设置超大内存后无法启动MindStudio
  • 启动MindStudio时提示“WARNING: Install the haveged service by referring to the installation guide.”
父主题： 安装与卸载


获取帮助和提出建议

在使用MindStudio的过程中，如果想查看更多相关信息，请直接在MindStudio主界面的菜单栏中单击“Help > MindStudio Help”，该操作会连接网络并跳转至昇腾社区MindStudio查看。

如有任何问题想要咨询或者提出改进建议，请直接在MindStudio主界面的菜单栏中单击“Help > Ascend Developer Zone”，该操作会连接网络并跳转至昇腾论坛进行反馈。

使用MindStudio Help和Ascend Developer Zone功能时需要使用浏览器登录网页，如果未安装浏览器，请用户自行安装。

图1 更多信息和帮助
父主题： FAQ


pip3 install报错“subprocess.CalledProcessError：Command '('lsb_release', '-a')' return non-zero exit status 1”

现象描述

安装依赖时，使用pip3 install xxx命令安装相关软件时报错“subprocess.CalledProcessError：Command '('lsb_release', '-a')' return non-zero exit status 1”，提示信息如下：

原因分析

用户自行编译安装的Python3.7.5在执行subprocess模块时，在执行lsb_release -a 时提示找不到lsb_release.py模块，用户自行编译安装的Python3.7.5的lib路径是“/usr/local/python3.7.5/lib/python3.7/”，该路径下没有lsb_release.py模块，因此会报错。

解决措施

  1. 查找缺失文件'lsb_release.py'，使用如下命令：

    find / -name lsb_release
    执行上述命令后，得到如下路径，以下仅为示例，用户实际可能有差别：
    /usr/bin/lsb_release

  2. 将步骤1找到的“/usr/bin/lsb_release”文件备份：

    mv /usr/bin/lsb_release /usr/bin/lsb_release.bak

  3. 然后执行pip3 install xxx查看是否解决。
父主题： FAQ


启动MindStudio时无法显示图形化界面

现象描述

启动MindStudio时，出现“Failed to initialize graphics environment”、“Unable to detect graphics environment ”或“Can't connect to X11 window server using 'localhost:xxx' as the value of the DISPLAY variable”报错信息，如图1、图2或图3所示。

图1 无法显示图形化界面1
图2 无法显示图形化界面2
图3 无法显示图形化界面3

原因分析

  • 使用某用户登录了MobaXterm，所以图形工具已经被该用户所在的用户组占用，切换用户后，无法使用图形工具。
  • 登录用户和启动MindStudio用户不一致。
  • 未安装X11-forwarding依赖。
  • SSH未开启X11-forwarding。
  • $HOME/.Xauthority为文件夹而非文件。

解决措施

  • 使用某用户登录了MobaXterm，所以图形工具已经被该用户所在的用户组占用，切换用户后，无法使用图形工具，请参见以下方法解决：
    1. 把切换后的用户加入先前用户的用户组。
    2. 使用MobaXterm登录想要启动MindStudio的用户。
    3. 以该用户启动MindStudio。
  • 登录的用户和启动MindStudio用户不一致，请参见以下方法解决：

    使用登录系统的用户重新启动MindStudio用户。

  • 未安装X11相关依赖，请根据系统类型安装依赖。
    • Red Hat和OpenEuler系列的操作系统
      lyum install -y xorg-x11-xauth xorg-x11-apps xterm libXext libXtst libXrender
    • Ubuntu系列的操作系统
      apt-get install -y xorg x11-apps xterm libxtst-dev libxext-dev libxrender-dev
  • 未开启X11-forwarding，请修改sshd_config，设置X11Forwarding yes，重启SSH服务。
    1. 使用 vi 编辑器将/etc/ssh/sshd_config文件中的“X11Forwarding”参数设置为“yes”。针对CentOS 7.6/Euler2.8系统，“X11UseLocalhost”参数设置为“no”。
      vi /etc/ssh/sshd_config
    2. 验证配置是否生效。
      cat /etc/ssh/sshd_config |grep -i X11Forwarding

      若输出“X11Forwarding yes”，则表示X11Forwarding项配置生效。

      cat /etc/ssh/sshd_config |grep -i X11UseLocalhost

      若输出“X11UseLocalhost no”，则表示X11UseLocalhost项配置生效。

    3. 重启SSH服务。
      • Red Hat和OpenEuler系列的操作系统
        service sshd restart
      • Ubuntu系列的操作系统
        service ssh restart
  • $HOME/.Xauthority为文件夹，请删除该文件夹。
父主题： FAQ


中文显示乱码和界面显示不全不规整

现象描述

  • 例如在新建APP应用工程时，中文显示乱码，例如README_CN.md文件，如图1所示。
    图1 中文显示乱码
  • 界面显示不全不规整，例如标题显示不全，如图2所示。
    图2 标题显示不全

解决措施

请自行安装微软雅黑字体(msyh.ttc)。

父主题： FAQ


在MindStudio界面安装插件时提示网络未连接或插件不存在

现象描述

启动MindStudio后，在菜单栏选择“File > Settings... > Plugins”搜索并安装插件时，界面提示网络未连接或插件不存在，如图1和图2所示。

图1 网络未连接
图2 插件不存在

解决措施

  1. 启动MindStudio后，在菜单栏选择“File > Settings... > Appearance & Behavior > System Settings > HTTP Proxy”，或者在搜索栏中输入“Proxy”，进入Proxy配置界面，如图3所示。

    图3 配置Proxy

  2. 选择“Manual proxy configuration > HTTP”，填写以下参数信息。

    • Host name：代理服务器IP地址。
    • Port number：代理服务器IP地址的端口号。

  3. 勾选“Proxy authentication”，填写以下参数信息。

    • Login：用户在内部网络中的用户名。
    • Password：用户在内部网络中用户名对应的密码。

  4. 可选择是否勾选“Remember”，单击“Check connection”，弹出如图4所示对话框。

    图4 检查是否连接成功

  5. 在对话框中输入URL检查是否连接成功，例如：www.baidu.com，单击“OK”。

    如果弹出提示信息为Connection successful，则表示Proxy设置成功。

  6. 在菜单栏选择“File > Settings... > Plugins”搜索并安装插件，如图5所示。

    图5 搜索插件

父主题： FAQ


安装依赖时提示未安装或找不到Python.h

现象描述

安装依赖时提示“fatal error：Python.h：No such file or directory”或者“Could not find <Python.h>”等信息，如图1和图2所示。

图1 提示信息1（示例）
图2 提示信息2（示例）

原因分析

环境缺少Python3的开发包。

解决措施

根据实际使用的系统，执行以下命令安装依赖：

  • apt-get install python3-dev
  • lyum install python3-devel
  • dnf install python3-devel
父主题： FAQ


调用Python脚本时提示“ModuleNotFoundError: No module named 'xxx'”

现象描述

调用Python脚本时提示缺少Python依赖信息如“ModuleNotFoundError: No module named 'xxx'”。

原因分析

环境缺少提示的依赖。

解决措施

根据实际使用的系统，执行以下命令安装对应的Python依赖：

pip3 install xxx
父主题： FAQ


启动MindStudio时报glibc版本太低

现象描述

例如在CentOS7.6系统启动MindStudio时，报错“Error : failed /home/MindStudio/jbr/lib/server/libjvm.so, because /lib64/libm.so.6:version 'GLIBC_2.27' not found (required by /home/MindStudio/jbr/lib/server/libjvm.so)”，提示信息如下。

原因分析

系统的glibc版本低于2.27，jbr无法正常运行。

解决措施

当用户使用非root用户安装时，可能需要用到提权命令，请用户自行获取所需的sudo权限，使用完成后请取消涉及高危命令的权限，否则有sudo提权风险。

  1. 删除安装目录下的jbr文件夹。
  2. 安装JDK之前，先用如下命令检查系统是否已经存在Java：

    which java
    若返回相关路径，则说明已经存在，执行java -version查看java版本是否为11，否则执行如下命令安装JDK。
    sudo lyum install -y java-11-openjdk

  3. 如果存在两个及以上版本的Java，执行以下命令切换版本。

    sudo alternatives --config java

    然后就选择版本号为11所在选项即可。执行java -version查看java版本为11，说明切换成功。

安装完成后，跟JBR相关的功能可能受限制。

父主题： FAQ


启动MindStudio时报“java.lang.UnsatisfiedLinkError: /home/username/MindStudio/jbr/lib/libawt_xawt.so”

现象描述

启动MindStudio时，报错“java.lang.UnsatisfiedLinkError： /home/username/MindStudio/jbr/lib/libawt_xawt.so”，提示信息如下。

解决措施

可通过安装libXext、libXtst、libXrender和fontconfig库解决此问题。
lyum install -y libXext libXtst libXrender fontconfig
父主题： FAQ


设置超大内存后无法启动MindStudio

问题描述

  • 在Windows启动MindStudio失败。
  • 在Linux启动MindStudio时，报错“Cound not reserve enough space for xxx object heap”，提示信息如下。

问题原因

用户在菜单栏选择“Help > Change Memory Settings”，弹出的Memory Settings窗口（以图1为例）中设置的运行内存大小超过启动运行主机的内存大小。如主机内存为512MB，而用户设置内存为2014MB。
图1 Memory Settings（Linux）

设置的运行内存大小应在256~2147483647范围内。

解决方法

访问用户目录下的mindstudio64.exe.vmoptions文件，修改-Xmx参数的值，设置一个合理的大小，该值至少小于主机内存。

  • Windows端：C:\Users\username\AppData\Roaming\Huawei\MindStudioMS-{version}\mindstudio64.vmoptions
  • Linux端： ~/.config/Huawei/MindStudioMS-{version}/mindstudio64.vmoptions

父主题： FAQ


启动MindStudio时提示“WARNING: Install the haveged service by referring to the installation guide.”

现象现象

启动过程中提示“WARNING: Install the haveged service by referring to the installation guide.”，未安装haveged服务，如图1所示。

图1 提示信息

原因分析

系统熵值不足，ssh-manager插件在进行加解密密码的时候会阻塞。

解决措施

可通过以下步骤安装haveged服务进行补码解决。

当用户使用非root用户安装时，可能需要用到提权命令，请用户自行获取所需的sudo权限，使用完成后请取消涉及高危命令的权限，否则有sudo提权风险。

  1. 安装haveged服务。

    • 对于CentOS、OpenEuler、EulerOS 、Kylin系统，执行以下命令进行安装。
      sudo lyum install haveged
    • 对于Ubuntu系统，执行以下命令进行安装。
      sudo apt-get install haveged

  2. 检查服务是否已经启动。

    systemctl status haveged.service
    • 回显包含“Active: active (running)”信息，表示服务已启动。
    • 回显包含“Active: inactive (dead)”信息，表示服务未启动，执行以下命令启动服务。
      systemctl start haveged.service

  3. 设置该服务开机自启动。

    systemctl enable haveged.service

父主题： FAQ


操作指南

本文档提供采用MindStudio进行基础开发、模型转换、应用开发以及算子开发等操作指导，并提供了网络优化、精度对比和性能分析等指导信息。

  • 工程管理
  • 模型转换和调优
  • 应用开发
  • 算子开发
  • 精度比对
  • 基础操作
  • 附录
父主题： MindStudio 使用指南


工程管理

  • 工程创建
  • 工程文件管理
  • 工程调试与执行
  • 工程关闭
父主题： 操作指南


工程创建

  • 昇腾工程
  • 非昇腾工程
  • 工程转换
父主题： 工程管理


昇腾工程

不建议用户将较大的数据文件置于工程目录下，过大的工程目录文件可能会导致工程在打开以及编写过程中，出现迟缓、卡顿等情况。

MindStudio支持创建两种类型的昇腾工程，详细信息请参见以下对应章节。

  • 应用开发工程
  • 算子开发工程
父主题： 工程创建


非昇腾工程

  • 简介
  • 创建C/C++工程
  • 创建Java工程
  • 创建Python工程
  • 创建Empty工程
父主题： 工程创建


简介

不建议用户将较大的数据文件置于工程目录下，过大的工程目录文件可能会导致工程在打开以及编写过程中，出现迟缓、卡顿等情况。

MindStudio支持创建和导入纯语言类工程、Empty工程。

父主题： 非昇腾工程


创建C/C++工程

MindStudio支持创建“C Executable”、“C Library”、“C++ Executable”和“C++ Library”四种类型的C/C++工程，创建方式相似（以下步骤以创建“C++ Executable”为例）。

  • 仅支持创建CMake编译框架的C/C++工程。
  • C标准支持范围为C90、C99、C11，C++标准支持范围为C++98、C++11、C++14、C++17、C++20。
  • Library工程支持static和shared两种类型。
  • MindStudio支持对.c、.cpp、.cc、.h源文件关键字着色、跳转功能。

新建C/C++工程方式

  1. 进入工程创建页面。

    • MindStudio欢迎界面：左侧菜单选择“Project”，右侧单击“New Project”。
      图1 工程创建界面
    • MindStudio工程界面：在顶部菜单栏中选择“File > New > Project...”。

  2. 在New Project窗口中，左侧菜单选择“C++ Executable”，在右侧窗口中选择“Language standard”（C++标准支持范围，默认“C++ 98”。），单击“Next”进入下一步。

    图2 选择“C++ Executable”

  3. 进入工程配置栏，配置工程相关参数如表1所示。

    表1 工程参数说明

    参数

    说明

    Project name

    工程名称，自行配置。

    名称开头和结尾必须是数字或字母。只能包含字母、数字、中划线和下划线，且长度不超过64个字符。

    Project location

    工程默认保存路径，用户可自定义。（对于首次使用MindStudio的用户，该项默认为“$HOME/MindstudioProjects”。）

    More Settings

    “Module name”：模块名，默认与“Project name”一致。

    “Content root”：根目录下路径。

    “Module file location”：模块文件路径。
    单击“Project format”右侧选框，出现下拉菜单。
    • .idea（directory-based）：创建项目的时候创建一个.idea项来保存项目的信息，默认选项。
    • .ipr（file-based）：项目配置文件来保存项目的配置信息。

  4. 单击“Create”，完成工程创建。

    若工作窗口已打开其他工程，会出现确认提示。

    • 选择“This Window”，则直接在当前工作窗口打开新创建的工程。
    • 选择“New Window”，则新建一个工作窗口打开新创建的工程。

  5. 成功创建工程后，工程目录以树状呈现。

导入C/C++工程方式

  1. 导入工程文件。

    • MindStudio欢迎界面：单击“Open”，选择需要导入的工程，单击“OK”确认导入。
    • MindStudio工程界面：在顶部菜单栏中选择“File > Open...”或单击工具栏中的 [image] ，选择现有工程打开。

    如该工程存在代码风险，在打开时会弹出信任窗口。

    • 如该工程源码可被信任且安全，请单击“Trust Project”。（可通过勾选“Trust project in <工作区目录>”复选框信任该目录下的所有工程。）
    • 如该工程不被信任，仅用于查看其中源码，请单击“Preview in Safe Mode”进入安全模式预览。
    • 如放弃打开该工程，请单击“Don't Open”取消工程导入操作。

  2. 若工作窗口已打开其他工程，会出现确认提示。

    • 选择“This Window”，则直接在当前工作窗口打开工程。
    • 选择“New Window”，则新建一个工作窗口并打开工程。

  3. 成功导入工程后，工程目录以树状呈现。
父主题： 非昇腾工程


创建Java工程

新建Java工程方式

  1. 进入工程创建页面。

    • MindStudio欢迎界面：左侧菜单选择“Project”，右侧单击“New Project”。
      图1 工程创建界面
    • MindStudio工程界面：在顶部菜单栏中选择“File > New > Project...”。

  2. 在“New Project”窗口中，左侧菜单选择“New Project”，配置工程相关参数如表1 参数说明所示。

    表1 参数说明

    参数

    说明

    Name

    工程名称，用户可自行配置。

    Location

    工程默认保存路径，用户可自定义。（对于首次使用MindStudio的用户，该项默认为“$HOME/MindstudioProjects”。）

    Create Git repository：是否创建Git仓库，勾选后则创建。

    Language

    可选择“Java”、“Python”或点击右侧“+”选择更多。创建Java工程时选择“Java”。

    Build system

    选择构建系统，可选择“IntelliJ”或“Gradle”。

    若选择“Gradle”，会新增“Gradle DSL”选项，当前可选择“Groovy”或“Kotlin”。

    JDK

    选择JDK。点击右侧下拉框可选择：

    • Download JDK：下载JDK。
    • Add JDK：从本地目录添加JDK。

    Add sample code

    是否添加样例代码。勾选后则会在src目录下创建样例代码。

    Advanced Settings

    “Module name”：模块名，默认与“Name”一致。

    “Content root”：根目录下路径。

    “Module file location”：模块文件路径。

  3. 单击“Create”，完成工程创建。

    若工作窗口已打开其他工程，会出现确认提示。

    • 选择“This Window”，则直接在当前工作窗口打开新创建的工程。
    • 选择“New Window”，则新建一个工作窗口打开新创建的工程。

  4. 成功创建工程后，工程目录以树状呈现，请以实际创建结果为准。

    用户也可以通过顶部菜单栏进入“File > Project Structure…”，在弹出的左侧功能栏中选中“SDKs”并在右侧功能界面单击“+”，选择“Download JDK”，自行下载Java工程的SDK。

    （JDK默认访问地址https://download-cdn.jetbrains.com/jdk/feed/v1/jdks.json.xz）

导入Java工程方式

  1. 导入工程文件。

    • MindStudio欢迎界面：单击“Open”，选择需要导入的工程，单击“OK”确认导入。
    • MindStudio工程界面：在顶部菜单栏中选择“File > Open...”或单击工具栏中的 [image] ，选择现有工程打开。

    如该工程存在代码风险，在打开时会弹出信任窗口。

    • 如该工程源码可被信任且安全，请单击“Trust Project”。（可通过勾选“Trust project in <工作区目录>”复选框信任该目录下的所有工程。）
    • 如该工程不被信任，仅用于查看其中源码，请单击“Preview in Safe Mode”进入安全模式预览。
    • 如放弃打开该工程，请单击“Don't Open”取消工程导入操作。

  2. 若工作窗口已打开其他工程，会出现确认提示。

    • 选择“This Window”，则直接在当前工作窗口打开工程。
    • 选择“New Window”，则新建一个工作窗口并打开工程。

  3. 成功导入工程后，工程目录以树状呈现。
父主题： 非昇腾工程


创建Python工程

MindStudio支持创建Python工程，进行Python工程的开发调测，并支持远端进行调测的能力。

新建Python工程方式

  1. 进入工程创建页面。

    • MindStudio欢迎界面：左侧菜单选择“Project”，右侧单击“New Project”。
      图1 工程创建界面
    • MindStudio工程界面：在顶部菜单栏中选择“File > New > Project...”。

  2. 在“New Project”窗口中，左侧菜单选择“New Project”，配置工程相关参数如表1所示。

    表1 工程参数说明

    参数

    说明

    Name

    工程名称，用户可自行配置。

    Location

    工程默认保存路径，用户可自定义。（对于首次使用MindStudio的用户，该项默认为“$HOME/MindstudioProjects”。）

    Create Git repository：是否创建Git仓库，勾选后则创建。

    Language

    可选择“Java”、“Python”或点击右侧“+”选择更多。创建Python工程时选择“Python”。

    Environment

    选择Python环境，可选择“New”或“Existing”。

    选择“New”后可新增环境类型，选择“Existing”后可选择已经存在的解析器。

    Environment type

    选择环境类型。当前可选择“Virtualenv”、“Conda”、“Pipenv”或“Poetry”。

    Location

    “Environment type”选择“Virtualenv”或“Conda”会出现该参数。

    新的“Virtualenv”或“Conda”环境的位置。用户可以点击右侧文件夹图标选择所需的位置。

    Base interpreter

    “Environment type”选择“Virtualenv”、“Pipenv”或“Poetry”会出现该参数。

    用户可以从下拉列表中选择基本解析器，或者点击右侧“...”选择所需的Python可执行文件。

    Inherit global site-packages

    “Environment type”选择“Virtualenv”会出现该参数。

    勾选该选项后，计算机上安装在全局Python中的所有软件包将添加到要创建的虚拟环境中。

    Make available to all projects

    “Environment type”选择“Virtualenv”或“Conda”会出现该参数。

    勾选该选项后，MindStudio创建Python解析器时会重用此环境。

    Python version

    “Environment type”选择“Conda”会出现该参数。

    点击下拉框选择Python版本。

    Conda executable

    “Environment type”选择“Conda”会出现该参数。

    Conda可执行文件的位置。系统将自动检测Conda可执行文件的路径，用户可单击右侧文件夹图标选择Conda可执行文件路径。

    Pipenv executable

    “Environment type”选择“Pipenv”会出现该参数。

    Pipenv可执行文件的位置。系统将自动检测Pipenv可执行文件的路径，用户可单击右侧文件夹图标选择Pipenv可执行文件路径。

    Poetry executable

    “Environment type”选择“Poetry”会出现该参数。

    Poetry可执行文件的位置。系统将自动检测Poetry可执行文件的路径，用户可单击右侧文件夹图标选择Poetry可执行文件路径。

  3. 单击“Create”，完成工程创建。

    若工作窗口已打开其他工程，会出现确认提示。

    • 选择“This Window”，则直接在当前工作窗口打开新创建的工程。
    • 选择“New Window”，则新建一个工作窗口打开新创建的工程。

  4. 成功创建工程后，工程目录以树状呈现。

导入Python工程方式

  1. 导入工程文件。

    • MindStudio欢迎界面：单击“Open”，选择需要导入的工程，单击“OK”确认导入。
    • MindStudio工程界面：在顶部菜单栏中选择“File > Open...”或单击工具栏中的 [image] ，选择现有工程打开。

    如该工程存在代码风险，在打开时会弹出信任窗口。

    • 如该工程源码可被信任且安全，请单击“Trust Project”。（可通过勾选“Trust project in <工作区目录>”复选框信任该目录下的所有工程。）
    • 如该工程不被信任，仅用于查看其中源码，请单击“Preview in Safe Mode”进入安全模式预览。
    • 如放弃打开该工程，请单击“Don't Open”取消工程导入操作。

  2. 若工作窗口已打开其他工程，会出现确认提示。

    • 选择“This Window”，则直接在当前工作窗口打开工程。
    • 选择“New Window”，则新建一个工作窗口并打开工程。

  3. 成功导入工程后，工程目录以树状呈现。
父主题： 非昇腾工程


创建Empty工程

  1. 进入工程创建页面。

    • MindStudio欢迎界面：左侧菜单选择“Project”，右侧单击“New Project”。
      图1 工程创建界面
    • MindStudio工程界面：在顶部菜单栏中选择“File > New > Project...”。

  2. 在“New Project”窗口中，左侧菜单选择“Empty Project”。
  3. 单击“Next”，进入配置工程相关参数如表1所示。

    表1 工程参数说明

    参数

    说明

    Name

    工程名称，自行配置。

    Location

    工程默认保存路径，用户可自定义。（对于首次使用MindStudio的用户，该项默认为“$HOME/MindstudioProjects”。）

    Create Git repository

    是否创建Git仓库，勾选后则创建。

  4. 单击“Create”，完成工程创建。

    若工作窗口已打开其他工程，会出现确认提示。

    • 选择“This Window”，则直接在当前工作窗口打开新创建的工程。
    • 选择“New Window”，则新建一个工作窗口打开新创建的工程。

  5. 成功创建工程后，可通过顶部菜单栏找到“File > Project Structure... ”打开如图2所示设置窗口，通过左侧功能栏中的“Modules”功能，手动创建或导入Module模块。

    图2 Project Structure设置窗口

父主题： 非昇腾工程


工程转换

MindStudio支持非昇腾工程转换为昇腾工程的功能。

操作步骤

  1. 导入工程文件。

    • MindStudio欢迎界面：单击“Open”，选择需要导入的工程，单击“OK”确认导入。
    • MindStudio工程界面：在顶部菜单栏中选择“File > Open...”或单击工具栏中的 [image] ，选择现有工程打开。

    如该工程存在代码风险，在打开时会弹出信任窗口。

    • 如该工程源码可被信任且安全，请单击“Trust Project”。（可通过勾选“Trust project in <工作区目录>”复选框信任该目录下的所有工程。）
    • 如该工程不被信任，仅用于查看其中源码，请单击“Preview in Safe Mode”进入安全模式预览。
    • 如放弃打开该工程，请单击“Don't Open”取消工程导入操作。

  2. 若工作窗口已打开其他工程，会出现确认提示。

    • 选择“This Window”，则直接在当前工作窗口打开新创建的工程。
    • 选择“New Window”，则新建一个工作窗口打开新创建的工程。

  3. 单击顶部菜单栏中的“Ascend > Convert To Ascend Project”，如图1所示。

    图1 工程转换

  4. 弹出如图2窗口。

    图2 转换昇腾工程配置

    对窗口参数介绍如下，用户请根据实际场景选择：

    • Project Type：可选择四种工程类型，分别为“Ascend Operator”、“Ascend Training”、“Ascend App”和“Ascend Advisor”。
    • Project Desc：项目描述。

  5. 单击“OK”，工程目录以树状呈现。此时成功创建带有.project文件的昇腾工程，请以实际创建结果为准。
父主题： 工程创建


工程文件管理

  • 添加工程文件
  • 删除工程文件
父主题： 工程管理


添加工程文件

在工程界面下，选中相应工程，单击鼠标右键选择“New”（或者在顶部菜单栏中选择“File > New”），在弹出的子菜单中选择需要创建的文件类型或选择“File”，如图1所示，在打开的对话框中输入文件名（不需要输入文件类型对应的后缀名）。

图1 输入新建文件名

在输入文件名后单击“回车”即可完成创建。

父主题： 工程文件管理


删除工程文件

在左侧工程目录中选中文件，单击鼠标右键，在弹出的菜单中单击“Delete...”，提示删除选项，如图1所示，在删除选项窗口中可选择以下方式进行删除。

  • Safe delete（使用安全删除方案）：将通过搜索使用情况执行安全删除，确保该文件在删除时没有被引用，如搜索出待确认的情况，MindStudio会展示整体搜索结果以及具体使用情况，用户可根据结果分别处理。
  • （可选）Search in comments and strings（搜索注释和字符串）：追加搜索注释与字符串的引用情况。
图1 删除文件
父主题： 工程文件管理


工程调试与执行

  • 调试C/C++代码
  • 调试Python代码
父主题： 工程管理


调试C/C++代码

本章节提供的代码调试功能仅用于Development版本。

  • 调试前准备
  • 编译与运行
  • 断点管理
  • 调试执行
父主题： 工程调试与执行


调试前准备

支持在Linux环境与Windows环境进行应用工程调试，并具备远程调试的功能。

GDB安装

以下步骤仅供参考，具体安装步骤请参见GDB官方文档。

若环境中未安装GDB，则需要安装GDB，可通过包管理（如apt-get install gdb、lyum install gdb）进行安装。

如无法使用包管理安装GDB，则需通过源码编译方式安装GDB，操作步骤如下：

  1. 获取GDB源码（获取链接），如获取“gdb-8.1.1.tar.gz”。
  2. 解压GDB源码压缩包，以“gdb-8.1.1.tar.gz”为例。

    tar -zxvf gdb-8.1.1.tar.gz

  3. 进入到GDB目录文件，配置编译参数：

    cd gdb-8.1.1
./configure --host=aarch64-linux-gnu --prefix=/home/install/gdb
    • “--host”为可选参数，在需要交叉编译安装GDB时使用。“aarch64-linux-gnu”为用户获取的交叉编译器示例。
    • “/home/install/gdb”为指定安装目录示例，请用户根据实际情况自行替换。

  4. 编译。

    make -j8
make install

  5. 配置环境变量。

    export PATH=/home/install/gdb/bin:$PATH

  6. 查看GDB是否安装成功。

    gdb --version

    如出现类似如下回显，表明安装成功。

    GNU gdb (GDB) 8.1.1
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-pc-linux-gnu".
Type "show configuration" for configuration details.

父主题： 调试C/C++代码


编译与运行

  1. 在菜单栏选择“Build > Edit Configurations...”进入编译配置界面，单击“+”按钮，添加配置选项如图1所示。（列表中带有“(default)”标记的配置项为当前默认配置项，如需进行变更，可选中所需配置项，并单击 [image] 进行切换。）

    图1 Build Configurations配置
    表1 Edit Configurations配置说明

    参数及图标

    说明

    Name

    配置名称自定义，默认：“Debug”。

    Build type

    配置类型，可选：“Debug”或“Release”。

    Toolchain

    工具链配置器，配置详情请参见Toolchains，支持本地和远程编译功能。

    CMake options

    CMake选项，默认：“-DCMAKE_BUILD_TYPE=Debug -DCMAKE_SKIP_RPATH=TRUE”。

    Build directory

    编译目录相对路径，该路径是相对于工程目录的路径。

    Build options

    编译加速选项。

    Environment variables

    环境变量配置：支持编译前配置环境变量。

    Environment from path

    输入路径或单击右侧 [image] ，选择环境变量配置文件。配置文件以单行<变量名>=<变量值>方式填写，保存为文件，如：

    APATH=/usr/local/xxx
X_PATH=/xxx/xxx

  2. 请用户根据实际使用场景，在MindStudio工程界面，选择以下编译方式，如需切换默认配置项请参见1。

    • 依次选择“Build > Clean CMake Project”，清理编译。
    • 依次选择“Build > Rebuild CMake Project”，使用默认配置进行全量编译。
    • 依次选择“Build > Build CMake Project”或单击工具栏中的 [image] ，使用默认配置进行增量编译。

  3. 在顶部菜单栏中选择“Run > Edit Configurations...”或通过单击工具栏中的运行配置框进入运行配置，单击左上角“+”，新建“CMake Application”运行配置，如图3所示，运行配置项说明请参见表2。

    单击“OK”按钮，结束编译与运行配置准备。

    图2 运行配置框
    图3 运行Edit Configurations配置
    表2 运行配置项

    配置项

    说明

    Executable

    选择编译用可执行文件的路径，选择到文件一级。

    Program arguments

    运行参数。

    Working directory

    工作目录。（如工程中配置了相对路径，则需在该选项中选择相对的工作目录。默认为可执行文件所在目录。）

    Enviroment variables

    此处直接输入动态链接库路径。

    或者单击 [image] ，在弹出的界面内单击 [image] ，填写路径。

    Environment from path

    输入路径或单击右侧 [image] ，选择环境变量配置文件。配置文件以单行<变量名>=<变量值>方式填写，保存为文件，如：

    APATH=/usr/local/xxx
X_PATH=/xxx/xxx

  4. 在顶部菜单栏中选择“Run > Run '工程名'”，使用已保存的配置运行工程。

    如未保存运行配置，在当前操作后，会弹出运行配置界面，运行配置填写请参见3。填写完成，可单击“Apply”应用配置后，单击“Run”直接运行。

父主题： 调试C/C++代码


断点管理

断点是指在某一行设置一个断点，当程序运行到断点处时暂停执行，然后用户可通过预先完成的设置，查看变量、内存，检查程序逻辑是否正确。您可以设置各种方式的断点，例如让程序暂停在函数执行的入口处，或者让程序暂停在文件的某一行等。

添加断点

打开想要调试的代码，选定要设置断点的代码行，在行号的区域后面单击鼠标左键，即可以添加断点，如图1所示，断点添加成功后，左侧代码行号处会显示 [image] 图标。

图1 添加断点

删除断点

在设置断点的地方，单击左侧的 [image] 即可取消断点。

停用断点

若用户设置了多个断点，执行调试时想使用部分断点又不删除其他断点，则可以通过以下操作暂时停用断点。

右击已经设置断点的代码行号处的 [image] ，在弹出界面中不勾选“Enabled”，可以看到原有 [image] 断点标识变成 [image] ，则再执行调试功能时，该断点不生效。
图2 断点停用

启用断点

若已经有部分断点设置了停用，执行新的调试功能时想重新启用断点，则可以通过以下操作实现。

右击已经停用断点处的 [image] ，在弹出界面中勾选“Enabled”，可以看到原有 [image] 断点标识变成 [image] ，则后续执行调试功能时，该断点生效。
图3 断点启用

MindStudio重启以及工程重启后，不会影响当前工程中已经设置的断点状态和数量。

查看断点

在顶部菜单栏中找到“Run > View Breakpoints”或单击断点界面的“More(Ctrl+Shift+F8)”，弹出图4所示断点查看界面。通过该功能，用户可以查看当前设置的所有断点。

图4 断点查看界面

左侧序号1断点列表展示了当前代码中所设置的所有断点，序号2对应相应断点的停用（Disabled）或启用（Enabled）功能，序号3为代码预览区域。

功能使用方法参考如下：

  • 单击左侧断点列表中，断点左侧的复选框，勾选表示该断点启用，相应序号2处“Enabled”功能被勾选，同时在代码预览区域中，对应代码行左侧行号处显示 [image] 图标；取消勾选表示该断点停用，相应序号2处“Enable”功能被取消勾选，同时在代码预览区域中，对应代码行左侧行号处显示 [image] 图标。
  • 选中断点列表处的断点，单击上方的 [image] 可以删除断点，同时代码预览区域，相应代码行号处的断点图标随之删除。
  • 在代码预览区域，代码行号处单击，则该行被标记为断点，同时断点列表中会自动增加该断点信息。
父主题： 调试C/C++代码


调试执行

启动调试

  1. 设置完断点、运行配置后，单击工具栏中debug图标 [image] 即可启动调试功能。
  2. 调试功能启用后，会停在第一个（已启用的）断点处，会自动在代码变量所在行右侧展示该变量的取值信息，调试界面如图1的绿色参数信息所示。工程右下方出现Debugger视图，其中：
    • 左侧Frames区域是程序的方法调用栈，在该区域中显示了程序执行到断点处所调用过的所用方法，越下面的方法被调用的越早。红框中的信息表示当前调试程序停留的代码行，例如main.cpp程序的第19行。
    • Variables栏展示变量信息以及线程信息。
      图1 调试工程界面

      调试窗口图标解释如表1所示。

      表1 调试窗口图标说明

      图标

      名字

      作用

      Rerun(Ctrl+F5)

      重新执行调试功能。

      Resume program(F9)

      继续运行程序，到下一个断点处。

      运行一个断点到下一个断点之间需要执行的代码，如果后面代码没有断点，再次单击该按钮将会执行完程序。

      Stop(Ctrl+F2)

      终止调试功能。

      View Breakpoints(Ctrl+Shift+F8)

      查看所有断点。

      查看曾经设置过的断点并设置断点的一些属性，弹出界面以及功能详细说明请参见查看断点。

      Mute Breakpoints

      暂停使用所有断点。

      请参见Mute Breakpoints功能。

      Step Over(F8)

      进入下一行代码。

      单击该按钮，程序向下执行一行，如果当前行有函数调用，该函数将被执行完毕返回，然后到下一行，同时会显示Frames信息和变量信息，详细操作请参见Step Over功能。

      Step Into(F7)

      进入函数。

      程序向下执行一行。如果该行有自定义函数，则运行进入自定义函数（不会进入官方库的函数），同时会显示Frames信息和变量信息，详细操作请参见Step Into功能。

      Force Step Into(Alt+Shift+F7)

      强制进入函数。

      单击按钮，调试时能进入任何函数，包括自定义函数以及官方库函数，

      Step Out(Shift+F8)

      跳出函数。

      如果调试时进入了某个函数，若检查该函数没有问题，则可以使用“Step Out”按钮跳出该函数，返回到原始位置。详细操作请参见Step Out功能。

      Run to cursor(Alt+F9)

      运行到光标处。

      可以在没有设置断点的情况下，让程序运行到光标所在行时暂停，同时会显示Frames信息和变量信息，详细操作请参见Run to cursor功能。

下面以具体示例介绍各个调试功能。

将变量添加到Watches区域

选中要查看的变量，右击选择“Add to Watches”，可以看到变量添加到下方“Watches”区域中，如图2所示。
图2 将变量添加到Watches区域

您也可以单击左侧工具栏的功能按钮，完成更多功能：

  • 单击左侧工具栏 [image] 添加新的变量到“Watches”区域中。
  • 单击左侧工具栏 [image] 删除选中的变量。
  • 单击左侧工具栏 [image] 复制选中变量，用户可以基于复制后的变量，修改成想要的参数：

    选中复制后的变量，右击选择“Edit”，重新输入新的变量名即可。

  • 若Watches区域变量或线程太多不方便查看变量信息时，可以单击左侧工具栏 [image] 打开新的“Watches”窗口，变量会自动呈现到该窗口中，如图3所示。单击“Watches”窗口上方的 [image] ，“Watches”窗口会自动合入“Variables”窗口。
    图3 开启Watches窗口

Step Over功能

  1. 设置断点。
  2. 启动调试功能，界面停在断点处。
  3. 单击 [image] 程序向下执行一行。详细示例如图4所示。
    图4 Step Over功能

Step Into功能

  1. 设置断点。
  2. 启动调试功能，界面停在断点处。
  3. 单击 [image] 程序向下执行一行。如果该行有自定义方法，则运行进入自定义方法，详细示例如图5所示。
    图5 Step Into功能

Step Out功能

若执行调试时，通过 Step Into功能 进入了一个函数，例如“GetFileList”，若检查该函数没有问题，则可以通过单击 [image] 跳出该函数，返回到原来位置，如图6所示。

图6 Step Out功能

Run to cursor功能

若某行代码没有设置断点，用户想调试该行代码，则可以通过单击 [image] ，将断点移到光标所在代码行，如图7所示。

图7 Run to cursor功能

Mute Breakpoints功能

调试过程中，如果想暂停使用所有断点，单击 [image] 按钮后，所有断点被置灰，如图8所示，同时该按钮显示灰色底纹，单击 [image] 调试代码直接运行完成。

图8 Mute Breakpoints功能
父主题： 调试C/C++代码


调试Python代码

  • 调试前准备
  • 断点管理
  • 调试执行
父主题： 工程调试与执行


调试前准备

Windows下支持远程Python代码的跳转、联想。

配置Python SDK

为满足应用开发过程中Python代码调试的需求，提供基于Python Community Edition插件的Python代码调试方法，调试准备如下（以配置全局Python SDK为例，具体配置功能请参见Python SDK设置）：

  1. 在顶部菜单栏中选择“File > Project Structure...”。
  2. 在“Project Structure”左侧选择“Platform Settings > SDKs”，单击“+”，弹出框选择“Add Python SDK”，如图1所示。

    图1 配置Python SDK

  3. 在“Add Python Interpreter”窗口中，选择合适的Python解析器 ，用户自行添加。可选解析器如表1所示。单击“OK”完成添加。

    图2 Add Python Interpreter
    表1 Python解析器选项

    解析器

    说明

    Virtualenv Environment

    集成了Virtual Environment工具，用以创建独立的虚拟环境。

    Conda Environment

    使用Anaconda中带有的Python解释器。

    System Interpreter

    系统本地解析器。

    Pipenv Environment

    Pipenv是一种工具，提供了为Python项目创建虚拟环境所需的所有必要方法。

    Poetry Environment

    使用Poetry工具，创建基于工程依赖的虚拟环境。

    SSH Interpreter

    远程解析器。通过SSH方式添加远程设备的Python SDK并通过Deployment功能，将指定项目中的文件、文件夹同步到远程指定机器的指定目录，详细请参见Ascend Deployment。（如选择该选项，在工程运行时，MindStudio将以远端运行的方式进行。）

配置文件调试编译

  1. 在顶部菜单栏中选择“Run > Edit Configurations...”或通过单击工具栏中的图3，进入运行配置界面。

    图3 运行配置框

  2. 单击左上角的“+”，选择“Python”，新增文件的编译调试配置。
  3. 右侧显示配置项，关键配置参数参见表2，配置示例如图4所示。

    单击“Apply”应用后，单击“OK”保存并关闭调试配置。
    图4 源文件配置项
    表2 调试运行关键参数说明

    参数

    说明

    Name

    用户自行定义。

    Script path

    选择需要执行调试的Python源文件具体路径。

    Python interpreter

    “Use SDK of module”：使用模块级的Python SDK进行解析。

    具体配置功能请参见设置模块级Python SDK（昇腾工程）或设置模块级Python SDK（非昇腾工程）。

    “Use specified interpreter”：使用已配置的特定解析器。

    具体配置功能请参见Python SDK设置。

    Working directory

    工作目录（默认为需执行调试的Python源文件所在的目录）。

父主题： 调试Python代码


断点管理

断点是指在某一行设置一个断点，当程序运行到断点处时暂停执行，然后用户可通过预先完成的设置，查看变量、内存，检查程序逻辑是否正确。您可以设置各种方式的断点，例如让程序暂停在函数执行的入口处，或者让程序暂停在文件的某一行等。

添加断点

打开想要调试的代码，选定要设置断点的代码行，在行号的区域后面单击鼠标左键，既可以添加断点，如图1所示，断点添加成功后，左侧代码行号处会显示 [image] 图标。

图1 添加断点

删除断点

在设置断点的地方，单击左侧的 [image] 即可取消断点。

停用断点

若用户设置了多个断点，执行调试时想使用部分断点又不删除其他断点，则可以通过以下操作暂时停用断点。

右击已经设置断点的代码行号处的 [image] ，在弹出界面中不勾选“Enabled”，可以看到原有 [image] 断点标识变成 [image] ，则再执行调试功能时，该断点不生效。
图2 断点停用

启用断点

若已经有部分断点设置了停用，执行新的调试功能时想重新启用断点，则可以通过以下操作实现。

右击已经停用断点处的 [image] ，在弹出界面中勾选“Enabled”，可以看到原有 [image] 断点标识变成 [image] ，则后续执行调试功能时，该断点生效。
图3 断点Enable

MindStudio重启以及工程重启后，不会影响当前工程中已经设置的断点状态和数量。

查看断点

在顶部菜单栏中找到“Run > View Breakpoints”，通过该功能，用户可以查看当前设置的所有断点。

单击断点界面的“More(Ctrl+Shift+F8)”，弹出图4所示断点查看界面。

图4 断点查看界面

左侧序号1断点列表展示了当前代码中所设置的所有断点，序号2对应相应断点的停用（Disabled）或启用（Enabled）功能，序号3为代码预览区域。

功能使用方法参考如下：

  • 单击左侧断点列表中，断点左侧的复选框，勾选表示该断点启用，相应序号2处“Enabled”功能被勾选，同时在代码预览区域中，对应代码行左侧行号处显示 [image] 图标；取消勾选表示该断点停用，相应序号2处“Enable”功能被取消勾选，同时在代码预览区域中，对应代码行左侧行号处显示 [image] 图标。
  • 选中断点列表处的断点，单击上方的 [image] 可以删除断点，同时代码预览区域，相应代码行号处的断点图标随之删除。
  • 在代码预览区域，代码行号处单击，则该行被标记为断点，同时断点列表中会自动增加该断点信息。
父主题： 调试Python代码


调试执行

启动调试

  1. 设置完断点后，单击工具栏中debug图标 [image] 即可启动调试功能。

    远程调试的情况下，单击工具栏中debug图标 [image] 需要再次输入远程连接的服务器的登录密码。

  2. 调试功能启用后，会停在第一个（已启用的）断点处，调试界面如图1 工程右下方出现Debugger视图，其中：
    • 左侧Frames区域是程序的方法调用栈，在该区域中显示了程序执行到断点处所调用过的所用方法，越下面的方法被调用的越早。蓝色信息表示当前调试程序停留的代码行。
    • 右侧Variables展示变量信息以及线程信息。
      图1 调试工程界面
父主题： 调试Python代码


工程关闭

关闭工程

如需关闭当前打开的工程，可在顶部菜单栏中选择“File > Close Project”，关闭所有的工程后，系统会弹出如图1所示界面。您可以根据需要，根据右侧页面记录中打开最近的工程、单击“Open”导入现有工程或者单击“New Project”新建工程。

图1 欢迎页面

打开最近工程

工程关闭后，可通过如下任一方式，打开最近使用的工程：

  • 依次单击顶部菜单栏中的“File > Open Recent > Manage Projects...”，在弹出页面中选择想要打开的工程。
  • 依次单击顶部菜单栏中的“File > Open Recent”，在右侧弹出页面中选择想要打开的工程，如图2所示中的工程。
    图2 Open Project

    如该工程存在代码风险，在打开时会弹出信任窗口。

    • 如该工程源码可被信任且安全，请单击“Trust Project”。（可通过勾选“Trust project in <工作区目录>”复选框信任该目录下的所有工程。）
    • 如该工程不被信任，仅用于查看其中源码，请单击“Preview in Safe Mode”进入安全模式预览。
    • 如放弃打开该工程，请单击“Don't Open”取消工程导入操作。

    若工作窗口已打开其他工程，会出现如图3所示提示。

    图3 工程创建提示
    • 选择“This Window”，则直接在当前工作窗口打开新创建的工程。
    • 选择“New Window”，则新建一个工作窗口打开新创建的工程。

移除最近工程记录

工程关闭后，可根据实际需求，选择移除最近打开的工程记录，具体操作可参考以下几种方式：

  • 在MindStudio欢迎界面中，使鼠标移动至右侧想移除的工程上，单击工程项右侧的 [image] 或直接右键单击选择“Remove from Recent Projects”。
  • 在工程界面下，找到顶部菜单栏中的“File > Open Recent > Manage Projects...”，在弹出图4页面中使鼠标悬浮至想移除的工程上，单击右侧的 [image] 或者右键单击选择“Remove from Recent Projects”。
    图4 Recent Projects
父主题： 工程管理


模型转换和调优

  • 简介
  • 使用约束
  • 支持框架类型
  • 执行转换
  • 模型可视化
父主题： 操作指南


简介

模型转换和调优是将Caffe/TensorFlow等框架训练好的模型，通过ATC或者AOE工具将其转换为对应 AI处理器支持的离线模型，详细架构如图1和图2 AOE工具功能架构所示。

  • ATC工具：ATC会进行算子调度优化、权重数据重排、内存使用优化等具体操作，对原始的深度学习模型进行进一步的调优，从而满足部署场景下的高性能需求，使其能够高效执行在对应 AI处理器上。
  • AOE工具：AOE通过生成调优策略、编译、在运行环境上验证的闭环反馈机制，不断迭代出更优的调优策略，最终得到最佳的调优策略，从而可以更充分利用硬件资源，不断提升网络的性能，达到最优的效果。两种调优方式如下：
    • 子图调优：通过SGAT（SubGraph Auto Tune），对子图切分策略进行调优，通过在运行环境上验证获得真实性能，最终将最优的调优策略固化至模型知识库，并获取优化后的模型。
    • 算子调优：通过OPAT（Operator Auto Tune），对算子进行调优，通过在运行环境上验证获取真实性能，最终将优选算子调优策略固化到算子知识库。
图1 ATC工具功能架构
图2 AOE工具功能架构
父主题： 模型转换和调优


使用约束

  • 如果要将FasterRCNN、YoloV3、YoloV2等网络模型转成适配对应 AI处理器的离线模型， 请参见《CANN 6.3.RC2 ATC工具使用指南》或《CANN 6.2.RC2 ATC工具使用指南》“定制网络专题”章节先修改prototxt模型文件。
  • 不支持动态shape的输入，例如：NHWC输入为[?,?,?,3]多个维度可任意指定数值。模型转换和调优时需指定固定数值。
  • 模型中的所有层算子除常量算子外，输入和输出需要满足维度不为0。
  • 只支持《CANN 6.3.RC2 支持Caffe&TensorFlow&ONNX&PyTorch算子清单》或《CANN 6.2.RC2 支持Caffe&TensorFlow&ONNX算子清单》中的算子，并需满足算子限制条件。
  • 模型调优的使用约束请参见《CANN 6.3.RC2 AOE工具使用指南》中的“离线推理场景下调优（其他推理设备） > 执行调优”章节。
父主题： 模型转换和调优


支持框架类型

模型转换和调优支持的原始框架类型、输入数据类型和模型文件如表1所示。

表1 支持框架类型

原始框架类型

输入数据类型

模型文件说明

Caffe
  • FP32
  • FP16：通过设置入参--input_fp16_nodes实现。
  • UINT8：通过配置数据预处理实现。
    说明：
  • 模型文件：xxx.prototxt
  • 权重文件：xxx.caffemodel

其中，模型文件和权重文件的op_name、op_type必须保持名称一致（包括大小写）。

TensorFlow
  • FP16
  • FP32
  • UINT8
  • INT32
  • INT64
  • BOOL
    说明：

    不支持输出数据类型为INT64，需要用户自行将INT64的数据类型修改为INT32类型。

模型文件：xxx.pb

只支持FrozenGraphDef格式的.pb模型转换和调优。

ONNX
  • FP32
  • FP16：通过设置入参--input_fp16_nodes实现。
  • UINT8：通过配置数据预处理实现。

模型文件：xxx.onnx

MindSpore
  • FP32
  • UINT8：通过配置数据预处理实现。

模型文件：xxx.air
父主题： 模型转换和调优


执行转换

模型转换和调优入口

  • 可以通过如下两种方式进入模型转换和调优界面。
    • 在菜单栏选择“View > Appearance > Toolbar”，菜单栏下方会出现一行工具栏，选择 [image] 。
    • 在菜单栏选择“Ascend > Model Converter”。

    转换详情请参见操作步骤。

  • 用户也可以通过如下方式使用ATC或者AOE工具进行模型转换和调优。
    1. 单击MindStudio界面下方的Terminal窗口。
    2. 参见《CANN 6.3.RC2 ATC工具使用指南》或《CANN 6.2.RC2 ATC工具使用指南》或者《CANN 6.3.RC2 AOE工具使用指南》或《CANN 6.2.RC2 AOE工具使用指南》使用命令行方式进行模型转换和调优。

前提条件

  • 使用MindStudio安装用户，将所转换模型的模型文件以及权重文件上传到Ascend-cann-toolkit开发套件包所在的开发环境。
  • 进行AOE调优时，避免由于环境配置太低或者内存不足的情况导致AOE调优失败，建议开启NCS服务，在开发环境和运行环境之间建立通信，具体操作请参见《CANN 6.3.RC2 AOE工具使用指南》中“配置密钥证书”章节。

    开启NCS服务后，进行AOE调优时需在“Advanced Options Preview”高级选项配置页签的“Additional Arguments”参数中配置“--ip=xx.xx.xx.xx --port=xxx”与运行环境建立通信，IP和Port为运行环境的IP和端口号。

操作步骤

以下操作以ATC工具为例：

  1. 打开模型转换和调优页面，在“Model Information”页签中上传模型文件和权重文件，界面参考如图1所示。

    图1 配置模型信息（Linux系统示例）

    参数解释如表1所示。

    表1 Model Information界面参数配置

    参数

    说明

    备注

    Mode Type

    运行模式，默认ATC。

    必选。
    • ATC：将开源框架的网络模型转换为适配对应 AI处理器的离线模型，此模式不会对模型进行调优。
    • AOE：充分利用有限的硬件资源，对模型进行算子调优或者子网调优，以满足算子和整网的性能要求。

    Model File

    模型文件，该模型文件需要取消其他用户写的权限。

    必选。
    • Linux环境：单击右侧的 [image] 或直接输入本地服务器上需要转换的模型文件路径。
    • Windows环境：
      • 选择“remote path”，在后台服务器路径选择需要转化的模型文件并上传；
      • 选择“local path”，单击右侧的 [image] ，在Windows本地选择或直接输入需要转化的模型文件路径并上传。

    选择好模型文件后，单击右侧的 [image] 按钮，可以查看该模型的原始网络结构图，详情请参见•Model File：查看原始模型网络结构图。

    Weight File

    权重文件。

    当原始框架是Caffe时，该参数存在且必选。
    • Windows环境中：

      模型文件和权重文件需要放在同一目录下，单击选择模型文件时，权重文件将会自动填充。

    • Linux环境中：
      • 如果模型文件和权重文件存在于后台服务器同一目录下，且名称和模型文件名称相同，则选择模型文件后，权重文件会自动填充。
      • 如果模型文件和权重文件存在于后台服务器不同目录或者在同一目录下，但名称和模型文件名称不相同。单击右侧的 [image] 选择模型文件对应的权重文件或在输入框中自行输入*.caffemodel权重文件在后台服务器的路径。

    Model Name

    输出的模型文件名称。

    必选。
    • 选择模型文件后，该参数会自动填充，用户可以自行修改。
    • 如果模型的输出路径已经存在相同名称模型文件，单击“Next”后会提示覆盖原有文件或重命名当前Model Name的信息。

    Job Type

    调优模式。

    Mode Type选择AOE时必选。

    取值如下所示，默认为1-Subgraph Auto Tune(SGAT)。

    • 1-Subgraph Auto Tune(SGAT)：表示子图调优。
    • 2-Operator Auto Tune(OPAT)：表示算子调优。

    Target SoC Version

    模型转换时指定芯片型号。

    Mode Type选择ATC时必选。

    请根据板端环境具体芯片形态进行选择，默认为Ascend310。

    Output Path

    模型文件输出路径。

    必选

    默认输出路径为$HOME/modelzoo/${Model Name}/${Target SoC Version}/，也可手动输入或单击可单击右侧 [image] 进行自定义。

    Input Format

    输入数据格式。

    必选。

    该参数只支持设置为单个取值。

    • 当原始框架是Caffe时，取值为NCHW、ND（表示支持任意维度格式，N<=4），默认为NCHW。
    • 当原始框架是ONNX时，取值为NCHW、NCDHW、ND（表示支持任意维度格式，N<=4），默认为NCHW。
    • 当原始框架是MindSpore时，取值为NCHW。
    • 当原始框架是TensorFlow时，取值为NCHW、NHWC、ND、NCDHW、NDHWC，默认为NHWC。

    Input Nodes

    模型输入节点信息。

    必选。
    • 如果选择模型文件并且解析成功，则该参数下方会展示模型输入节点的Shape信息以及Type信息。
    • 如果选择模型文件后，无法解析“Input Nodes”，该场景下，需要用户根据模型文件中的相关信息手动输入：单击该参数右侧的 [image] ，在弹出界面中输入模型输入节点的Name、Shape信息和输入节点的数据类型Type。
    • 如果模型有多个输入，解析成功后，“Input Nodes”参数下方会展示每一个输入节点的Shape信息和Type信息。
      说明：
      • 若原始框架为MindSpore，Input Nodes不会自动解析对应模型中的输入信息，需要用户自行查看相应的网络模型输入，手动填写。如果不填，后台使用atc命令进行转换时，ATC工具会自动解析网络模型中的相关参数。
      • 模型转换工具目前不支持删除模型中默认带动态Shape的节点。

    Shape

    模型输入的shape信息。

    例如图1中的数值分别代表输入数据的N（模型一次处理的图片个数），C（Channel，例如彩色RGB图像的Channel数为3），H（Height），W（Width）。若开启AIPP功能，则此处的H，W取值即为AIPP输出数据的高和宽。

    更多输入数据格式设置请参见•Shape：根据输入数据格式分为以下两种设置情...。

    说明：

    模型转换时开启动态batch功能需要手动修改配置文件。

    • 进入“atc/conf/”目录，修改目录下“atc_param_conf.json”配置文件。
    • 删除文件中“Ascend610”字段的"exclude_keys"中的“DynamicBatchSize”字样。

    Type

    指定输入节点的数据类型。

    必选。

    如果模型有多个输入，只有Type取值不为FP16的节点，才可以配置“Data Pre-Processing”页签；如果Type取值不为FP16的节点无法获取Shape中的H，W信息，也无法配置“Data Pre-Processing”页签。

    更多原始框架支持的数据类型以及是否可配置“Data Pre-Processing”页签情况请参见•Type：支持的数据类型。

    Output Nodes

    指定输出节点信息。

    可选。

    如果用户想要查看某层算子参数是否合适，则需要将该层算子的参数输出，详细操作请参见•Output Nodes：指定输出节点信息。模型转换后，在相应.om模型文件可以看到该层算子的输出直接作为模型的输出。详细信息请参见模型可视化。

    “Output Nodes”参数下方“Select”层的算子，默认为全部选中。

    Load Configuration

    导入上次模型转换的配置文件。

    可选。

    如果用户之前转换过模型，无论成功与否，在$HOME/modelzoo/${Model Name}/${Target SoC Version}/路径都会生成${Model Name}_config.json配置文件，该文件记录用户模型转换时所选择的配置信息，包括所用模型路径、模型名称、输入输出配置，数据预处理配置等，下次重新转换模型时，通过单击“Load Configuration”选择相应路径下的配置文件，则相应的配置信息会自动填充，用户自行决定是否沿用上次配置还是修改配置后重新进行模型转换。

    Model Information界面参数详细说明：

    • Model File：查看原始模型网络结构图。

      在“Model File”栏选择好模型文件后，单击右侧的 [image] 按钮，弹出生成模型网络结构图进度条，之后会弹出该模型的原始网络结构图，在模型网络结构图中可以进行以下操作，具体操作方法请参见可视化界面说明（MindSpore框架的原始网络模型，不支持查看网络结构图。）。

      • 查看算子信息
      • 查看算子输出维度和shape信息

        如果用户选择的模型中包括不支持的算子，MindStudio界面“Output”窗口会提示哪些算子不支持并提示shape信息无法获取等信息，在弹出的网络结构图中该算子呈现红色，该场景下无法获取算子的输出维度和shape信息。该场景下的处理方法请参见异常处理。

      • 搜索算子
      • 搜索算子内部信息
    • Shape：根据输入数据格式分为以下两种设置情况。
      • 当“Input Format”参数是具有固定形状的输入数据格式，如NCHW、NCDHW等。
        • 设置动态batch：适用于执行推理时，每次处理图片数量不固定的场景。

          将解析的shape中的N设置为-1，会在shape下方出现Dynamic Batch Size参数。在其中的编辑框中输入具体的档位数，每一档通过英文逗号分隔。最多支持100档配置，每个档位数值建议限制为：[1~2048]，例如输入1,2,4,8。

          如果模型转换时设置了Dynamic Batch Size参数，则使用应用工程进行模型推理时，需要在aclmdlExecute接口之前，增加aclmdlSetDynamicBatchSize接口，用于设置真实的batch档位。关于aclmdlSetDynamicBatchSize接口的具体使用方法，请参见《应用开发指南》中的章节。

        • 设置输入图片的动态分辨率：适用于执行推理时，每次处理图片宽和高不固定的场景。

          将解析的shape中的H和W设置为-1，会在shape下方出现Dynamic Image Size参数。在其中的编辑框中输入具体的动态分辨率参数，最少输入两组，每一组参数通过英文分号分隔，组内参数使用英文逗号分隔。最多支持100档配置，例如输入112,112;224,224。

          如果模型转换时设置了Dynamic Image Size参数，则使用应用工程进行模型推理时，需要在aclmdlExecute接口之前，增加aclmdlSetDynamicHWSize接口，用于设置真实的分辨率。关于aclmdlSetDynamicHWSize接口的具体使用方法，请参见《应用开发指南》的章节。

          如果模型转换时设置了动态分辨率，并且要使用“Data Pre-Processing”中的数据预处理功能，该场景下不能设置数据预处理的Crop和Padding功能。

          设置动态batch和动态分辨率不能同时使用，一次只能设置其中一个参数。

      • 当“Input Format”参数为ND，设置ND格式下的动态维度：适用于执行推理时，每次处理任意维度的场景。

        根据需要设置-1在Shape中数量及位置，会在Shape下方出现Dynamic Dims参数。在其中的编辑框中输入具体的动态维度参数，最少输入2组，最多100组。组与组之间使用英文分号分隔，组内参数使用英文逗号分隔。组与组之间的内容不能重复，组内的最小维度为1。每组中的参数值与Shape参数中的-1标识的参数依次对应，Shape参数中有几个-1，则每组必须设置几个参数值。例如输入shape信息为“-1,-1,-1,-1”，输入Dynamic Dims参数可以为“1,224,224,3;2,448,448,6”。

    • Type：支持的数据类型。
      • 支持的数据类型：
        • 若原始框架类型为Caffe、ONNX，支持的数据类型为FP32、FP16、UINT8。
        • 若原始框架类型为MindSpore，支持的数据类型为FP32、UINT8。
        • 若原始框架类型为TensorFlow，支持的输入数据类型为FP32、FP16、UINT8、Int32、Int64、Bool。
      • 根据Type数据类型判断“Data Pre-Processing”页签是否可配置：
        • 当原始框架为Caffe、ONNX和MindSpore时，只有Type取值为UINT8，2中“Data Pre-Processing”页签才支持配置，其他类型不支持配置。如果模型有多个输入，只有Type取值为UINT8的节点，才可以配置“Data Pre-Processing”页签；如果Type取值为UINT8的节点无法获取Shape中的H，W信息，也无法配置“Data Pre-Processing”页签。
        • 当原始框架为TensorFlow时，只有Type取值不为FP16，2中“Data Pre-Processing”页签才支持配置：
          • 如果Type取值为UINT8，则“Data Pre-Processing”页签默认开启，且不可以关闭。
          • 如果Type取值为FP32、Int32、Int64、Bool中的一种，则“Data Pre-Processing”页签默认关闭，可手动开启。
    • Output Nodes：指定输出节点信息。
      单击“Select”在弹出的网络拓扑结构中，选中某层节点，右击选择“Select”，该层由蓝色标签进行标记，单击“OK”后，在“Output Nodes”参数下面会看到标记层的算子，右击选择“Deselect”取消选中。
      • Op Name：标记层的算子名称。
      • Data Type：算子输出的数据类型，包括FP32、UINT8、FP16，通过该参数用户可以设置单个算子的输出数据类型。
      • 如果不标记某层算子或标记后Output Nodes节点下方不选中某个算子，则模型的输出默认为最后一层的算子信息。
      • 如果标记某层算子，并且标记后Output Nodes节点下方选中某个或多个算子，则模型输出为Output Nodes节点下方选中的算子。
      • 如果模型转换过程中该算子被融合掉，则该算子不能作为输出节点。
      • 如果用户选择的模型中包括不支持的算子，则单击“Select”后，MindStudio界面“Output”窗口会提示哪些算子不支持并提示shape信息无法获取等信息，在弹出的网络结构图中该算子呈现红色，该场景下无法获取算子的输出维度和shape信息。
      • 若原始框架为MindSpore，该参数无法编辑，不支持指定输出节点信息。

  2. 单击“Next”，进入“Data Pre-Processing”配置数据预处理页签，界面参考如图2所示。

    数据预处理是对应 AI处理器提供的硬件图像预处理模块，包括色域转换，图像归一化（减均值/乘系数）和抠图（指定抠图起始点，抠出神经网络需要大小的图片）等功能。
    图2 配置数据预处理功能

    参数说明如表2所示。

    表2 Data Pre-Processing界面参数配置

    参数

    说明

    备注

    Image Pre-processing Mode

    图片预处理模式， 包括如下两种：

    • Static：静态AIPP。
    • Dynamic：动态AIPP。

    -

    Image Pre-processing Mode取值为Static，如下参数需要配置：

    Load Aipp Configuration

    AIPP配置加载功能。动态AIPP不支持此功能。

    此功能默认关闭，开启此功能后，在“Aipp Configuration File”输入框中选择对应的配置文件。

    加载配置文件后，所有“Input Node： (data)”和“Input Node： (im_info)”下的参数按照配置文件自动设置。如有需要，打开“Aipp Configuration File”右侧的开关，界面下方将会展示“Input Node： (data)”和“Input Node： (im_info)”中的所有参数，用户可对其进行自定义修改。

    Input Node： (data)

    节点配置开关，可以控制是否对该节点开启AIPP。
    • 当图1中Input Nodes参数对应data节点的Type取值为UINT8，并且能获取模型的宽和高，该参数才会自动开启。
    • 当模型为TensorFlow时，图1中Input Nodes参数对应data节点的Type取值为FP32、Int32、Int64、Bool，并且能获取模型的宽和高时，可以手动开启该参数。

    Input Node： (im_info)

    模型有两个输入时，该参数才出现，表示对模型的第二个输入开启AIPP。

    只有图1中Input Nodes参数对应im_info节点的Type取值为UINT8，并且能获取模型的宽和高，该参数才会自动开启。Input Node： (im_info)中的im_info根据解析的模型不同而变化。

    Input Image Format

    输入图片格式。

    若1中“Target SoC Version”选择对应值，则支持的格式为：YUV420 sp、YVU420 sp、RGB package、BGR package、YUV400。

    更多图片输入格式详情请参见•Input Image Format：根据图片...。

    Input Image Resolution

    原始图片大小。
    • 如果“Input Image Format”取值为“YUV420 sp”，要求原始图片的宽和高取值是偶数。
    • 如果1中“Shape”设置了动态分辨率参数，即原始图片的宽和高不确定，要求其宽和高取值为0。

    Model Image Format

    模型处理图片格式。该参数同时也是色域转换开关，默认开启。当输入图片格式与模型处理文件格式不一致时需要开启。

    输入图片格式不同，模型处理图片格式不同，更多格式说明请参见•Model Image Format：根据图片...。

    Crop

    抠图开关，若开启，则表示启用抠图功能。默认关闭。

    开启该参数后，下方会出现如下两个参数，参数说明以及抠图约束请参见•Crop：抠图开关开启后，参数解释以及抠图约束...。

    Padding

    Padding使能开关，若开启，则表示启用补边功能。默认关闭。

    Padding Area [L][R][B][T]取值范围为[0,32]。AIPP经过Padding后，输出的图片的高和宽要与模型需要的高和宽保持一致。

    Normalization

    归一化开关。

    开启后，其中“Conversion Type”表示计算规则，包括Mean、Min、Variance三个配置项。

    Mean

    每个通道的均值。

    当开启“Normalization”参数时才呈现，该参数的具体显示以及值的详情请参见•Mean：根据“Model Image For...。

    Min

    每个通道的最小值。

    当开启“Normalization”参数时才呈现，该参数的具体显示以及值的详情请参见•Min：根据“Input Image Form...。

    1/Variance

    每个通道的方差的倒数。

    当开启“Normalization”参数时才呈现，该参数的具体显示以及值的详情请参见•1/Variance：根据“Input Ima...。

    Image Pre-processing Mode取值为Dynamic，如下参数需要配置：

    Input Node： (data)

    动态AIPP节点配置开关，可以控制是否对该节点开启动态AIPP。
    • 当图1中Input Nodes参数对应data节点的Type取值为UINT8，并且能获取模型的宽和高，该参数才会自动开启。
    • 当模型为TensorFlow时，图1中Input Nodes参数对应data节点的Type取值为FP32、Int32、Int64、Bool，并且能获取模型的宽和高时，可以手动开启该参数。

    Input Node： (im_info)

    模型有两个输入时，该参数才出现，表示对模型的第二个输入开启动态AIPP。

    只有图1中Input Nodes参数对应im_info节点的Type取值为UINT8，并且能获取模型的宽和高，该参数才会自动开启。Input Node： (im_info)中的im_info根据解析的模型不同而变化。

    Max Image Size (Byte)

    输入图像最大的size，动态AIPP必须配置（如果为动态batch场景，N为最大档位数的取值）。

    根据输入图像格式确定该参数的取值，详情请参见•Max Image Size (Byte)：根...。

    Data Pre-Processing界面参数详细说明：

    • Input Image Format：根据图片输入格式，分为以下几种情况。
      • 若取值为YUV420 sp、YVU420 sp、YUV422 sp、YVU422 sp，则右侧会出现输入数据类型选项：

        BT.601(Video Range)、BT.601(Full Range)、BT.709(Video Range)、BT.709(Full Range)

        不同的类型，对应不同的色域转换配置（色域转换，用于将输入的数据格式，转换为模型需要的格式，具体色域转换系数会在模型转换完成后生成在insert_op.cfg配置文件中）其中：

        • BT.601是标准清晰度视频的格式，定义于SDTV标准中。
        • BT.709是标准化高清晰度视频的格式，定义于HDTV标准中。

        两种标准又分为NARROW(Video Range)和WIDE(Full Range)，其中：

        NARROW取值范围为： ；WIDE取值范围为： ，关于如何判断输入数据的标准，请参见《CANN 6.3.RC2 ATC工具使用指南》或《CANN 6.2.RC2 ATC工具使用指南》“FAQ > 使用AIPP色域转换模型时如何判断视频流的格式标准”章节。

      • 若取值为YUV400，不支持色域转换。
      • 若取值为RGB package、BGR package、ARGB package、RGBA package、ABGR package、BGRA package，则不会出现右侧的输入数据类型选项，根据输出（Model Image Format）参数的取值不同，模型转换完成后，数据预处理配置文件insert_op.cfg中如下参数的取值不同：
        • 若取值为BGR package，输出为RGB；或取值为RGB package，输出为BGR：
          #色域转换前，R通道与B通道交换开关/U通道与V通道交换开关
rbuv_swap_switch : true
        • 若取值为BGR package，输出为BGR；或取值为RGB package，输出为RGB：
          #色域转换前，R通道与B通道交换开关/U通道与V通道交换开关
rbuv_swap_switch : false
        • 若取值为ARGB package，输出为RGBA；或取值为ABGR package，输出为BGRA：
          #色域转换前，R通道与B通道交换开关/U通道与V通道交换开关
rbuv_swap_switch : false
#色域转换前，RGBA->ARGB, YUVA->AYUV交换开关
ax_swap_switch : true
        • 若取值为ARGB package，输出为BGRA；或取值为ABGR package，输出为RGBA：
          rbuv_swap_switch : true
ax_swap_switch : true
        • 若取值为RGBA package，输出为RGBA；或取值为BGRA package，输出为BGRA：
          rbuv_swap_switch : false
ax_swap_switch : false
        • 若取值为RGBA package，输出为BGRA；或取值为BGRA package，输出为RGBA：
          rbuv_swap_switch : true
ax_swap_switch : false
    • Model Image Format：根据图片格式输入不同，模型处理图片格式不同，分为以下几种情况。
      • 若“Input Image Format”取值为YUV420 sp、YVU420 sp、YUV422 sp、YVU422 sp、BGR package，则“Model Image Format”取值为RGB、BGR。
      • 若“Input Image Format”取值为RGB package，则“Model Image Format”取值为RGB、BGR、GRAY。
      • 若“Input Image Format”取值为YUV400，则“Model Image Format”取值只能为GRAY。
      • 若“Input Image Format”取值为ARGB package、RGBA package、ABGR package、BGRA package，则“Model Image Format”取值为RGBA、BGRA。
      • 若2中“Aipp Configuration File”选择的AIPP配置文件是读不出RGB数据的异常文件，则“Model Image Format”默认取值为GRAY。
    • Crop：抠图开关开启后，参数解释以及抠图约束如下所示。
      • 开启该参数后，下方会出现如下两个参数：
        • Cropping Start：抠图开始位置。Cropping Start [H][W]的取值范围要小于Input Image Resolution [H][W]（原始图片的高和宽）。
        • Cropping Area：抠图大小，默认抠图大小的宽和高来自图1 “Input Nodes”参数中Shape参数取值的宽和高，修改的宽和高取值不能超过原始图片Input Image Resolution对应参数的取值。
      • 抠图约束如下：
        • 若“Input Image Format”取值为YUV420 sp、YVU420 sp，则Cropping Start [H][W]都必须为偶数。
        • 若“Input Image Format”取值为YUV422 sp、YVU422 sp，则Cropping Start [W]必须为偶数。
        • 若“Input Image Format”取值为其他值，对Cropping Start [H][W]没有约束。
        • 若开启抠图功能，则Input Image Resolution >= Cropping Area + Cropping Start。

        若开启抠图功能，并且没有开启Padding，该场景下Cropping Area [H][W]才能取值为0或不配置，此时抠图大小Cropping Area [H][W]取值来自图1Input Nodes中shape取值的高和宽（模型文件input shape中的高和宽）。

    • Mean：根据“Model Image Format”参数的取值，该参数的具体显示和值如下所示。
      • 若“Model Image Format”为RGB时，则该参数显示为Mean: [R][G][B]，每个通道的默认值为104、117、123，可根据需要手动修改默认值。
      • 若“Model Image Format”为BGR时，则该参数显示为Mean: [B][G][R]，每个通道的默认值为104、117、123，可根据需要手动修改默认值。
      • 若“Model Image Format”为GRAY时，则该参数显示的默认值为104，可根据需要手动修改默认值。
      • 若“Model Image Format”为RGBA时，则该参数显示为Mean: [R][G][B][A]，每个通道的默认值为104、117、123、0，可根据需要手动修改默认值。
      • 若“Model Image Format”为BGRA时，则该参数显示为Mean: [B][G][R][A]，每个通道的默认值为104、117、123、0，可根据需要手动修改默认值。
    • Min：根据“Input Image Format”参数的取值，该参数的具体显示和值如下所示。
      • 若“Input Image Format”为YUV420 sp、YVU420 sp、YUV422 sp、YVU422 sp、YUV400、RGB package、BGR package，则该参数显示为Min: [R][G][B]，每个通道的默认值都为0。
      • 若“Input Image Format”为ARGB package、RGBA package、ABGR package、BGRA package，则该参数显示为Min: [R][G][B][A]，每个通道的默认值都为0。
    • 1/Variance：根据“Input Image Format”参数的取值，该参数的具体显示和值如下所示。
      • 若“Input Image Format”为YUV420 sp、YVU420 sp、YUV422 sp、YVU422 sp、YUV400、RGB package、BGR package，则该参数显示为1/Variance: [R][G][B]，每个通道的默认值都为1.0。
      • 若“Input Image Format”为ARGB package、RGBA package、ABGR package、BGRA package，则该参数显示为1/Variance: [R][G][B][A]，每个通道的默认值都为1.0。
    • Max Image Size (Byte)：根据图像输入格式的不同，该参数的取值也不同，该参数的具体取值如下所示。
      • 若输入图像格式为YUV400_U8，则Max Image Size>=N * Input Image Resolution [W] * Input Image Resolution [H] * 1。
      • 若输入图像格式为YUV420SP_U8，则Max Image Size>=N * Input Image Resolution [W] * Input Image Resolution [H] * 1.5。
      • 若输入图像格式为XRGB8888_U8，则Max Image Size>=N * Input Image Resolution [W] * Input Image Resolution [H] * 4。
      • 若输入图像格式为RGB888_U8，则Max Image Size>=N * Input Image Resolution [W] * Input Image Resolution [H] * 3。

    模型转换是否开启AIPP功能，执行推理业务时，对输入图片数据的要求：

    模型转换时开启AIPP，在进行推理业务时，输入图片数据要求为NHWC排布，该场景下最终与AIPP连接的输入节点的格式被强制改成NHWC，该场景下可能与1中“Model Information”页签中“Input Format”参数指定的数据格式不一致。

  3. 单击“Next”，进入“Advanced Options Preview”高级选项配置页签，界面参考如图3所示。

    图3 高级选项配置

    参数说明如表3所示。

    表3 Advanced Options Preview界面参数配置

    参数

    说明

    备注

    Operator Fusion
    是否关闭融合功能。
    • 打开表示关闭融合功能。打开该项将显示“Fusion Passes”。
    • 关闭表示开启融合功能。参数默认关闭，即默认打开融合功能。

    如果使用昇腾模型压缩工具量化后的模型通过模型转换得到.om离线模型，然后进行精度比对，则需要打开该开关。打开后，模型转换完毕，在生成om模型的同级目录下，会生成fusion_switch.cfg配置文件，该文件记录哪些功能被关闭。

    Fusion Passes

    需要关闭的融合规则。

    打开“Operator Fusion”功能，会显示该项。默认关闭的融合规则以及如何添加需要关闭的融合规则详情请参见•Fusion Passes：默认关闭的融合规则...。

    Log Print Level

    日志级别配置开关，可以控制是否打印模型转换过程中对应级别的日志信息。

    • 打开表示可以设置日志级别并打印对应级别的日志信息；
    • 关闭表示不打印日志信息。参数默认关闭。

    日志级别：

    • error：输出error/event级别的运行信息。
    • warning：输出warning/error/event级别的运行信息。
    • info：输出info/warning/error/event级别的运行信息。
    • debug：输出debug/info/warning/error/event级别的运行信息。

    Auto Tune Mode

    设置算子的自动调优模式。

    当前版本不支持该功能。

    Additional Arguments

    扩展转换参数。
    • 模型转换界面不支持配置，但是ATC或者AOE工具支持的参数，均可通过此选项进行扩展。最多支持输入2048个字符。
    • 在下方编辑框中输入ATC或者AOE工具可用的参数，用户根据实际情况进行填写，多个参数使用空格分隔。详细参数请参见《CANN 6.3.RC2 ATC工具使用指南》或《CANN 6.2.RC2 ATC工具使用指南》的“参数说明”章节或者《CANN 6.3.RC2 AOE工具使用指南》或《CANN 6.2.RC2 AOE工具使用指南》的“AOE参数说明”章节，例如：--log=info。
    • 如果界面已经有模型转换支持的参数，例如该页签中的设置模型转换过程中日志的级别参数“Log Print Level”，对应ATC工具中的“--log”参数，则在“Additional Arguments”再次配置“--log”参数为其他数值，例如配置为“--log="info"”，则“Log Print Level”参数中指定的模式不生效。

    Environment Variables

    环境变量。可选参数，请根据实际自行配置。
    • 在文本框中添加环境变量。环境变量_1=值1；环境变量_2=值2，多个环境变量用英文分号隔开。

      例如：TE_PARALLEL_COMPILER=8;REPEAT_TUNE=False

      环境变量解释：

      • TE_PARALLEL_COMPILER：AOE场景下，算子编译所需环境变量。
      • REPEAT_TUNE：AOE场景下，是否重新发起调优所需环境变量。
    • 单击文本框后的 [image] 图标，在弹出的对话框中单击 [image] 填写。
      • 在Name中输入环境变量名称：PATH_1。
      • 在Value中输入环境变量值：值1。

    环境变量的详细配置请参见《CANN 6.3.RC2 AOE工具使用指南》的“离线推理场景下调优（其他推理设备） > 配置环境变量”章节。

    Command Preview

    模型转换和调优使用的ATC或者AOE参数预览。不支持修改。
    • 在所有页签配置完相关参数后，该区域会给出界面参数转换成ATC或者AOE命令的结果预览，例如“Log Print Level”参数配置为“error”，则“Command Preview”区域展示的atc命令为“--log=error”。
    • 如果“Additional Arguments”中再次配置界面已有的参数，例如配置为“--log="info"”，则“Command Preview”区域会追加相应的参数，模型转换和调优时，“Command Preview”区域后面的参数取值会覆盖前面已有的参数。

    Advanced Options Preview界面参数详细说明：

    • Fusion Passes：默认关闭的融合规则以及如何添加需要关闭的融合规则如下所示。
      • 默认关闭的融合规则：

        V100RequantFusionPass、V200RequantFusionPass、ConvConcatFusionPass、SplitConvConcatFusionPass、TbeEltwiseQuantFusionPass、TbeConvDequantVaddReluQuantFusionPass、TbeConvDequantVaddReluFusionPass、TbeConvDequantQuantFusionPass、TbeDepthwiseConvDequantFusionPass、TbeFullyconnectionElemwiseDequantFusionPass、TbeConv2DAddMulQuantPass、TbePool2dQuantFusionPass、TbeAippConvReluQuantFusion、TbeCommonRules0FusionPass、TbeCommonRules2FusionPass。

      • 添加需要关闭的融合规则：
        • 在文本框中输入需要关闭的融合规则。融合规则名称1:off；融合规则名称2:off，多个融合规则之间用英文分号隔开。
        • 单击文本框后的 [image] 图标，在弹出的对话框中单击 [image] 填写。
          • 在Name中输入融合规则名称：融合规则名称1。
          • 在Value中输入环境变量值：off。

        用户需要确保输入的融合规则的正确性。

  4. 单击“Finish”，开始进行模型转换。

    在MindStudio界面下方，“Output”窗口会显示模型转换过程中的日志信息，如果提示“Model converted successfully”，则表示模型转换成功。“Output”窗口会显示模型转换所用的命令、所设置的环境变量、模型转换的结果、模型输出路径以及模型转换日志路径等信息。

    图4 模型转换成功

  5. 模型转换完毕，在服务器后台路径“$HOME/modelzoo/resnet50/$Soc_Version ”下会生成用于板端环境运行的.om模型文件，以及模型转换所用的配置信息文件${modelname}_config.json和日志文件ModelConvert.txt。

    • 如果开启数据预处理功能，在.om同级目录下，还会生成数据预处理的配置信息文件（insert_op.cfg）。
    • 如果勾选关闭融合功能，在.om同级目录下，还会生成融合开关配置文件（fusion_switch.cfg），用于记录哪些功能被关闭。
    • 如果开启日志级别配置功能，当模型转换完毕后，无论转换成功或者失败，在MindStudio界面右下方都会弹出“ModelConvert Detail”弹窗，如下图所示。
      图5 转换成功弹窗
      图6 转换失败弹窗
      • 单击“show model”可以在MindStudio界面打开转换成功后的模型可视化界面，模型可视化界面的操作方法请参见可视化界面说明。
      • 单击“show log”可以在MindStudio界面打开日志文件ModelConvert.txt，显示的日志内容由“Log Print Level”参数选择的级别类型决定。

    当Mode Type为ATC时，模型转换的日志文件（ModelConvert.txt）所在路径为：“$HOME/modelzoo/resnet50/$Soc_Version”。回显信息示例如下：

    dggphicprd32833:~/modelzoo/resnet50/Ascend310$ ll
total 50780
drwxr-x--- 2       4096 Mar 10 16:46 ./
drwx------ 3       4096 Mar 10 16:45 ../
-rw------- 1       127 Mar 10 15:55 fusion_switch.cfg         --融合开关配置文件
-rw------- 1       453 Mar 10 16:45 insert_op.cfg              --数据预处理配置文件
-rw-r----- 1       453 Mar 10 16:45 ModelConvert.txt          --日志文件
-rw------- 1       2095 Mar 10 18:03 resnet50_config.json    --模型转换所用的配置信息文件，下次模型转换时，可以通过选择该文件沿用上次模型转换的配置数据
-rw------- 1       51581408 Mar 10 16:46 resnet50.om           --上板运行的模型文件

    当Mode Type为AOE时，模型调优的日志文件（ModelConvert.txt）所在路径为：“$HOME/modelzoo/resnet50/aoe_type$Job Type”。回显信息示例如下：

    dggphicprd32833:~/modelzoo/resnet50/aoe_type1$ ll
total 51416
drwxr-x--- 3       4096 Feb 24 16:16 ./
drwxr-x--- 4       4096 Feb 24 16:10 ../
-r-------- 1       475 Feb 24 16:16 aoe_result_sgat_20230224161101211040_pid57522.json        --调优结果文件（子图调优是sgat，算子调优是opat）
drwxr-x--- 3       4096 Feb 24 16:11 aoe_workspace/
-rw-r----- 1       6732 Feb 24 16:15 fusion_result.json
-rw------- 1       454 Feb 24 16:10 fusion_switch.cfg
-rw------- 1       577 Feb 24 16:10 insert_op.cfg
-rw-r----- 1       849212 Feb 24 16:16 ModelConvert.txt
-rw------- 1       3025 Feb 24 16:16 resnet50_config.json
-rw------- 1       51752967 Feb 24 16:15 resnet50.om

异常处理

  • 问题描述

    如果用户选择的模型文件中包括对应 AI处理器不支持的算子，则模型转换时会弹出图7所示整网支持度评估报告。

    图7 模型整网支持度报告

    其中左侧的“Summary”区域中：

    • All Operator：显示本次转换的模型所包括所有算子个数，包括不支持的算子个数。

      单击“All Operator”，在右侧的“Result Details”区域，会展示模型所有的算子详细信息，包括算子类型，算子名称，是否解析成功的结果；如果算子解析失败，在“Description”处还会展示解析失败的原因。

    • UnSupported Operator：本次转换的模型不支持的算子个数。下方会列出不支持算子的原因，以及每种原因下不支持的算子个数。

      单击“UnSupported Operator”，右侧会筛选出所有不支持的算子。

  • 解决方法
    1. 在图7所示整网支持度评估报告界面中，选中右侧“Result Details”区域“Result”为“failed”的算子，则该算子整行被选中。单击最右侧“Operation”下面的解决方法，例如“Creator Operator”，创建自定义算子工程。

      如果当前已经打开了算子工程，则会弹出图8提示框，可以选择在当前算子工程添加算子或新建算子工程；如果当前不存在算子工程，则会直接弹出新建算子工程界面。

      关于创建自定义算子工程的详细操作请参见创建算子工程。
      图8 创建算子工程时提示信息
    2. 根据引导完成自定义算子工程的创建。

      “New Project > Ascend Operator”中的“Operator Type”自定义算子的类型，会根据模型支持度评估界面选中的算子类型自动填充。创建完成后，新建工程的默认存储路径为“$HOME/AscendProjects”。

      算子工程目录结构以及主要文件如下：
      ├── .idea
├── build                                  //编译生成的中间文件
├── cmake                                  //编译相关公共文件存放目录
├── framework                              //算子插件实现文件目录
│   ├── tf_plugin                         //存放tensorflow框架的算子插件文件及编译规则文件
│   │   ├── tensorflow_add_plugin.cpp
......
......
    3. 进行自定义算子的开发，详细信息请参见算子开发。

      自定义算子开发完成后，重新进行模型转换。

父主题： 模型转换和调优


模型可视化

对于原始模型文件（.pb、.onnx、.prototxt）或转换成功的.om模型文件，可以在MindStudio界面呈现其网络拓扑结构，并可以查看模型所使用的算子。下文中以.om模型文件为例展示模型可视化功能。

前提条件

如果Linux环境为aarch64架构，且系统中的glibc版本小于2.29，则无法使用MindStudio的模型可视化功能，处理方法请参考glibc版本过低导致无法使用模型可视化功能。

操作步骤

  1. 依次单击菜单栏“Ascend > Model Visualizer”，或在工具栏选择 [image] ，在弹出窗口中选择要可视化的模型，例如此处的resnet50模型文件。

    • 在Linux环境上使用模型可视化功能时，如图1所示。
      图1 选择要打开的模型（Linux）
    • 在Windows环境上使用模型可视化功能时，如图2所示。
      图2 选择要打开的模型（Windows）

      查看.prototxt模型文件时，需要保证.prototxt模型文件与其相关的.caffemodel权重文件在同一目录下。

  2. 鼠标左键双击resnet50.om模型文件或者单击“OK”，打开模型可视化界面如图3 模型可视化界面所示。

    图3 模型可视化界面

可视化界面说明

  • 查看算子信息

    图3 区域一中展示了模型文件中所有的算子，单击某层算子，该层算子会出现绿色选中框，区域三会展示该算子的详细信息，包括算子名称、算子输入、输出等信息。

    区域2会展示该网络模型的整体结构，包括区域三中展示的算子在整体网络结构中的位置，即图中的蓝色框选择位置。

    • 上/下滑动鼠标滚轮，可以控制模型可视化区域的上/下移动。
    • 按住Ctrl键+上下滑动鼠标滚轮，可以实现模型可视化区域的放大/缩小。
  • 查看算子输出维度和shape信息

    图3 区域一中还展示了每一层算子输出的shape信息，如每一层算子连接线中间的1,224,224,4等shape信息。

  • 搜索算子

    图3 区域四中的“Find”输入框中输入算子名称，下方搜索区域会列出相关的算子。选择其中一个算子，区域一中的网络拓扑结构中相应算子会显示绿色选中框，区域三会展示该算子的详细信息。如图4所示。

    图4 模型可视化界面的搜索功能
  • 搜索算子内部信息

    选区域一中某层算子，在区域三 [image] 图标后的输入框中输入想要查询的信息，比如算子的输入输出、属性等信息，然后单击 [image] 图标，如果匹配到相关信息，则区域三中相关信息会高亮显示，否则会在“Output”窗口提示“Value not found”。

  • 查看模型输出节点信息

    当模型转换时通过Select节点设置了输出算子，则在.om模型文件可以看到Select算子的输出直接作为模型的输出，可以单击相应的算子，查看其输入信息。

  • 查看模型输出节点的数据类型

    如果模型转换时设置了Select节点的输出类型，对应执行转换章节“Model Information”页签中Output Nodes区域下方节点的Data Type类型，模型转换完毕，用户可以单击对应的节点，查看不同输入节点的数据类型。

    如果模型转换时只设置了“Model Information”页签中的“Output Type”参数取值，没有Select节点，则模型转换完毕，单击对应的节点，查看输入数据类型即可。

    dtype为DT_FLOAT，表示数据类型为FP32，dtype为DT_FLOAT16表示数据类型为FP16，dtype为DT_UINT8表示数据类型为UINT8。

其他操作

Linux环境aarch64架构

UbuntuOS：https://mindstudio-sample.obs.cn-north-4.myhuaweicloud.com/glibc/euler-os/glibc-2.29.tar.gz

EulerOS：https://mindstudio-sample.obs.cn-north-4.myhuaweicloud.com/glibc/euler-os/glibc-2.29.tar.gz

父主题： 模型转换和调优


应用开发

  • 功能简介
  • 基于AscendCL开发应用
父主题： 操作指南


功能简介

MindStudio支持基于AscendCL（Ascend Computing Language）或MindX SDK开发应用。

  • MindX SDK致力于简化昇腾芯片推理业务开发过程，降低使用昇腾芯片开发的门槛。SDK采用模块化的设计理念，将业务流程中的各个功能单元封装成独立的插件，通过插件的串接快速构建业务。
  • 使用AscendCL提供的C语言API库开发深度神经网络应用，在昇腾CANN平台上开发应用，实现深度学习推理计算、图形图像预处理、单算子加速计算等。
父主题： 应用开发


基于AscendCL开发应用

  • 开发前须知
  • 创建应用工程
  • 准备模型文件和数据
  • 添加自定义动态链接库（可选）
  • 开发应用
  • 编译与运行应用工程
  • AscendCL样例工程使用指导
父主题： 应用开发


开发前须知

  • 对于运行环境在远端的Python版本应用工程，在应用开发开始前需要对运行环境进行配置。
    LD_LIBRARY_PATH=$HOME/Ascend/ascend-toolkit/{version}/runtime/lib64:$LD_LIBRARY_PATH;PYTHONPATH=$HOME/Ascend/ascend-toolkit/{version}/python/site-packages/acl:$PYTHONPATH

    其中{version}内容请根据实际情况填写，可选择通过以下任意一种方式处理。

    • 修改运行环境中的“.bashrc”文件，加入“PYTHONPATH”与Runtime路径。
    • MindStudio编译/运行配置时，在“Run/Debug Configuration”功能中添加“Environment Variables”，补充环境变量，详细操作请参见编译与运行应用工程。
  • 支持在Linux环境基于AscendCL开发C++应用。当前版本的MDC上的AscendCL C++应用需用户手动实现创建、绑定内存分组，首次安装MindStudio及MDC_SDK软件包后，需对内置ACL ResNet-50样例工程进行修改，用户基于修改后的样例创建工程后，即可正常编译、上板运行。

    远程上板运行功能仅在Development版本提供。

  • ACL ResNet-50样例工程位于MindStudio安装包解压文件夹内“./MindStudio/plugins/mindstudio-foundation/samples/inference/resnet50_imagenet_classification”路径下，需对src/main.cpp以及src/CMakeLists.txt进行修改。

首次获取ACL ResNet-50样例工程，需确保开发环境已联网，用户也可通过以下链接获取样例并解压到“MindStudio安装目录/plugins/mindstudio-foundation/samples/inference/”路径下。

  • ACL ResNet-50(C++)：下载地址。
  • ACL ResNet-50(Python)：下载地址。
  • 对于main.cpp，需添加创建、绑定内存分组相关代码：
    #include <iostream>
#include "sample_process.h"
#include "utils.h"
// 添加头文件
#include <dirent.h>
#include <cstring>
#include <unistd.h>
#include "ascend_hal.h"
//
using namespace std;
bool g_isDevice = false;
// 添加PID获取函数
void GetTsDaemonPid(int *pid)
{
    const char* taskName = "tsdaemon";
    const int bufSize = 50;
    struct dirent *ptr;
    FILE *fp;
    char filePath[50];
    char curTaskName[50];
    char buf[bufSize];

    DIR *dir;
    dir = opendir("/proc");
    if (NULL != dir)
    {
        while ((ptr = readdir(dir)) != NULL)
        {
            if ((strcmp(ptr->d_name, ".") == 0) || (strcmp(ptr->d_name, "..") == 0))
                continue;
            if (DT_DIR != ptr->d_type)
                continue;
            sprintf(filePath, "/proc/%s/status", ptr->d_name);
            fp = fopen(filePath, "r");
            if (NULL != fp)
            {
                if(fgets(buf, bufSize-1, fp)== NULL ){
                    fclose(fp);
                    continue;
                }
                sscanf(buf, "%*s %s", curTaskName);
                if (!strcmp(taskName, curTaskName)){
                    sscanf(ptr->d_name, "%d", pid);
                }
                fclose(fp);
            }
        }
        closedir(dir);
    }
}

// 添加内存分组创建、绑定函数
Result HalInit()
{
    int tsdaemonPid = 0;
    GetTsDaemonPid(&tsdaemonPid);
    INFO_LOG("tsdaemon pid: %d", tsdaemonPid);

    const int procPid = getpid();
    std::string buffGrpName = "ACL_DEFGRP_" + to_string(procPid);

    GroupCfg grpcfg = {0};
    grpcfg.maxMemSize = 1024 * 1024 * 32;
    int ret = halGrpCreate(buffGrpName.c_str(), &grpcfg);
    if (ret != DRV_ERROR_NONE) {
        ERROR_LOG("hal group create failed! errCode: 0x%x", ret);
        return FAILED;
    }

    GroupShareAttr Mattr = {0};
    Mattr.admin = 1;
    Mattr.alloc = 0;
    Mattr.write = 1;
    Mattr.read = 1;
    ret = halGrpAddProc(buffGrpName.c_str(), tsdaemonPid, Mattr);
    if (ret != DRV_ERROR_NONE) {
        ERROR_LOG("hal group add tsdaemon failed! errCode: 0x%x", ret);
        return FAILED;
    }

    Mattr.alloc = 1;
    ret = halGrpAddProc(buffGrpName.c_str(), procPid, Mattr);
    if (ret != DRV_ERROR_NONE) {
        ERROR_LOG("hal group add proc failed! errCode: 0x%x", ret);
        return FAILED;
    }

    ret = halGrpAttach(buffGrpName.c_str(), 2000);
    if (ret != DRV_ERROR_NONE) {
        ERROR_LOG("hal group attach failed! errCode: 0x%x", ret);
        return FAILED;
    }

    BuffCfg buffcfg = {0};
    ret = halBuffInit(&buffcfg);
    if (ret != DRV_ERROR_NONE) {
        ERROR_LOG("hal buff init failed! errCode: 0x%x", ret);
        return FAILED;
    }
    return SUCCESS;
}

int main()
{
    // 主函数添加内存初始化调用
    Result halInitRet = HalInit();
    if (halInitRet != SUCCESS) {
        ERROR_LOG("hal buff init failed");
        return FAILED;
}
//
    SampleProcess sampleProcess;

    Result ret = sampleProcess.InitResource();
    if (ret != SUCCESS) {
        ERROR_LOG("sample init resource failed");
        return FAILED;
    }

    ret = sampleProcess.Process();
    if (ret != SUCCESS) {
        ERROR_LOG("sample process failed");
        return FAILED;
    }

    INFO_LOG("execute sample success");
    return SUCCESS;
}
  • 此外，还需在src/CMakeLists.txt中添加MDC_SDK中ascend_hal相应头文件及链接库路径：
    # Header path
include_directories(
    ${INC_PATH}/${RUNTIME_NAME}/include/
../inc/
/usr/local/mdc_sdk/dp_gea/mdc_cross_compiler/sysroot/usr/include/driver
)
link_directories(
    #${LIB_PATH}
/usr/local/mdc_sdk/dp_gea/mdc_cross_compiler/sysroot/usr/local/Ascend/runtime/lib64/stub
)
target_link_libraries(main
            ascendcl stdc++ ascend_hal)
父主题： 基于AscendCL开发应用


创建应用工程

新建模板工程

  1. 进入工程创建页面。

    • MindStudio欢迎界面：左侧菜单选择“Project”，右侧单击“New Project”。
      图1 工程创建界面
    • MindStudio工程界面：在顶部菜单栏中选择“File > New > Project...”。

  2. 在“New Project”窗口中，选择“Ascend App”，选择工程类型，如图2，单击“Next”进入工程配置。（若工程类型名称显示不全，鼠标悬停于工程类型名称处，则工程类型名称可以完整显示。）

    CANN Version：当前激活的CANN版本，可通过单击右侧“Change”进行变更，具体功能使用请参见切换/激活CANN包。

    为AscendCL空白工程，仅包括开发框架的工程，不含具体的代码逻辑。

    如未在MindStudio中配置CANN，部分应用工程可能无法正常显示。

    图2 AscendCL应用工程

  3. 进入工程配置栏，配置工程相关参数如表1所示。

    表1 工程参数说明

    参数

    说明

    Project name

    工程名称，自行配置。

    名称开头和结尾必须是数字或字母。只能包含字母、数字、中划线和下划线，且长度不超过64个字符。

    Project location

    工程默认保存路径，用户可自定义。（对于首次使用MindStudio的用户，该项默认为“$HOME/MindstudioProjects”。）

    More Settings

    “Module name”：模块名，默认与“Project name”一致。

    “Content root”：根目录下路径。

    “Module file location”：模块文件路径。
    单击“Project format”右侧选框，出现下拉菜单。
    • .idea（directory-based）：创建项目的时候创建一个.idea项来保存项目的信息，默认选项。
    • .ipr（file-based）：项目配置文件来保存项目的配置信息。

  4. 单击Create，完成工程创建。成功创建工程后，工程目录的主要结构如下，请以实际获取为准。

    • AscendCL Project(C++)：
      ├── 工程名
│   ├── build
│   │    ├──cmake             //存放cmake依赖文件。
│   ├── out                    //存放编译出的可执行文件。
│   ├── src
│   │    ├── CMakeLists.txt   //编译脚本。
│   │    ├── main.cpp         //主函数的实现文件，当前主函数内无代码逻辑。
│   ├── CMakeLists.txt         //编译脚本，调用src目录下的CMakeLists文件。
    • AscendCL Project(Python)：无代码目录。

导入应用工程

  1. 导入工程文件，可通过选择以下任意一种方式完成。

    • MindStudio欢迎界面：单击“Open”，选择需要导入的工程，单击“OK”确认导入。
    • MindStudio工程界面：在顶部菜单栏中选择“File > Open...”或单击工具栏中的 [image] ，选择现有工程打开。

      如该工程存在代码风险，在打开时会弹出信任窗口。

      • 如该工程源码可被信任且安全，请单击“Trust Project”。（可通过勾选“Trust project in <工作区目录>”复选框信任该目录下的所有工程。）
      • 如该工程不被信任，仅用于查看其中源码，请单击“Preview in Safe Mode”进入安全模式预览。
      • 如放弃打开该工程，请单击“Don't Open”取消工程导入操作。

  2. 若工作窗口已打开其他工程，会出现确认提示。

    • 选择“This Window”，则直接在当前工作窗口打开新创建的工程。
    • 选择“New Window”，则新建一个工作窗口打开新创建的工程。

  3. 成功导入工程后，工程目录以树状呈现，请以实际创建结果为准。

新建样例工程

  1. 进入工程创建页面。

    • MindStudio欢迎界面：单击“New Project”。
    • MindStudio工程界面：在顶部菜单栏中选择“File > New > Project...”。

  2. 在“New Project”窗口中，选择“Ascend App”，选择工程类型，如图3。（若工程类型名称显示不全，鼠标悬停于工程类型名称处，则工程类型名称可以完整显示。）

    图3 AscendCL Samples样例工程

    CANN Version：当前激活的CANN版本，可通过单击右侧“Change”进行变更，具体功能使用请参见切换/激活CANN包。

    C++ Samples和AscendCL Python Samples为基于AscendCL开发的样例工程。

    如未在MindStudio中配置CANN，部分应用工程可能无法正常显示。

  3. 单击“Next”，浏览器会跳转至对应的Gitee代码仓界面。
  4. 在Gitee代码仓页面下单击“克隆/下载 > 复制”，复制代码包下载链接。
  5. 在开发环境执行命令：git clone URL（其中URL为复制的代码包下载链接），直接将代码包克隆到开发环境。

    git clone https://gitee.com/ascend/samples.git

  6. 在下载的文件夹中选择需要的样例，然后直接通过MindStudio导入，详情请参见导入应用工程。
父主题： 基于AscendCL开发应用


准备模型文件和数据

根据实际应用的场景，添加用于推理的模型文件和图片数据集。

  1. 转换模型。

    在添加模型文件前，您需要先参见模型转换和调优将第三方模型转换为适配对应 AI处理器的离线模型（*.om文件）。

  2. 添加模型文件。

    请用户自行将准备好的模型om文件上传到创建的工程中。

  3. （可选）如果需要使用dump功能：

    1. 准备xxx.json（例如acl.json）配置文件。

      请参见准备离线模型dump数据准备。

    2. 通过以下任意一种方式将配置文件作为输入参数完成dump配置。
      • 在aclInit接口（acl.init接口）中将配置文件作为输入参数完成dump配置。
      • 在aclInit接口（acl.init接口）之后、模型加载接口之前调用aclmdlSetDump接口（acl.mdl.set_dump接口）。

      具体请参见相应语言的《应用开发指南》的“AscendCL API参考”章节。

    当前仅支持本地dump configuration配置，若需远端dump，需用户自行配置acl.json。

  4. 准备推理数据。

    准备推理所用数据，并上传到应用工程文件目录下。

父主题： 基于AscendCL开发应用


添加自定义动态链接库（可选）

用户应用中经常需要使用其他第三方动态链接库（例如使用OpenCV对YOLOv3的推理结果进行后处理）。在开发环境与运行环境部署在不同的机器的场景下，若用户仅能通过MindStudio使用运行环境，则远程运行会由于无法找到对应动态链接库而失败。为解决这一问题，在MindStudio的应用开发中增加对用户自定义动态链接库的支持，提高用户开发效率。

用户添加自定义动态链接库的步骤参考如下：

  1. 完成动态链接库的交叉编译。

    具体交叉编译步骤请参见使用的动态链接库的对应文档，需要注意交叉编译器应与运行环境系统架构相对应。

  2. 新建存放动态链接库的目录，将交叉编译出的动态链接库拷贝或软链接至该目录下，目录名称可由用户自定义（如图1中lib目录下的libcustom.so）。

    图1 存放动态链接库的目录

    新建的存放动态链接库的目录，需要在应用工程运行参数配置（编译与运行应用工程）时进行环境变量的配置。环境变量的配置是以可执行文件main所在位置“工程名/out/main”为基准，即截图中配置的../mylib位置，mylib为存放动态链接库的目录名称，文件夹位置在工程名目录下。有以下两种方式配置：

    • 在Environment Variables处直接输入，如图图2。
    图2 动态链接库目录
    • 单击 [image] 后在出的弹窗内单击 [image] ，填写。
    图3 环境变量填写

父主题： 基于AscendCL开发应用


开发应用

创建时

请参见《应用开发指南》进行应用开发。

创建AscendCL ResNet-50样例工程时

  • 创建应用工程后，工程的src目录下自带应用的模板代码，包含系统初始化、模型执行、模型卸载、资源销毁等代码，若想直接使用src目录下的*.cpp模板代码，则只需按照模型文件和图片的名称、所在的路径修改sample_process.cpp中的如下代码，此处只能设置相对路径，不能设置绝对路径。
    • 请根据实际情况，修改图片文件的名称以及路径（以C++工程为例）。
      //此处的..表示相对路径，相对可执行文件所在的目录
//例如，编译出来的可执行文件存放在out目录下，此处的..就表示out目录的上一级目录
string testFile[] = {
        "../data/dog1_1024_683.bin",
        "../data/dog2_1024_683.bin"
    };
    • 请根据实际情况，修改*.om模型文件的名称（以C/C++工程为例）。
      //此处的..表示相对路径，相对可执行文件所在的目录
//例如，编译出来的可执行文件存放在out目录下，此处的..就表示out目录的上一级目录
const char* omModelPath = "../model/resnet50.om";

    在模板代码中，“接口名称以acl开头”的接口是系统对用户开放的接口，关于接口的详细说明，请参见《应用开发指南》。

  • 创建应用工程后，若不想使用工程中的模板代码，您可以查看《应用开发指南》开发应用。
父主题： 基于AscendCL开发应用


编译与运行应用工程

  • Linux场景编译运行
父主题： 基于AscendCL开发应用


Linux场景编译运行

编译应用工程

  • 若新建的工程为Python版本的应用工程，由于不需要执行“编译应用工程”，在MindStudio工程界面中“Build”功能不可用。
  • 远端编译时，会对工程文件夹进行目录拷贝到远端连接的环境，工程文件夹中“dump”、“model”、“profiling”目录不会被拷贝。
  • 编译前，用户需确认工程目录下“set_env.cmake”文件的环境变量，替换其中的CANN软件包安装路径。
  1. （可选）修改工程目录下的“src/CMakeLists.txt”文件。

    • include_directories：添加头文件所在的目录。

      示例如下：

      include_directories(
directoryPath1
directoryPath2
)
    • link_directories：添加库文件所在的目录。

      示例如下：

      link_directories(
directoryPath3
directoryPath4
)
    • add_executable：添加*.cpp文件所在的目录。

      示例如下：

      add_executable(
main
directoryPath5
directoryPath6
)
    • target_link_libraries：添加编译应用依赖的库文件。

      示例如下：

      target_link_libraries(
main
ascendcl
libName1
libName2)
    • install：选择编译产物main安装到指定路径。

      示例如下：

      install(TARGETS main DESTINATION ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})

    关于cmake参数的详细介绍，请参见https://cmake.org/cmake/help/latest/guide/tutorial/index.html，选择对应版本后查看参数。

  2. （可选）指定“CMakeLists.txt”编译配置文件。

    在工程界面左侧目录找到“CMakeLists.txt”文件，右键弹出并单击如图1所示“Load CMake Project”，即可指定此配置文件进行工程编译。

    图1 右键指定CMakeLists.txt编译配置文件

  3. 编译配置。

    在MindStudio工程界面，顶部菜单栏单击“Build > Edit Configuration...”，进入编译配置页面。
    1. 配置编译参数，单击 [image] 添加新增配置。

      列表中带有“(default)”标记的配置项为当前默认配置项，如需进行变更，可选中所需配置项，并单击 [image] 进行切换。

      表1 编译配置参数说明

      参数配置

      参数说明

      Name

      编译配置的名称。

      Build Type

      配置类型，可选：“Debug”或“Release”。

      Toolchain

      工具链配置器，配置详情请参见Toolchains，支持本地和远程编译功能。

      CMake options

      CMake选项，默认：“-DCMAKE_BUILD_TYPE=Debug -DCMAKE_SKIP_RPATH=TRUE”。

      Build directory

      编译目录相对路径，该路径是相对于工程目录的路径。

      Build options

      编译加速选项。

      Environment Variables

      环境变量配置。

      可直接手动配置或单击 [image] 符号，在弹出窗中配置管理。

      Environment from path

      输入路径或单击右侧 [image] ，选择环境变量配置文件。配置文件以单行<变量名>=<变量值>方式填写，保存为文件，如：

      APATH=/usr/local/xxx
X_PATH=/xxx/xxx
    2. 单击“Save”“OK”保存编译工程。

  4. 请用户在MindStudio工程界面，按照使用场景选择以下编译方式。

    • 依次选择“Build > Clean CMake Project”，清理编译。（Clean CMake Project功能仅支持本地编译。）
    • 依次选择“Build > Rebuild CMake Project”，使用默认配置进行全量编译。
    • 依次选择“Build > Build CMake Project”或通过单击工具栏中的 [image] ，使用默认配置进行增量编译。

    提示“Build finished”，则表示编译完成。

运行应用工程（本地）

  1. 在MindStudio工程界面，顶部菜单栏中单击“Run > Edit Configurations...”，进入运行配置页面。
  2. 单击左上角的“+”，选择“CMake Application”工程运行配置项，配置应用工程运行参数，图2为配置示例。配置完成后，单击“Apply”保存运行配置，单击“OK”，关闭运行配置窗口。

    图2 运行参数配置
    表2 运行配置项

    配置项

    说明

    Executable

    选择编译用可执行文件的路径，选择到文件一级。

    Program arguments

    运行参数。

    Working directory

    工作目录。（如工程中配置了相对路径，则需在该选项中选择相对的工作目录。默认为可执行文件所在目录。）

    Enviroment variables

    此处直接输入动态链接库路径。

    或者单击 [image] ，在弹出的界面内单击 [image] ，填写路径。

    Environment from path

    输入路径或单击右侧 [image] ，选择环境变量配置文件。配置文件以单行<变量名>=<变量值>方式填写，保存为文件，如：

    APATH=/usr/local/xxx
X_PATH=/xxx/xxx

  3. 在MindStudio工程界面，顶部菜单栏中单击“Run > Run...”。

    在弹出框中选择已创建好的运行配置信息，运行应用。

    • 如果在运行过程中无错误提示，且提示“Running *** finished”，则表示运行结束。
    • 如果运行过程中有错误提示，且需要查看运行环境的详细日志时，请参见《CANN 6.3.RC2 日志参考》或《CANN 6.2.RC2 日志参考》：
      • 可参见“日志文件介绍”查看日志，日志文件路径默认为“/home/mdc/var/log ”。
      • 可参见“设置日志级别”查看或修改日志级别（默认为ERROR）。

运行应用工程（远端）

  • 远端运行时，会对工程文件夹进行目录拷贝到远端连接的环境，工程文件夹中“dump”、“profiling”目录不会被拷贝。
  • 对于Python工程，需添加“SSH Interpreter”解析器并在运行配置中，选择远端环境解析器即可远端运行，具体功能配置请参见Python SDK设置。
  1. 配置远端Toolchain。

    1. 在MindStudio工程界面，顶部菜单栏中单击“Build > Edit Configuration...”，进入编译配置页面。
    2. 如图3所示，在“Toolchain”功能栏选择右侧“Manage toolchains...”，进入Toolchain功能配置。
      图3 选择Manage toolchains
    3. 配置远端环境Toolchain，具体操作请参见远程编译配置。
    4. 在“Build Configuration”中选择配置完成的远端Toolchain，单击“OK”保存，单击工具栏中debug图标 [image] 即可启动调试功能，具体调试功能请参考调试执行）。

  2. 在左侧工程目录中，右键单击工程根目录，选择“Deployment > Upload to...”，选择并上传至目标远端环境。
  3. 在MindStudio工程界面，顶部菜单栏中单击“Run > Edit Configurations...”，进入运行配置页面。
  4. 单击左上角 [image] 按钮，新建“CMake Application”运行配置项并在“Executable”功能中选择远端可执行文件，点击“OK”完成配置。
  5. 在MindStudio工程界面，顶部菜单栏中单击“Run > Run...”。

    在弹出框中选择已创建好的运行配置信息，运行应用。

父主题： 编译与运行应用工程


AscendCL样例工程使用指导

MindStudio提供基于AscendCL开发的样例工程，用户可以参考以下步骤创建样例工程。

图1 AscendCL样例工程创建流程

各步骤说明如下：

  1. 环境准备：请参照开发前须知配置环境变量。
  2. 数据准备：请自行准备模型需要使用的数据集，如图片检测模型需要使用的图片。
  3. 样例工程代码获取与导入：请参考新建样例工程从Gitee上获取所需的AscendCL样例工程，并参考导入应用工程导入到MindStudio。
  4. 获取模型：参考Gitee上样例工程的readme获取需要的模型并上传到环境中。更多模型可以参考ModelZoo。
  5. 模型转换：请参考模型转换和调优将模型转换为om文件。
  6. 应用编译与运行：请参考编译与运行应用工程对应用进行编译和运行。
父主题： 基于AscendCL开发应用


算子开发

  • 简介
  • 算子开发依赖
  • 开发流程
  • 算子分析
  • 创建算子工程
  • 算子开发过程
  • UT测试
  • 算子工程编译
  • 算子部署
  • PyTorch适配
  • ST测试
  • 其他功能及操作
  • 参考
父主题： 操作指南


简介

介绍如何使用MindStudio工具实现不同框架的算子开发。

本章节主要介绍MindStudio工具操作部分，对代码实现部分仅做基本介绍，如需了解更多代码开发技巧，请参见对应《CANN 6.3.RC2 TBE&AI CPU算子开发指南》或《CANN 6.2.RC2 TBE&AI CPU算子开发指南》。

配置完成Ascend-cann-toolkit开发套件包后，可从/tools/msopgen/template/operator_demo_projects/获取算子开发样例。样例请参见导入算子工程样例。

/opp/built-in/op_impl/ai_core/tbe/impl目录下为对应 AI处理器支持的内置AI Core算子的实现文件，开发者在进行算子代码实现时可进行参考。

算子ST代码适配

当前版本的MDC上的AscendCL C++应用需用户手动实现创建、绑定内存分组，首次安装MindStudio及MDC_SDK软件包后，需对Ascend-cann-toolkit内置的算子ST推理工程进行修改，随后用户创建的算子工程，即可正常使用算子ST功能。

ST功能仅在Development版本提供。

算子ST推理工程位于Ascend-cann-toolkit软件包安装路径下，具体为“./Ascend/ascend-toolkit/5.0.mdc610/x86_64-linux/python/site-packages/op_test_frame/st/template/acl_op_src”，需对src/main.cpp以及src/CMakeLists.txt进行修改。

对于main.cpp，需添加创建、绑定内存分组相关代码：

#include "op_test.h"
#include "acl/acl.h"
#include "common.h"
// 添加头文件
#include <dirent.h>
#include <cstring>
#include <unistd.h>
#include "ascend_hal.h"
//

// 添加PID获取函数
void GetTsDaemonPid(int *pid)
{
    const char* taskName = "tsdaemon";
    const int bufSize = 50;
    struct dirent *ptr;
    FILE *fp;
    char filePath[50];
    char curTaskName[50];
    char buf[bufSize];

    DIR *dir;
    dir = opendir("/proc");
    if (NULL != dir)
    {
        while ((ptr = readdir(dir)) != NULL)
        {
            if ((strcmp(ptr->d_name, ".") == 0) || (strcmp(ptr->d_name, "..") == 0))
                continue;
            if (DT_DIR != ptr->d_type)
                continue;
            sprintf(filePath, "/proc/%s/status", ptr->d_name);
            fp = fopen(filePath, "r");
            if (NULL != fp)
            {
                if(fgets(buf, bufSize-1, fp)== NULL ){
                    fclose(fp);
                    continue;
                }
                sscanf(buf, "%*s %s", curTaskName);
                if (!strcmp(taskName, curTaskName)){
                    sscanf(ptr->d_name, "%d", pid);
                }
                fclose(fp);
            }
        }
        closedir(dir);
    }
}

// 添加内存分组创建、绑定函数
int HalInit()
{
    int tsdaemonPid = 0;
    GetTsDaemonPid(&tsdaemonPid);
    INFO_LOG("tsdaemon pid: %d", tsdaemonPid);

    const int procPid = getpid();
    std::string buffGrpName = "ACL_DEFGRP_" + std::to_string(procPid);

    GroupCfg grpcfg = {0};
    grpcfg.maxMemSize = 1024 * 1024 * 32;
    int ret = halGrpCreate(buffGrpName.c_str(), &grpcfg);
    if (ret != DRV_ERROR_NONE) {
        ERROR_LOG("hal group create failed");
        return ret;
    }

    GroupShareAttr Mattr = {0};
    Mattr.admin = 1;
    Mattr.alloc = 0;
    Mattr.write = 1;
    Mattr.read = 1;
    ret = halGrpAddProc(buffGrpName.c_str(), tsdaemonPid, Mattr);
    if (ret != DRV_ERROR_NONE) {
        ERROR_LOG("hal group add tsdaemon failed");
        return ret;
    }

    Mattr.alloc = 1;
    ret = halGrpAddProc(buffGrpName.c_str(), procPid, Mattr);
    if (ret != DRV_ERROR_NONE) {
        ERROR_LOG("hal group add proc failed");
        return ret;
    }

    ret = halGrpAttach(buffGrpName.c_str(), 2000);
    if (ret != DRV_ERROR_NONE) {
        ERROR_LOG("hal group attach failed");
        return ret;
    }

    BuffCfg buffcfg = {0};
    ret = halBuffInit(&buffcfg);
    if (ret != DRV_ERROR_NONE) {
        ERROR_LOG("hal buff init failed");
        return ret;
    }
    return DRV_ERROR_NONE;
}

int main()
{
    // 主函数添加内存初始化调用
    int halInitRet = HalInit();
    if (halInitRet != DRV_ERROR_NONE) {
        ERROR_LOG("hal buff init failed, error code: 0x%x", halInitRet);
        return halInitRet;
    }
       //

    int ret =  OpTest::UnitTest::GetInstance().Run();
    if (aclrtDestroyStream(g_stream) != ACL_SUCCESS) {
        ERROR_LOG("aclrtDestroyStream failed.");
    }
    if (aclFinalize() != ACL_SUCCESS) {
        ERROR_LOG("aclFinalize failed.");
    }
return ret;
}

此外，还需在src/CMakeLists.txt中添加MDC_SDK中ascend_hal相应头文件及链接库路径：

# Header path
include_directories(
    ${INC_PATH}/${RUNTIME_NAME}/include/
../inc/
/usr/local/mdc_sdk/dp_gea/mdc_cross_compiler/sysroot/usr/include/driver
)
link_directories(
    #${LIB_PATH}
/usr/local/mdc_sdk/dp_gea/mdc_cross_compiler/sysroot/usr/local/Ascend/runtime/lib64/stub
)
target_link_libraries(main
            ascendcl stdc++ ascend_hal)
父主题： 算子开发


算子开发依赖

算子开发前，须确保MindStudio运行的Python环境安装以下依赖。

如下命令如果使用非root用户安装，需要在安装命令后加上--user，例如：pip3 install xlrd==1.2.0 --user。
表1 算子开发MindStudio需要的Python依赖

依赖包

版本要求

应用场景

参考安装方法（以python3在X86架构为例）

xlrd

1.2.0

创建算子工程

pip3 install xlrd==1.2.0

gnureadline

-

TIK开发

pip3 install gnureadline

mindspore

-

MindSpore算子开发

安装方式参考MindSpore安装指南。

absl-py

-

UT测试

pip3 install absl-py

coverage

-

pip3 install coverage

jinja2

3.1.2

pip3 install jinja2

onnx

-

ST测试

pip3 install onnx

tensorflow

1.15.0

pip3 install tensorflow==1.15.0

csv

-

pip3 install python-csv

google

-

pip3 install google

aarch64架构的操作系统，安装依赖时可能会安装失败。请使用源码编译安装或者参考对应依赖的官方安装指导操作。

父主题： 算子开发


开发流程

  • TBE算子开发流程
父主题： 算子开发


TBE算子开发流程

通过MindStudio工具进行TBE算子开发的总体开发流程如下：

  • TensorFlow/ONNX/Caffe TBE算子开发流程如图1所示。
  • MindSpore TBE算子开发流程如图2所示。
图1 TensorFlow/ONNX/Caffe TBE算子开发流程
图2 MindSpore TBE算子开发流程
  1. 算子分析：确定算子功能、输入、输出、算子开发方式、算子OpType以及算子实现函数名称等。
  2. 创建算子工程：通过MindStudio创建TBE算子工程，创建完成后，会自动生成算子工程目录及相应的文件模板，开发者可以基于这些模板进行算子开发。
  3. 算子开发：MindSpore框架的算子实现和注册信息文件以及算子原型定义具体实现方式请参考《MindSpore教程》的“自定义算子”。
    • 算子代码实现：描述算子的实现过程。
    • 算子原型定义：算子原型定义规定了在对应 AI处理器上可运行算子的约束，主要包含定义算子输入、输出、属性和取值范围，基本参数的校验和shape的推导，原型定义的信息会被注册到GE的算子原型库中。网络运行时，GE会调用算子原型库的校验接口进行基本参数的校验，校验通过后，会根据原型库中的推导函数推导每个节点的输出shape与dtype，进行输出tensor的静态内存的分配。
    • 算子信息库定义：算子信息配置文件用于将算子的相关信息注册到算子信息库中，包括算子的输入输出dtype、format以及输入shape信息。网络运行时，FE会根据算子信息库中的算子信息做基本校验，判断是否需要为算子插入合适的转换节点，并根据算子信息库中信息找到对应的算子实现文件进行编译，生成算子二进制文件进行执行。
    • 算子适配插件实现：基于第三方框架（TensorFlow/ONNX/Caffe）进行自定义算子开发的场景，开发人员完成自定义算子的实现代码后，需要进行插件的开发将基于第三方框架的算子映射成适配对应 AI处理器的算子，将算子信息注册到GE中。基于第三方框架的网络运行时，首先会加载并调用GE中的插件信息，将第三方框架网络中的算子进行解析并映射成对应 AI处理器中的算子。
  4. UT测试：即单元测试（Unit Test），仿真环境下验证算子实现的功能正确性，包括算子逻辑实现代码及算子原型定义实现代码。
  5. 算子编译：将算子插件实现文件编译成算子插件，算子原型定义文件编译成算子原型库，算子信息定义文件编译成算子信息库。
  6. 算子部署：将算子实现文件、编译后的算子插件、算子原型库和算子信息库部署到对应 AI处理器算子库，为后续算子在网络中运行构造必要条件。
  7. ST测试：即系统测试（System Test），可以自动生成测试用例，在真实的硬件环境中验证算子实现代码的功能正确性。
父主题： 开发流程


算子分析

简介

本节以Add TBE算子为例进行算子分析，帮助读者快速掌握算子分析流程。

TBE算子分析

使用TBE DSL方式开发Add算子前，我们需要确定算子功能、输入、输出、算子开发方式、算子类型以及算子实现函数名称等。

  1. 明确算子的功能以及数学表达式。

    Add算子的数学表达式为：

     z=x+y

    计算过程：将两个输入参数相加，得到最终结果z并将其返回。

  2. 明确输入和输出。

    • Add算子有两个输入：x与y，输出为z。
    • 本样例中算子的输入支持的数据类型为float16、float32、int32，算子输出的数据类型与输入数据类型相同。
    • 算子输入支持所有shape，输出shape与输入shape相同。
    • 算子输入支持的format为：NCHW,NC1HWC0,NHWC,ND。

  3. 确定算子开发方式及使用的计算接口。

    1. 计算过程只涉及加法操作，初步分析可使用tbe.dsl.vadd(lhs, rhs)接口实现x+y，请参考《CANN 6.3.RC2 TBE&AI CPU算子开发指南》或《CANN 6.2.RC2 TBE&AI CPU算子开发指南》中的“算子开发过程 > 算子代码实现（TBE DSL）”章节。
    2. 由于tbe.dsl.vadd(lhs, rhs)接口要求两个输入tensor的shape需要相同，所以需要首先获取两个输入tensor中较大的shape值，然后调用tbe.dsl.broadcast(var, shape, output_dtype=None)接口将入参广播成指定的shape大小。

  4. 明确算子实现文件名称、算子实现函数名称以及算子的类型（OpType）。

    算子命名规则如下：

    • 算子类型需要采用大驼峰的命名方式，即采用大写字符区分不同的语义。
    • 算子文件名称和算子函数名称，可选用以下任意一种命名规则：
      • 用户自定义，此时需要在算子信息库定义中配置opFile.value与opInterface.value。
      • 不配置算子信息库定义中opFile.value与opInterface.value，FE会将OpType按照如下方式进行转换后进行算子文件名和算子函数名的匹配。
        • 首字符的大写字符转换为小写字符。

          例如：Abc -> abc

        • 小写字符后的大写字符转换为下划线+小写字符。

          例如：AbcDef -> abc_def

        • 紧跟数字以及大写字符后的大写字符，作为同一语义字符串，查找此字符串后的第一个小写字符，并将此小写字符的前一个大写字符转换为下划线+小写字符，其余大写字符转换为小写字符。若此字符串后不存在小写字符，则直接将此字符串中的大写字符转换为小写字符。

          例如：ABCDef -> abc_def；Abc2DEf -> abc2d_ef；Abc2DEF -> abc2def；ABC2dEF -> abc2d_ef。

    因此本例中，算子类型定义为Add；算子的实现文件名称及实现函数名称将首字母转换小写字符，定义为add。

  5. 通过以上分析，得到Add算子的设计规格如下：

    表1 Add算子设计规格

    算子类型（OpType）

    Add

    算子输入

    name：x1

    shape：all

    data type：

    float16、float32、 int32

    format：

    NCHW,NC1HWC0,NHWC,ND

    name：x2

    shape：all

    data type：

    float16、float32、 int32

    format：

    NCHW,NC1HWC0,NHWC,ND

    算子输出

    name：y

    shape：all

    data type：

    float16、float32、 int32

    format：

    NCHW,NC1HWC0,NHWC,ND

    算子实现使用的主要DSL接口

    tbe.dsl.broadcast(var, shape, output_dtype=None)

    tbe.dsl.vadd(lhs, rhs)

    算子实现文件/实现函数名称

    add

父主题： 算子开发


创建算子工程

简介

本节介绍如何通过MindStudio工具创建算子工程，创建完之后工具会自动生成算子工程目录及相应的文件模板，开发者可以基于这些模板进行算子开发。

配置Python SDK

算子开发之前，开发者需要参考Python SDK设置章节设置算子工程依赖Python库。

操作步骤

  1. 进入算子工程创建界面。

    • MindStudio欢迎界面：单击“New Project”，进入创建工程界面。
    • MindStudio工程界面：
      • 在非算子工程中新建算子工程：在顶部菜单栏中选择“File > New > Project...”，进入创建工程界面。
      • 在算子工程中新建算子工程：在顶部工具栏中单击 [image] ，进入新建算子工程界面。
    图1 创建工程界面
    图2 新建算子工程界面

  2. 创建算子工程。

    1. 在左侧导航栏选择“Ascend Operator”，在右侧配置算子信息，配置示例如表1所示。
      表1 算子信息配置

      参数

      参数说明

      示例

      CANN Version

      当前激活的CANN版本，可通过单击右侧“Change”进行变更，具体功能使用请参见切换/激活CANN包。

      选择当前CANN的版本号

      New Operator（算子创建方式）

      Sample Template

      表示基于样例创建算子工程。

      选择此选项，下方显示AICPU、DSL、TIK三种算子实现方式。每种实现方式按照AI框架分类提供了算子样例，供用户选择。用户可以选择一个实现方式下的一个AI框架中的一个或多个算子创建算子工程。

      • AICPU：AI CPU算子样例。
      • DSL：基于DSL方式实现的TBE算子样例。
      • TIK：基于TIK方式实现的TBE算子样例。

      四选一，当前默认选择“Sample Template”。

      Empty Template

      表示创建空的算子工程。

      选择此选项，下方会显示“Operator Type”配置项，请在此处输入需要创建的算子的类型，请根据算子分析进行配置。

      IR Template

      表示基于IR定义模板创建算子工程。IR定义模板文件有json和Excel两种格式。

      选择此选项，下方会显示“Template File”配置项，用户需要选择IR原型定义文件。

      须知：
      • Ascend_IR_Template.json

        请从/python/site-packages/op_gen/json_template目录下获取IR定义的json模板。

      • Ascend_IR_Template.xlsx

        请从/tools/msopgen/template目录下获取IR定义Excel模板。

        请在模板文件中的“Op”页签修改自定义算子的IR定义。

      IR定义的配置请参见IR定义配置说明。

      Tensorflow Template

      表示基于Tensorflow原型定义创建算子工程。

      选择此方式创建算子工程，请先在安装MindStudio的服务器中下载Tensorflow源码。选择此选项后，下方会出现详细配置栏。

      • Operator Path：请选择Tensorflow源码所在目录，为提升搜索效率，建议选择到tensorflow/core/ops目录。
      • Operator Type：请配置为需要创建算子的Op Type。

      Plugin Framework

      算子所在模型文件的框架类型。选择“Sample Template”创建算子工程时不显示此配置项。

      • PyTorch
      • TensorFlow
      • Caffe
      • ONNX

      Caffe不支持Tensorflow Template创建算子工程。

      MindSpore

      Compute Unit
      有以下两种选项，选择“Sample Template”创建算子工程时不显示此配置项。
      • AI Core/Vector Core：算子运行在AI Core或者Vector Core上，代表TBE算子。
      • AI CPU：算子运行在AI CPU上，代表AI CPU算子。

      AI Core/Vector Core

      Unit Type

      请根据实际对应 AI处理器版本下拉选择算子计算单元。

      • 当“Compute Unit”选择“AI Core/Vector Core”时显示此配置项。
      • 当选择“Sample Template”创建算子工程时不显示此配置项。
      • “Plugin Framework”选择“MindSpore”时不显示此配置项。

      选择当前对应 AI处理器的版本
    2. 单击“Next”，在弹出的页面中配置算子工程信息，如表2所示。
      表2 工程信息配置

      参数

      参数说明

      示例

      Project name

      工程名称，用户自行配置。

      名称开头和结尾必须是数字或字母，只能包含字母、数字、中划线和下划线，且长度不超过64个字符。

      untitled

      Project location

      工程默认保存路径，用户可自定义。（对于首次使用MindStudio的用户，该项默认为“$HOME/MindstudioProjects”。）

      保持默认

      More Settings

      “Module name”：模块名，默认与“Project name”一致。

      保持默认

      “Content root”：根目录下路径。

      “Module file location”：模块文件路径。
      单击“Project format”右侧选框，出现下拉菜单。
      • .idea（directory-based）：创建项目的时候创建一个.idea项来保存项目的信息，默认选项。
      • .ipr（file-based）：项目配置文件来保存项目的配置信息。
    3. 单击“Create”，完成算子工程的创建。

      若工作窗口已打开其他工程，会出现确认提示。

      • 选择“This Window”，则直接在当前工作窗口打开新创建的工程。
      • 选择“New Window”，则新建一个工作窗口打开新创建的工程。
      • 若开发者需要自定义多个算子，需要在同一算子工程中进行实现和编译。可选中算子工程根目录，右键选择“New > Operator”增加算子。
      • 同一算子工程中，暂时不支持AI CPU算子和TBE算子同名。
      • 参考步骤1在已有的MindSpore AI CPU算子工程中快捷新建算子工程时，仅支持新建MindSpore框架的AI CPU算子工程。
      • 目前Windows版本中，新建算子工程的代码中可能会出现无法识别的语义被红色波浪线标出，但不影响正常开发流程，用户可忽略该提示。
      • 目前Windows版本中，支持实现算子原型文件和AI CPU算子代码实现的C++代码跳转功能。需要用户手动配置系统环境变量。

        变量名为ASCEND_OPP_PATH，变量值为C:\Users\用户名\.mindstudio\huawei\adk\remote\CANN包版本号\opp，请以实际用户名和CANN包版本号修改变量值。

      • 若使用远程进行算子开发，支持自动同步文件功能。
      • 基于“Sample Template”中非MindSpore框架的样例创建算子工程时，若算子计算单元为Atlas 推理系列产品（Ascend 310P处理器）或Atlas A2 训练系列产品系列的算子计算单元，在op_info_cfg算子信息库文件目录下仅生成“ascendxxx”目录。
      • 基于“Empty Template”、“IR Template”和“Tensorflow Template”方式创建算子工程时，将根据已选择“Unit Type”的算子计算单元在op_info_cfg算子信息库文件目录下生成对应目录，例如“ascend310p”。

  3. 查看算子工程目录结构和主要文件。

    框架为TensorFlow、PyTorch、ONNX、Caffe时的工程目录结构和主要文件。
    ├── .idea
├── build                                  //编译生成的中间文件
├── cmake                                  //编译相关公共文件存放目录
├── cpukernel                              //AI CPU算子文件目录，TensorFlow TBE算子和PyTorch算子工程不会创建此目录
│   ├── impl                              //算子实现文件目录
│   │   ├── reshape_cust_kernel.cc       //算子源文件
│   │   ├── reshape_cust_kernel.h        //算子头文件
│   ├── op_info_cfg                       //算子信息库文件目录
│   │   ├── aicpu_kernel
│   │   │   ├── reshape_cust.ini        //算子信息定义文件
│   ├── CMakeLists.txt                    //编译规则文件，会被算子工程根目录中的CMakeLists.txt文件调用
│   ├── toolchain.cmake
├── framework                              //算子插件实现文件目录
│   ├── tf_plugin                         //存放tensorflow框架的算子插件文件及编译规则文件，若“Plugin Framework”为“PyTorch”，不会创建此目录
│   │   ├── tensorflow_add_plugin.cc    //add为算子类型，TBE算子示例为add，AI CPU算子为reshape_cust
│   │   ├── CMakeLists.txt               //编译规则文件，会被上级目录中的CMakeLists.txt文件调用
│   ├── caffe_plugin                         //存放caffe框架的算子插件文件及编译规则文件，若“Plugin Framework”为“PyTorch”，不会创建此目录
│   │   ├── caffe_add_plugin.cc    //add为算子类型，TBE算子示例为add，AI CPU算子为reshape_cust
│   │   ├── CMakeLists.txt               //编译规则文件，会被上级目录中的CMakeLists.txt文件调用
│   └── onnx_plugin   //原始框架类型为ONNX时生成的算子适配插件代码所在目录
│       ├── CMakeLists.txt
│       └── xxx_plugin.cc/    /算子适配插件实现文件
│   ├── CMakeLists.txt                    //编译规则文件，会被算子工程根目录中的CMakeLists.txt文件调
├── op_proto                               //算子IR定义文件目录
│   ├── add.cc                           //add为算子类型，TBE算子示例为add，AI CPU算子为reshape_cust
│   ├── add.h                             //add为算子类型，TBE算子示例为add，AI CPU算子为reshape_cust
│   ├── CMakeLists.txt                    //编译规则文件，会被算子工程根目录的CMakeLists.txt文件调用
├── op_tiling  //算子tiling实现文件目录，不涉及tiling实现的算子无需关注
│   ├── CMakeLists.txt
├── scripts                                //工程相关脚本
├── tbe                                    //TBE算子文件目录，TensorFolw AI CPU算子工程不会创建此目录
│   ├── impl                              //算子实现文件目录
│   │   ├── add.py
│   ├── op_info_cfg                       //算子信息库文件目录
│   │   ├── ai_core
│   │   │   ├── {soc_version}
│   │   │   │   ├── add.ini
│   │   ├── vector_core
│   │   │   ├── {soc_version}
│   │   │   │   ├── add.ini
├── .project                                 //工程信息文件，包含工程类型、工程描述、运行目标设备类型以及CANN版本
├── Add_READEME.md                                 //介绍算子基本功能、基本信息和主要的算子工程
├── CMakeLists.txt
├── MyOperator.iml

    框架为MindSpore时的工程目录结构和主要文件。

    ├── .idea
├── build                                  //编译生成的中间文件
├── cmake                                  //编译相关公共文件存放目录
├── cpukernel                              //AI CPU算子文件目录 TBE算子工程不会创建此目录
│   ├── impl                              //算子实现文件目录
│   │   ├── cus_square_kernel.cc       //算子源文件
│   │   ├── cus_square_kernel.h        //算子头文件
│   ├── op_info_cfg                       //算子信息库文件目录
│   │   ├── aicpu_kernel
│   │   │   ├── cus_square.ini        //算子信息定义文件
│   ├── CMakeLists.txt                    //编译规则文件，会被算子工程根目录中的CMakeLists.txt文件调用
│   ├── toolchain.cmake
├── framework                              //算子插件实现文件目录
│   ├── mindspore
│   │   ├── impl                  //算子实现文件目录
│   │   │   ├── cus_square_impl.py      //实现算子和注册算子信息 py文件
│   ├── op_proto
│   │   ├── cus_square.py               //算子原语py文件
├── .project                   //工程信息文件，包含工程类型、工程描述、运行目标设备类型以及CANN版本
├── cus_square_READEME.md      //介绍算子基本功能、基本信息和主要的算子工程
├── MyOperator.iml

父主题： 算子开发


算子开发过程

  • 算子原型定义
  • 算子代码实现（TBE DSL）
  • 算子信息库定义
  • 算子适配插件实现
父主题： 算子开发


算子原型定义

简介

开发者进行算子原型定义开发时需要实现如下两个文件：
  • 在算子名称.h头文件中进行算子原型的注册。
  • 在算子名称.cc文件中进行校验函数与shape推导函数的实现。

本章节将以TBE算子开发样例工程中“Add”算子为例讲解算子原型定义的开发，供开发者参考。

进入“op_proto”目录，编写IR实现文件“add.h”和“add.cc”，将算子注册到算子原型库中。网络运行时，GE会调用算子原型库的校验接口进行基本参数的校验，校验通过后，会根据原型库中的推导函数推导每个节点的输出shape与dtype，进行输出tensor的静态内存的分配。

AI CPU算子原型定义的开发可参考算子开发样例工程中“reshape_cust”算子，IR实现文件为“reshape_cust.h”和“reshape_cust.cc”。

add.h实现

MindStudio已在add.h头文件中生成了算子注册的代码模板文件，开发者可根据需要进行修改，Add算子的原型定义如下所示：

#ifndef GE_OPS_OP_PROTO_ADD_H_       //条件编译
#define GE_OPS_OP_PROTO_ADD_H_       //进行宏定义
#include "graph/operator_reg.h"
namespace ge {
REG_OP(Add)     //算子类型名称
    .INPUT(x1,
        TensorType({DT_FLOAT, DT_INT32, DT_INT64, DT_FLOAT16, DT_INT16, DT_INT8, DT_UINT8, DT_DOUBLE, DT_COMPLEX128,
            DT_COMPLEX64, DT_STRING}))
    .INPUT(x2,
        TensorType({DT_FLOAT, DT_INT32, DT_INT64, DT_FLOAT16, DT_INT16, DT_INT8, DT_UINT8, DT_DOUBLE, DT_COMPLEX128,
            DT_COMPLEX64, DT_STRING}))
    .OUTPUT(y,
        TensorType({DT_FLOAT, DT_INT32, DT_INT64, DT_FLOAT16, DT_INT16, DT_INT8, DT_UINT8, DT_DOUBLE, DT_COMPLEX128,
            DT_COMPLEX64, DT_STRING}))
    .OP_END_FACTORY_REG(Add)
}

#endif //GE_OPS_OP_PROTO_ADD_H
  • REG_OP(Add)中的Add为算子注册到对应 AI处理器中的Type，第三方框架（TensorFlow/ONNX/Caffe）需要与算子适配插件实现中REGISTER_CUSTOM_OP("Add")中的算子类型保持一致。
  • .INPUT与.OUTPUT分别为算子的输入、输出Tensor的名称与数据类型，输入输出的顺序需要与算子代码实现（TBE DSL）函数形参顺序以及算子信息库定义中参数的顺序保持一致。

add.cc实现

开发者需要在add.cc中实现InferShape与Verify方法。

  • Verify函数，即如下代码示例中的IMPLEMT_VERIFIER(Add, AddVerify)函数，用于校验Add算子的两个输入的DataType是否一致。
  • InferShape函数，即如下代码示例中的IMPLEMT_COMMON_INFERFUNC(AddInferShape)函数，用于推导出算子的输出张量描述，这样在网络运行时就可以为所有的张量静态分配内存，避免动态内存分配带来的开销。
add.cc的实现代码如下所示：
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include "./add.h"         //IR注册头文件
#include <vector>        //可使用vector类模板并调用vector相关接口
#include <string>        //C++标准库，可使用string类构造对象并调用string相关接口

namespace ge {
bool InferShapeAndTypeAdd(Operator& op,
    const string& inputName1,
    const string& inputName2, const string& outputName)
 {
    TensorDesc vOutputDesc = op.GetOutputDescByName(outputName.c_str());

    DataType inputDtype = op.GetInputDescByName(inputName1.c_str()).GetDataType();
    Format inputFormat = op.GetInputDescByName(inputName1.c_str()).GetFormat();
    // 针对shape维度大小进行交换
    ge::Shape shapeX = op.GetInputDescByName(inputName1.c_str()).GetShape();
    ge::Shape shapeY = op.GetInputDescByName(inputName2.c_str()).GetShape();
    std::vector<int64_t> dimsX = shapeX.GetDims();
    std::vector<int64_t> dimsY = shapeY.GetDims();
    if (dimsX.size() < dimsY.size()) {
        std::vector<int64_t> dimsTmp = dimsX;
        dimsX = dimsY;
        dimsY = dimsTmp;
    }

  // 对小的shape进行1补齐
  if (dimsX.size() != dimsY.size()) {
    int dec = dimsX.size() - dimsY.size();
    for (int i = 0; i < dec; i++) {
      dimsY.insert(dimsY.begin(), (int64_t)1);
    }
  }

    // 设置输出的shape维度
    std::vector<int64_t> dimVec;
    for (size_t i = 0; i < dimsX.size(); i++) {
        if ((dimsX[i] != dimsY[i]) && (dimsX[i] != 1) && (dimsY[i] != 1)) {
            return false;
        }

        int64_t dims = dimsX[i] > dimsY[i] ? dimsX[i] : dimsY[i];
        dimVec.push_back(dims);
    }
    ge::Shape outputShape = ge::Shape(dimVec);

    vOutputDesc.SetShape(outputShape);
    vOutputDesc.SetDataType(inputDtype);
    vOutputDesc.SetFormat(inputFormat);
    op.UpdateOutputDesc(outputName.c_str(), vOutputDesc);

    return true;
}

//----------------Add-------------------
IMPLEMT_VERIFIER(Add, AddVerify)
{
    if (op.GetInputDescByName("x1").GetDataType() != op.GetInputDescByName("x2").GetDataType()) {
        return GRAPH_FAILED;
    }
    return GRAPH_SUCCESS;
}

// Obtains the processing function of the output tensor description.
IMPLEMT_COMMON_INFERFUNC(AddInferShape)
{
    if(InferShapeAndTypeAdd(op, "x1", "x2", "y")) {
        return GRAPH_SUCCESS;
    }
    return GRAPH_FAILED;
}

//Registered inferfunction，Infershape函数注册
COMMON_INFER_FUNC_REG(Add, AddInferShape);      //第一个参数为算子的OpType

//Registered verify function，Verify函数注册
VERIFY_FUNC_REG(Add, AddVerify);        //第一个参数为算子的OpType
//----------------Add-------------------
}
父主题： 算子开发过程


算子代码实现（TBE DSL）

简介

通过调用TBE DSL接口，在算子工程下的“tbe/impl/add.py”文件中进行Add算子的实现，包括算子函数定义、算子入参校验、compute过程实现及调度与编译。

代码模板介绍

MindStudio在“tbe/impl/add.py”中生成代码模板。
# 导入依赖的Python模块
import tbe.dsl as tbe
from tbe import tvm
from tbe.common.register import register_op_compute
from topi import generic

# 算子计算函数
@register_op_compute(("Add")
def add_compute(x, y, z, kernel_name="add"):
    """
    To do: Implement the operator by referring to the
           TBE Operator Development Guide.
    """

    res = tbe.XXX(x, y)
    return res

# 算子定义函数
def add(x, y, z, kernel_name="add"):
    """
    To do: Implement the operator by referring to the
           TBE Operator Development Guide.
    """
    # 输入参数占位
    data_x = tvm.placeholder(x.get("shape"), dtype=x.get("dtype"), name="data_x")
    data_y = tvm.placeholder(y.get("shape"), dtype=y.get("dtype"), name="data_y")

    # 调用算子计算函数
    res = add_compute(data_x, data_y, z, kernel_name)

    # 自动调度
    with tvm.target.cce():
        schedule = tbe.auto_schedule(res)

    # 编译
    config = {"name": kernel_name,
              "tensor_list": [data_x, data_y, res]}
    tbe.build(schedule, config)
  • 引入算子开发时依赖的Python模块。
    • “tbe.dsl”：引入TBE支持的特定域语言接口，包括常见的运算vmuls、vadds、matmul等。

      具体的接口定义可查看/compiler/python/site-packages/tbe/dsl目录下的Python函数。

    • “tbe.tvm”：引入TVM后端代码生成机制。

      具体的接口定义可查看/compiler/python/site-packages/tbe/tvm目录下的Python函数，使用方法请参见https://docs.tvm.ai/。

    • “tbe.common.register.register_op_compute”：提供了实现算子的UB自动融合的接口。

      具体的接口定义可查看/compiler/python/site-packages/tbe/common/register/register_api.py文件中的register_op_compute函数的定义。

  • 模板生成以算子名称_compute命名的计算函数声明。
    • 若创建算子工程时选择的“Sample Template”或者“Tensorflow Template”，输入输出参数及属性会根据原型定义自动生成。
    • 若创建算子工程时选择“Empty Template”，默认生成的参数为一个输入与一个输出，不带属性。
  • 模板生成以算子名称命名的定义函数的声明与部分实现，模板中提供的实现函数中的示例代码包含如下功能：
    • 获取输入tensor的shape与dtype。
    • 对输入参数进行校验。
    • 对输入tensor进行占位。
    • 调用算子的compute函数进行计算、调度与编译。

算子定义函数实现

开发者需要根据MindStudio生成的模板代码进行算子计算函数的实现，同时需要在算子定义函数中增加算子输入/输出/属性的校验代码。由于Add算子允许两个输入数据的shape不同，但算子计算接口tbe.dsl.vadd( )要求两个输入shape相同，因此需要对算子两个输入的shape进行广播，并对其进行校验。有助于在算子编译阶段，提前发现问题。修改后代码如下所示：

若开发者通过Windows上远程打开的MindStudio，复制以下代码时可能会出现无法复制的情况，解决方法请参见Windows上远程打开MindStudio时，复制的内容无法粘贴到编辑器窗口中。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
from __future__ import absolute_import
import tbe.dsl as tbe
from functools import reduce
from tbe import tvm
from tbe.common.register import register_op_compute
from tbe.common.utils import para_check
from tbe.common.utils import shape_util

SHAPE_SIZE_LIMIT = 2147483648

# 实现Add算子的计算逻辑
@register_op_compute("Add", op_mode="dynamic", support_fusion=True)
def add_compute(input_x, input_y, output_z, kernel_name="add"):
    # 将shape转换为list
    shape_x = shape_util.shape_to_list(input_x.shape)
    shape_y = shape_util.shape_to_list(input_y.shape)

    # shape_max取shape_x与shape_y的每个维度的大值
    shape_x, shape_y, shape_max = shape_util.broadcast_shapes(shape_x, shape_y,
                                                              param_name_input1="input_x",
                                                              param_name_input2="input_y")
    shape_size = reduce(lambda x, y: x * y, shape_max[:])
    if shape_size > SHAPE_SIZE_LIMIT:
        raise RuntimeError("the shape is too large to calculate")

    # 将input_x的shape广播为shape_max
    input_x = tbe.broadcast(input_x, shape_max)
    input_y = tbe.broadcast(input_y, shape_max)

    # 执行input_x + input_y
    res = tbe.vadd(input_x, input_y)

    return res

# 算子定义函数
@para_check.check_op_params(para_check.REQUIRED_INPUT, para_check.REQUIRED_INPUT,
                            para_check.REQUIRED_OUTPUT, para_check.KERNEL_NAME)
def add(input_x, input_y, output_z, kernel_name="add"):
    # 获取算子输入tensor的shape与dtype
    shape_x = input_x.get("shape")
    shape_y = input_y.get("shape")

    # 检验算子输入类型
    check_tuple = ("float16", "float32", "int32")
    input_data_type = input_x.get("dtype").lower()
    para_check.check_dtype(input_data_type, check_tuple, param_name="input_x")

    # shape_max取shape_x与shape_y的每个维度的最大值
    shape_x, shape_y, shape_max = shape_util.broadcast_shapes(shape_x, shape_y,
                                                              param_name_input1="input_x",
                                                              param_name_input2="input_y")

     # 如果shape的长度等于1，就直接赋值，如果shape的长度不等于1，做切片，将最后一个维度舍弃（按照内存排布，最后一个维度为1与没有最后一个维度的数据排布相同，例如2*3=2*3*1，将最后一个为1的维度舍弃，可提升后续的调度效率）
    if shape_x[-1] == 1 and shape_y[-1] == 1 and shape_max[-1] == 1:
        shape_x = shape_x if len(shape_x) == 1 else shape_x[:-1]
        shape_y = shape_y if len(shape_y) == 1 else shape_y[:-1]
        shape_max = shape_max if len(shape_max) == 1 else shape_max[:-1]

    # 使用TVM的placeholder接口对输入tensor进行占位，返回一个tensor对象
    data_x = tvm.placeholder(shape_x, name="data_1", dtype=input_data_type)
    data_y = tvm.placeholder(shape_y, name="data_2", dtype=input_data_type)

    # 调用compute实现函数
    res = add_compute(data_x, data_y, output_z, kernel_name)

    # 自动调度
    with tvm.target.cce():
        schedule = tbe.auto_schedule(res)
    # 编译配置
    config = {"name": kernel_name,
              "tensor_list": (data_x, data_y, res)}
    tbe.build(schedule, config)
  1. 算子定义函数声明包含算子输入信息、输出信息以及内核名称。
    def add(input_x, input_y, output_z, kernel_name="add"):
    • input_x, input_y：Add算子的两个输入tensor，每个tensor需要采用字典的形式进行定义，包含shape和dtype等信息。输入tensor的个数需要与算子信息库定义 “tbe/op_info_cfg/ai_core/add.ini”中的定义保持一致。
    • output_z：输出tensor，包含shape和dtype等信息，字典格式，此字段为预留位。

      输出tensor的个数需要与算子信息库定义 “tbe/op_info_cfg/ai_core/add.ini”中的定义保持一致。

    • kernel_name：算子在内核中的名称（即生成的二进制文件以及算子描述文件的名称），用户自定义，保持唯一，只能是大小写字母、数字、“_”的组合，且必须是字母或者“_”开头，长度小于或等于200个字符。
  2. 算子输入校验和输出形状推导。

    Add算子需要对两个输入tensor的shape进行校验，且仅支持数据类型float16, float32, int32，此外Add算子允许两个输入shape不同，因此需要调用shape_util.broadcast_shapes()生成广播后的shape并对其进行校验。

  3. 对输入tensor进行占位。

    调用TVM的placeholder接口分别对两个输入tensor进行占位，并分别返回一个tensor对象。

    5中的tensor_list的输入tensor需要是tvm.placeholder接口返回的tensor对象，所以此对象在后续计算过程实现中不能被替换。

  4. 调用add_compute计算函数。
    res = add_compute(data_x, data_y, output_z, kernel_name)

    data_x、data_y为3生成的占位tensor对象。

    计算函数的实现请参见Compute函数实现。

  5. 算子调度与编译实现。

    调度配置config中的tensor_list为：

    "tensor_list": (data_x, data_y, res)

    分别为两个输入tensor与一个输出tensor。

Compute函数实现

开发者需要根据算子计算逻辑自定义实现算子compute函数，Add算子的Compute函数实现如下：

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
@register_op_compute("Add", op_mode="dynamic", support_fusion=True)
def add_compute(input_x, input_y, output_z, kernel_name="add"):
    # 将shape转换为list
    shape_x = shape_util.shape_to_list(input_x.shape)
    shape_y = shape_util.shape_to_list(input_y.shape)

    # shape_max取shape_x与shape_y的每个维度的大值
    shape_x, shape_y, shape_max = shape_util.broadcast_shapes(shape_x, shape_y,
                                                              param_name_input1="input_x",
                                                              param_name_input2="input_y")
    shape_size = reduce(lambda x, y: x * y, shape_max[:])
    if shape_size > SHAPE_SIZE_LIMIT:
        raise RuntimeError("the shape is too large to calculate")

    # 将input_x的shape广播为shape_max
    input_x = tbe.broadcast(input_x, shape_max)
    input_y = tbe.broadcast(input_y, shape_max)

    # 执行input_x + input_y
    res = tbe.vadd(input_x, input_y)

    return res
  1. add_compute函数的声明如下所示。
    @register_op_compute("Add", op_mode="dynamic", support_fusion=True)
def add_compute(input_x, input_y, output_z, kernel_name="add")

    装饰器@register_op_compute("Add", op_mode="dynamic", support_fusion=True)是DSL算子开发方式中必需的，其作用是整网运行时算子支持做UB自动融合，使得当前自定义算子可以在UB中根据UB融合规则自动与其他算子的计算进行组装。

    其中：

    • input_x，input_y：compute函数的入参，为在3中声明的输入tensor对应的placeholder，包含shape和dtype等信息。
    • output_z：为1中算子接口函数透传过来的dict类型。
    • kernel_name：算子在内核中的名称。
  2. 进行Add算子的计算逻辑的实现。

    Add算子要求相加的两个tensor的shape相同，所以首先通过调用tbe.broadcast接口将两个输入tensor广播成相同的shape，然后调用tbe.vadd接口实现输入tensor的相加，并返回计算结果tensor。

算子编译验证

  1. 在算子python文件最下方添加main函数调用该算子，通过MindStudio编译算子实现文件，用于单算子代码的简单语法校验，代码示例如下所示：

    1
2
3
4
    # 算子调用
if __name__ == '__main__':
    input_output_dict = {"shape": (5, 6, 7),"format": "ND","ori_shape": (5, 6, 7),"ori_format": "ND", "dtype": "float16"}
    add(input_output_dict, input_output_dict, input_output_dict, kernel_name="add")

  2. 右键单击“tbe/impl/add.py”，选择“Run‘add'”，编译算子。

    如果编译没有报错，且在当前目录“tbe/impl”下生成kernel_meta文件夹，包括以下文件，则表示算子代码能够编译运行。
    • 算子二进制文件*.o。
    • 算子描述文件*.json：用于定义算子属性及运行时所需要的资源。

父主题： 算子开发过程


算子信息库定义

简介

需要通过配置算子信息文件，将算子的相关信息注册到算子信息库中，算子信息库主要体现算子在对应 AI处理器上的具体实现规格。

针对TBE算子，算子信息库包括算子支持的输入输出dtype、format以及输入shape等信息；针对AI CPU算子，算子信息库包括算子输入输出的name，支持的dtype、format等信息。

网络运行时，图编译器会根据算子信息库中的算子信息做基本校验，并进行算子匹配。

TBE算子信息库

进入“tbe/op_info_cfg/ai_core/soc_version”目录，配置算子信息库文件“add.ini”。

soc_version为当前对应 AI处理器的版本。

开发者需要基于MindStudio自动生成的add.ini文件进行修改，修改后的Add算子的算子信息定义如下所示。

[Add]
input0.name=x1
input0.dtype=float16,float16,float16,float16,float,float,float,float,int32,int32,int32,int32
input0.format=NCHW,NC1HWC0,NHWC,ND,NCHW,NC1HWC0,NHWC,ND,NCHW,NC1HWC0,NHWC,ND
input0.shape=all
input0.paramType=required
input1.name=x2
input1.dtype=float16,float16,float16,float16,float,float,float,float,int32,int32,int32,int32
input1.format=NCHW,NC1HWC0,NHWC,ND,NCHW,NC1HWC0,NHWC,ND,NCHW,NC1HWC0,NHWC,ND
input1.shape=all
input1.paramType=required
output0.name=y
output0.dtype=float16,float16,float16,float16,float,float,float,float,int32,int32,int32,int32
output0.format=NCHW,NC1HWC0,NHWC,ND,NCHW,NC1HWC0,NHWC,ND,NCHW,NC1HWC0,NHWC,ND
output0.shape=all
output0.paramType=required
opFile.value=add
opInterface.value=add

参数说明请参见表1。下表仅列出常用的算子信息库配置项，其他配置项请参见《CANN 6.3.RC2 TBE&AI CPU算子开发指南》或《CANN 6.2.RC2 TBE&AI CPU算子开发指南》的“算子开发过程 > 算子信息库定义 > TBE算子信息库”章节。

表1 Add算子的算子信息定义说明

信息

Add算子配置

说明

[OpType]

[Add]

算子类型，以英文半角方括号，标识一个算子信息开始，根据算子分析，算子类型为Add。

input0.name

x1

Add算子的第一个输入tensor的名称，根据算子分析，第一个输入名称为x1，所以此处配置为x1，且需要跟算子原型定义中的名称保持一致。

input0.dtype

input0.dtype=float16,float16,float16,float16,float,float,float,float,int32,int32,int32,int32

input0.format=NCHW,NC1HWC0,NHWC,ND,NCHW,NC1HWC0,NHWC,ND,NCHW,NC1HWC0,NHWC,ND

定义输入tensor支持的数据类型与数据排布格式。

根据算子分析，Add算子的输入数据类型支持float16、float32与int32三种；支持的数据排布格式有NCHW、NC1HWC0、NHWC、ND。

说明：

若算子输入支持多种规格，算子输入的dtype与format需要一一对应、按对应顺序进行配置，列出算子支持的所有dtype与format的组合，中间以“,”分隔。

input0.format

input0.shape

all

定义输入tensor支持的形状。

input0.paramType

required

定义输入tensor的类型。

  • dynamic：表示该输入是动态个数，可能是1个，也可能是多个。
  • optional：表示该输入为可选，可以有1个，也可以不存在。
  • required：表示该输入有且仅有1个。

Add算子的input0为固定输入1个，此处配置为required。

input1.name

x2

因为Add算子有两个输入，生成的配置模板中只有一个输入，所以此处需要添加input1的相关配置。

此配置项代表Add算子的第二个输入tensor的名称，根据算子分析，第二个输入名称为x2，所以此处配置为x2，且需要跟算子原型定义中的名称保持一致。

input1.dtype

input1.dtype=float16,float16,float16,float16,float,float,float,float,int32,int32,int32,int32

input1.format=NCHW,NC1HWC0,NHWC,ND,NCHW,NC1HWC0,NHWC,ND

定义输入tensor支持的数据类型与数据排布格式。

根据算子分析，Add算子的输入数据类型支持float16、float32与int32三种；支持的数据排布格式有NCHW,NC1HWC0,NHWC,ND。

说明：

若算子输入支持多种规格，算子输入的dtype与format需要一一对应、按对应顺序进行配置，列出算子支持的所有dtype与format的组合，中间以“,”分隔。

input1.format

input1.shape

all

定义输入tensor支持的形状。

input1.paramType

required

定义输入tensor的类型。

  • dynamic：表示该输入是动态个数，可能是1个，也可能是多个。
  • optional：表示该输入为可选，可以有1个，也可以不存在。
  • required：表示该输入有且仅有1个。

Add算子的input1为固定输入1个，此处配置为required。

output0.name

y

Add算子的输出tensor的名称，根据算子分析，算子的输出名称为y，所以此处配置为y，且需要跟算子原型定义中的名称保持一致。

output0.dtype

output0.dtype=float16,float16,float16,float16,float,float,float,float,int32,int32,int32,int32

output0.format=NCHW,NC1HWC0,NHWC,ND,NCHW,NC1HWC0,NHWC,ND

定义输出tensor支持的数据类型与数据排布格式。

根据算子分析，Add算子的输出数据类型支持float16、float32与int32三种；支持的数据排布格式有NCHW,NC1HWC0,NHWC,ND。

说明：

若算子输入支持多种规格，算子输入的dtype与format需要一一对应、按对应顺序进行配置，列出算子支持的所有dtype与format的组合，中间以“,”分隔。

output0.format

output0.shape

all

定义输出tensor支持的形状。

output0.paramType

required

定义输出tensor的类型。

  • dynamic：表示该输出是动态个数，可能是1个，也可能是多个。
  • optional：表示该输出为可选，可以有1个，也可以不存在。
  • required：表示该输出有且仅有1个。

Add算子的output0为固定输出1个，此处配置为required。

opFile.value

add

算子代码实现文件的名称。

因为算子实现代码的名称符合算子OpType到代码实现名称的转换规则，参见步骤4，所以此字段可不配置。

opInterface.value

add

算子实现文件中定义函数的名称。

因为算子定义函数的名称符合算子OpType到算子定义函数名称的转换规则，参见步骤4，所以此字段可不配置。

AI CPU算子信息库

进入“cpukernel/op_info_cfg/aicpu_kernel”目录，配置算子信息库文件“reshape_cust.ini”。

开发者需要基于MindStudio自动生成的reshape_cust.ini文件进行修改，修改后的ReshapeCust算子的算子信息定义如下所示。

[ReshapeCust]
opInfo.engine=DNN_VM_AICPU
opInfo.flagPartial=False
opInfo.computeCost=100
opInfo.flagAsync=False
opInfo.opKernelLib=CUSTAICPUKernel
opInfo.kernelSo=libcust_aicpu_kernels.so
opInfo.functionName=RunCpuKernel
opInfo.workspaceSize=1024

参数说明请参见表2。下表仅列出常用的算子信息库配置项，其他配置项请参见《CANN 6.3.RC2 TBE&AI CPU算子开发指南》或《CANN 6.2.RC2 TBE&AI CPU算子开发指南》的“算子开发过程 > 算子信息库定义 > AI CPU算子信息库”章节。

表2 ReshapeCust算子的算子信息定义说明
信息 | ReshapeCust算子配置 | 说明
[OpType] | [ReshapeCust] | 算子类型，以英文半角范括号，标识一个算子信息开始，根据算子分析，算子类型为ReshapeCust。
opInfo.engine | DNN_VM_AICPU | 配置算子调用的引擎。 AI CPU自定义算子的引擎固定为“DNN_VM_AICPU”。
opInfo.flagPartial | False | 此字段为预留字段，请保持固定值“False”。
opInfo.computeCost | 100 | 此字段为预留字段，请保持固定值“100”。
opInfo.flagAsync | False | 此字段为预留字段，请保持固定值“False”。
opInfo.opKernelLib | CUSTAICPUKernel | 配置算子调用的kernelLib。 AI CPU自定义算子调用的kernelLib固定为“CUSTAICPUKernel”。
opInfo.kernelSo | libcust_aicpu_kernels.so | 配置AI CPU算子编译生成的so的名称。
opInfo.functionName | RunCpuKernel | 配置自定义算子调用的kernel函数接口名称。 自定义算子的kernel函数接口固定为“RunCpuKernel”。
opInfo.workspaceSize | 1024 | 此字段为预留字段。 配置为内存空间，用于分配算子临时计算的内存。 单位为KB，取值范围为：0~1048576（1G）。 建议配置为：1024
父主题： 算子开发过程


算子适配插件实现

  • TensorFlow/Caffe框架
  • ONNX框架
父主题： 算子开发过程


TensorFlow/Caffe框架

开发者需要进行算子适配插件的开发，实现将TensorFlow/Caffe框架网络中的算子进行解析并映射成对应 AI处理器中的算子。

本章节将以TBE算子开发样例工程中“Add”算子为例讲解算子适配插件的实现，供开发者参考。

MindStudio在“framework/tf_plugin/tensorflow_add_plugin.cc”（以TensorFlow为例）文件已自动生成了Add算子的插件代码。

  • 包含头文件。
    1
2
    //包含该头文件，可使用算子注册类相关，调用算子注册相关的接口，为/compiler/include/register/register.h文件
#include "register/register.h"
  • 进行插件注册。
    1
2
3
4
5
6
7
    namespace domi{
REGISTER_CUSTOM_OP("Add")
    .FrameworkType(TENSORFLOW)
    .OriginOpType({ge::AscendString("Add")})
    .ParseParamsByOperatorFn(AutoMappingFn)
    .ImplyType(ImplyType::TVM);    //需手动添加
}
    • REGISTER_CUSTOM_OP：算子注册到GE的算子类型，根据算子分析，算子类型为“Add”。
    • FrameworkType：TENSORFLOW代表原始框架类型为TensorFlow，CAFFE代表原始框架为Caffe。
    • OriginOpType：算子在原始框架中的类型。
    • ParseParamsByOperatorFn：用来注册解析模型的函数，使用AutoMappingFn函数自动实现解析。
    • ImplyType：指定算子的实现方式，需要手动添加。ImplyType::TVM表示该算子是TBE算子，ImplyType::AI_CPU表示该算子是AI CPU算子。
父主题： 算子适配插件实现


ONNX框架

开发者需要进行算子适配插件的开发，实现将ONNX框架网络中的算子进行解析并映射成对应 AI处理器中的算子。

MindStudio在“framework/onnx_plugin/xxx_plugin.cc”文件已自动生成了算子的插件代码。

  • 包含头文件。
    1
2
    //包含该头文件，可使用算子注册类相关，调用算子注册相关的接口，为/compiler/include/register/register.h文件
#include "register/register.h"
  • 进行插件注册。
     1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
    using namespace ge;    // 需手动添加
namespace domi {
// Onnx ParseParams
Status ParseParamAdd(const Message* op_src, ge::Operator& op_dest) {
    // To do: Implement the operator plugin by referring to the Onnx Operator Development Guide.
    return SUCCESS;
}

// register op info to GE
REGISTER_CUSTOM_OP("Add")
    .FrameworkType(ONNX)   // Operator name with the original framework
    .OriginOpType("")      // Set the original frame type of the operator
    .ParseParamsByOperatorFn(ParseParamAdd)// Registering the callback function for parsing operator parameters
    .ImplyType(ImplyType::TVM);    // 需手动添加，TBE算子：ImplyType::TVM；AI CPU算子：ImplyType::AI_CPU
}  // namespace domi
    • REGISTER_CUSTOM_OP：注册自定义算子，Add作为注册到GE中的算子类型，可以任意命名但不能和已有的算子命名冲突，且需要与原型注册中的OpType保持一致。
    • FrameworkType：ONNX代表原始框架为ONNX。
    • OriginOpType：算子在原始框架中的类型，需要用户填写。例如自定义算子Add，对应ONNX算子库版本opset_version=11的原始框架类型为“ai.onnx::11::Add”，此处填写为OriginOpType("ai.onnx::11::Add") 。
    • ParseParamsByOperatorFn(ParseParamAdd)：用来注册解析算子属性的函数，需要用户自定义实现回调函数ParseParamAdd。

      回调函数ParseParamAdd的声明如下所示：

      Status ParseParamAdd(const ge::Operator& op_src, ge::Operator& op_dest)
      • ParseParamAdd：函数名称，用户自定义，需要保持唯一。
      • op_src：ONNX框架定义的Operator类对象，包含ONNX模型中自定义的算子属性信息，定义来源ONNX框架的原始模型文件。
      • op_dest：CANN算子数据结构，保存算子信息。
    • ImplyType：指定算子的实现方式，需要手动添加。ImplyType::TVM表示该算子是TBE算子，ImplyType::AI_CPU表示该算子是AI CPU算子。
父主题： 算子适配插件实现


UT测试

  • 简介
  • TBE算子UT测试
父主题： 算子开发


简介

MindStudio提供了基于gtest框架的新的UT测试方案，简化了开发者开发UT测试用例的复杂度。

UT（Unit Test：单元测试）是开发人员进行单算子运行验证的手段之一，主要目的是：

  • 测试算子代码的正确性，验证输入输出结果与设计的一致性。
  • UT侧重于保证算子程序能够正常运行，选取的场景组合应能覆盖算子代码的所有分支（一般情况下覆盖率要达到100%），从而降低不同场景下算子代码的编译失败率。

测试类的详细定义可参见/python/site-packages/op_test_frame/ut/op_ut.py文件。

父主题： UT测试


TBE算子UT测试

前提条件

需完成自定义算子的开发，包括算子实现代码和算子原型定义，详情可参见算子代码实现（TBE DSL）和算子原型定义。

  • CentOS 7.8 arm容器暂不支持算子实现代码的UT测试功能。
  • Windows版本的MindStudio UT测试的算子工程目录中不要出现空格。

生成UT测试用例文件

  1. 创建UT测试用例。

    1. 创建UT测试用例，有以下两种方式：

      右键单击算子工程根目录，选择“New Cases > TBE UT Case”。

      若已经存在了算子的UT测试用例，可以右键单击“testcases”目录或“testcases > ut”目录，选择“New Cases > TBE UT Case”，创建UT测试用例。

    2. 在弹出的算子选择界面，选择需要创建UT测试用例的算子，单击“OK”，如下图所示。

      若已存在此算子的UT测试用例，系统会提示“testcases/ut/ops_test/xx already exists. Do you want to overwrite?”。

      可以选择“Overwrite”覆盖当前测试用例或者“Cancel”取消覆盖。

      创建完成后，会在算子工程根目录下生成testcases文件夹，目录结构如下所示：

      ├── MyOperator            //工程根目录
│   ├──  testcases
│   │   ├── libs                  // gtest框架，为第三方依赖，用户无需关注
│   │   ├──  ut
│   │   │   ├── ops_test
│   │   │   │   ├── add
│   │   │   │   │   ├── CMakeLists.txt        //用于编译可执行文件
│   │   │   │   │   ├── test_add_impl.py      //算子实现代码的测试用例文件
│   │   │   │   │   ├── test_add_proto.cc    //算子原型定义代码的测试用例文件
│   │   │   │   ├── CMakeLists.txt             //用于编译可执行文件
│   │   │   │   ├── test_main.cc              //测试用例调用总入口
│   │   │   ├ CMakeLists.txt

  2. 在中标麒麟和银河麒麟运行时，请在“testcases/ops_test/add/CMakeLists.txt”文件中添加加粗内容，其他操作系统请忽略此步骤。

    add_definitions(-D_GLIBCXX_USE_CXX11_ABI=0)
set(CMAKE_CXX_FLAGS "-std=c++11")
set(PROJECT_DIR "$ENV{PROJECT_PATH}")
set(GTEST_DIR ${PROJECT_DIR}/testcases/libs/gtest)
set(ADK_DIR "$ENV{ADK_PATH}")
set(ATC_DIR ${ADK_DIR}/atc)
set(OP_PROTO_SRC_DIR ${PROJECT_DIR}/op_proto)

message(STATUS "ATC_DIR=${ATC_DIR}")

enable_testing()

include_directories(
        "${GTEST_DIR}/include"
        "${ATC_DIR}/include"
        "${OP_PROTO_SRC_DIR}"
        )

aux_source_directory(${OP_PROTO_SRC_DIR} OP_PROTO_SOURCE_SRCS)
file(GLOB OP_PROTO_TEST_FILES **proto.cc)

link_directories(
        "${ATC_DIR}/lib64"
        "${GTEST_DIR}"
        "/usr/local/gcc7.3.0/lib64/"
)

set(CUSTOM_OBJECT_NAME "add_proto_test")

add_executable(${CUSTOM_OBJECT_NAME}
        ${PROJECT_DIR}/testcases/ut/ops_test/test_main.cc ${OP_PROTO_SOURCE_SRCS} ${OP_PROTO_TEST_FILES})

target_link_libraries(${CUSTOM_OBJECT_NAME} gtest c_sec alog pthread error_manager graph register)

    UT测试要求gcc版本为7.5.0及以上，若gcc版本不满足要求，请升级gcc版本。

  3. 编写算子实现代码的UT Python测试用例，计算出算子执行结果，并取回结果和预期结果进行比较，来测试算子逻辑的正确性。编写算子实现代码的UT Python测试用例的方法有以下两种：

    • 根据UT_Impl模板json文件编写算子实现代码的UT Python测试用例（MindSpore算子同样支持通过UT_Impl模板编写UT Python测试用例）。
      1. 右键单击“testcases/ut/ops_test/add/test_add_impl.py”，选择“Generate TBE UT Impl Case”生成shape为空的算子UT_Impl测试用例定义文件test_add_impl.json。
      2. 在test_add_impl.json文件中，用户需要进行shape信息的配置，用于生成测试数据及测试用例，也可以根据需要进行其他字段的配置，每个字段的详细要求可参见TBE算子UT测试用例定义文件参数解释。若当前字段可选时，支持用户输入None字段，开启 [image] 开关，将隐藏当前字段的配置项。
      3. UT_Impl测试用例定义文件test_add_impl.json的字段配置完成后，单击“Generate”，test_add_impl.py文件末尾会根据test_add_impl.json文件的配置生成对应的代码。
      4. 如有调用add_precision_case接口，可参考add_precision_case接口在test_add_impl.py文件中进行“calc_expect_func”参数配置。
    • 在“testcases/ut/ops_test/add/test_add_impl.py”文件中，直接编写算子实现代码的UT Python测试用例。
      import ...
from op_test_frame.ut import BroadcastOpUT   # 导入UT测试类，可根据算子类型选择使用哪个测试类

ut_case = BroadcastOpUT("add")      # 实例化UT测试用例，ut_case为UT测试框架关键字，不可修改；add为算子的Type

def calc_expect_func(input_x, input_y, output_z):    # 自定义实现生成期望数据的函数
    res = input_x["value"] + input_y["value"]
    return [res, ]    # 返回期望数据

# 添加测试用例
ut_case.add_precision_case("all", {
    "params": [{"dtype": "float16", "format": "ND", "ori_format": "ND", "ori_shape": (32,), "shape": (32,),
                "param_type": "input"},
               {"dtype": "float16", "format": "ND", "ori_format": "ND", "ori_shape": (32,), "shape": (32,),
                "param_type": "input"},
               {"dtype": "float16", "format": "ND", "ori_format": "ND", "ori_shape": (32,), "shape": (32,),
                "param_type": "output"}],
    "calc_expect_func": calc_expect_func
})
# 若定义多个用例，定义多个ut_case.add_precision_case函数
ut_case.add_precision_case("all", {
    "params": [{"dtype": "float16", "format": "ND", "ori_format": "ND", "ori_shape": (16,2), "shape": (16,2),
                "param_type": "input"},
               {"dtype": "float16", "format": "ND", "ori_format": "ND", "ori_shape": (16,2), "shape": (16,2),
                "param_type": "input"},
               {"dtype": "float16", "format": "ND", "ori_format": "ND", "ori_shape": (16,2), "shape": (16,2),
                "param_type": "output"}],
    "calc_expect_func": calc_expect_func
})

      目前Windows版本不支持导入te或者tbe模块。故在编写算子实现代码的UT Python测试用例时不支持导入算子实现文件及涉及te或tbe模块的文件。

      1. 首先导入UT测试类，用户可根据算子类型自行选择使用哪个UT测试类，详细可参见UT测试接口参考。
      2. 实例化测试用例，OpUT的使用方法可参见OpUT测试类定义。
      3. 用户自定义实现生成期望数据的函数。
      4. 添加测试用例。

        测试用例“params”中字段和字段取值范围需根据算子实现文件入口参数确定。输入tensor中的“ori_shape”和“ori_format”字段为可选字段，但若使用参数校验修饰器检验参数，“ori_shape”和“ori_format”字段必选。

        可参见UT测试接口参考查看每个测试类接口的使用方法。

        若要与期望数据进行结果的比对，请使用add_precision_case接口。

  4. 编写算子原型定义的UT C++测试用例。

    在“testcases/ut/ops_test/add/test_add_proto.cc”文件中，编写算子原型定义的UT C++测试用例，用于定义算子实例、更新算子输入输出并调用InferShapeAndType函数，最后验证InferShapeAndType函数执行过程及结果的正确性。

    1. 导入gtest测试框架和算子IR定义的头文件。

      UT的C++用例采用的是gtest框架，所以需要导入gtest测试框架；算子原型定义在原型定义头文件中，所以需要导入原型定义的*.h文件。

      //导入gtest框架
#include <gtest/gtest.h>
//导入基础的vector类库
#include <vector>
//导入算子的IR定义头文件
#include "add.h"
    2. 定义测试类。

      UT的C++用例采用的是gtest框架，所以需要定义一个类来继承gtest的测试类。

      #include <gtest/gtest.h>
#include <vector>
#include "add.h"

class AddTest : public testing::Test {
protected:
    static void SetUpTestCase() {
        std::cout << "add test SetUp" << std::endl;
}

    static void TearDownTestCase() {
        std::cout << "add test TearDown" << std::endl;
    }
};

      测试类的名称可自定义，以“Test”为后缀。

    3. 编写测试用例。

      每一个场景写一个测试用例函数，该用例中需要构造算子实例，包括算子名称、shape、数据类型。然后调用InferShapeAndType函数，并将推导出的shape、dtype与预期结果进行对比。

      示例如下：

      TEST_F(AddTest, add_test_case_1) {
    // 定义算子实例及输入shape和type，以TensorDesc实例承载
    ge::op::Add add_op;  //Add为算子的Type，需要与原型定义的REG_OP(OpType)中的OpType保持一致
    ge::TensorDesc tensorDesc;
    ge::Shape shape({2, 3, 4});
    tensorDesc.SetDataType(ge::DT_FLOAT16);
    tensorDesc.SetShape(shape);
    tensorDesc.SetOriginShape(shape);

    // 更新算子输入，输入的名称需要与原型定义*.h文件中的名称保持一致，例如:x1与x2分别为Add算子的两个输入
    add_op.UpdateInputDesc("x1", tensorDesc);
    add_op.UpdateInputDesc("x2", tensorDesc);
    // 调用InferShapeAndType函数，InferShapeAndType()接口为固定接口，用例执行时会自动调用算子原型定义中的shape推导函数
    auto ret = add_op.InferShapeAndType();
    // 验证调用过程是否成功
    EXPECT_EQ(ret, ge::GRAPH_SUCCESS);

    // 获取算子输出并比较shape和type，算子输出的名字需要与原型定义*.h文件中的名称保持一致，例如:算子的输出为y
    auto output_desc = add_op.GetOutputDesc("y");
    EXPECT_EQ(output_desc.GetDataType(), ge::DT_FLOAT16);
    std::vector<int64_t> expected_output_shape = {2, 3, 4};
    EXPECT_EQ(output_desc.GetShape().GetDims(), expected_output_shape);
}

      若不同输入的shape不同，请自行定义多个TensorDesc对象进行设置，例如：

          ge::op::Operator1 operator1_op;  //Operator1为算子的Type
    ge::TensorDesc tensorDesc1;
    ge::TensorDesc tensorDesc2;
    ge::Shape shape1({2, 3, 4});
    ge::Shape shape2({3, 4, 5});
    tensorDesc1.SetDataType(ge::DT_FLOAT16);
    tensorDesc1.SetShape(shape1);
    tensorDesc1.SetOriginShape(shape1);
    tensorDesc2.SetDataType(ge::DT_FLOAT16);
    tensorDesc2.SetShape(shape2);
    tensorDesc2.SetOriginShape(shape2);

    // 更新算子输入
    operator1_op.UpdateInputDesc("x1", tensorDesc1);
    operator1_op.UpdateInputDesc("x2", tensorDesc2);

执行UT测试用例

  1. 运行算子实现文件的UT测试用例。

    开发人员可以执行当前工程中所有算子的UT测试用例，也可以执行单个算子的UT测试用例。
    • 右键单击“testcases/ut/ops_test”文件夹，选择“Run Tbe Operator‘All’UT Impl with coverage”，执行整个文件夹下算子实现代码的测试用例。
    • 右键单击“testcases/ut/ops_test/算子名称”文件夹，选择“Run Tbe Operator‘算子名称’UT Impl with coverage”，执行单个算子实现代码的测试用例。
    • 右键单击“testcases/ut/ops_test/算子名称/test_算子名称_impl.py”文件，选择“Run Tbe Operator‘算子名称’UT Impl with coverage”，执行单个算子实现代码的测试用例。

    Windows版本的MindStudio在进行以下操作时需获取UT Case Names，如图1所示将出现进度提示框（预计耗时10s左右）。

    • 执行算子实现代码的测试用例时需获取UT Case Names。
    • 在运行配置页面变更参数配置（Soc Version和Operator Name）时需重新获取UT Case Names。
    图1 获取UT Case Names
    第一次运行时会弹出运行配置页面，如图2所示，根据实际情况配置完成后单击“Run”。后续如需修改运行配置，请参考修改运行任务配置。
    图2 运行配置页面
    表1 运行配置信息

    参数

    说明

    Name

    运行配置名称，用户可以自定义。

    Test Type

    选择ut_impl。

    Compute Unit

    选择计算单元，TBE算子仅支持配置AI Core/Vector Core。

    SoC Version

    下拉选择当前版本的对应 AI处理器类型。

    Target

    运行环境。

    • Simulator_Function：功能仿真环境。
    • Simulator_Performance：性能仿真环境。
    • Simulator_TMModel：快速展示算子执行的调度流水线，不进行实际算子计算。该功能仅支持Atlas 200/300/500 推理产品和Atlas 训练系列产品。

    Enable Advisor

    开启专家系统。

    当Target为Simulator_TMModel时，可以对单测试用例性能进行专家系统分析。

    Operator Name

    选择运行的测试用例。

    • all表示运行所有用例。
    • 其他表示运行某个算子下的测试用例。

    CANN Machine

    CANN工具所在设备的deployment信息。

    说明：

    仅支持Windows操作系统。

    Case Names

    勾选需要运行的测试用例，即算子实现代码的UT Python测试用例。支持全选或勾选部分测试用例。

  2. 查看运行结果。

    运行完成后，通过界面下方的“Run”日志打印窗口查看运行结果。

    1. 若配置算子期望函数"calc_expect_func": calc_expect_func，运行成功后，日志会打印对比结果。
      • Error count：误差大于绝对容忍率（atol）的数量。
      • Max atol error count：误差大于期望值 * 最大容忍率（max_atol）的数量。
      • Threshold count (rtol * data_size)：允许超过自定义精度的最大错误 (相对容忍率（rtol） * tensor元素数量)数量。

      测试结果：

      • Max atol error count>0则UT测试失败。
      • Error count>Threshold count则UT测试失败。
    2. 在“Run”窗口中单击index.html的URL（URL中的localhost为MindStudio安装服务器的IP，建议直接单击打开），查看UT测试用例的覆盖率结果。

      查看UT测试用例运行结果需要使用浏览器，如果未安装浏览器，请用户自行安装。

      如果出现"Page'http://***.html'requested without authorization, you can copy URL and open it in browser to trust it."提示，请参考配置不受信任的网址访问浏览器解决。

    3. 在html页面中单击对应算子，进入UT用例覆盖率详情页面，如图3所示，通过绿色和红色标签区分是否覆盖。
      图3 UT覆盖率详情页面

    4. 运行完成后，生成结果如下所示：
      • 如果在配置运行信息选择的“Target”为“Simulator_Performance”，可以在Profiling窗口查看执行流水线，如下图所示。

        Parallel Analysis：并行度视图。并行度视图展示单算子运行中各个指令执行的并行度情况，横轴为时间（Tick，时钟周期），纵轴为各指令单元，鼠标移动到时间块上，可以显示单条指令的消耗时间以及相关指令。

        • “Start”和“End”表示数据展示的时间范围。“End”为Cycle数，此数值越大，代表运行时间越长。图中数据展示的时间范围可通过滚动鼠标放大或缩小进行变更。
        • 右键单击时间块，弹出跳转到Profiling指令流视图和TBE、CCE、Assembly源代码菜单。
      • 如果在配置运行信息选择的“Target”为“Simulator_TMModel”，可以查看执行流水线，如下图所示。

        若用户使用TIK方式实现算子开发，MindStudio UT测试支持流线图到TIK代码和CCE代码的跳转，帮助用户快速定位到流水图中对应的代码位置，配置详情请参见设置代码跳转功能。

        在芯片进行运算前，vector、cube、MTE1、MTE2、MTE3等单元会做初始化操作，对应在timeline显示上会出现数据还未搬运，各个单元就产生流水数据。

  3. 运行算子原型定义的UT测试用例。

    开发人员可以执行当前工程中所有算子的UT测试用例，也可以执行单个算子的UT测试用例。

    • 右键单击“testcases/ut/ops_test”文件夹，选择“Run Tbe Operator‘All’UT Proto”，执行整个文件夹下算子原型定义代码的测试用例。
    • 右键单击“testcases/ut/ops_test/算子名称”文件夹，选择“Run Tbe Operator‘算子名称’UT Proto”，执行单个算子原型定义代码的测试用例。
    • 右键单击“testcases/ut/ops_test/算子名称/test_算子名称_proto.cc”文件，选择“Run Tbe Operator‘算子名称’UT Proto”，执行单个算子原型定义代码的测试用例。
    第一次运行时会弹出运行配置页面，请参考配置，然后单击“Run”。后续如需修改运行配置，请参考修改运行任务配置。
    表2 运行配置信息

    参数

    说明

    Name

    运行配置名称，用户可以自定义。

    Test Type

    选择ut_proto。

    Compute Unit

    选择计算单元，TBE算子仅支持配置AI Core/Vector Core。

    Operator Name

    选择运行的测试用例。

    • all表示运行所有用例。
    • 其他表示运行某个算子下的测试用例。

    Case Names

    勾选需要运行的测试用例，即TEST_F中定义的用例。支持全选或勾选部分测试用例。

  4. 查看运行结果。

    运行完成后，通过界面下方的日志打印窗口，查看运行结果。结果中展示此次运行测试用例、成功用例和失败用例的数量，如下图所示。

OP Tiling UT测试

动态shape算子工程涉及OP Tiling时执行以下操作，不涉及tiling实现的算子无需关注。

  1. 创建OP Tiling的实现文件。

    1. 右键单击op_tiling文件夹，选择“New > File”。
    2. 在弹出的New File界面，输入{op_name}.cc，也可以自定义名称，需为.cc文件，如下图所示。

    3. 回车后生成空白的{op_name}.cc文件，用户可根据业务需求编写该文件。

  2. 创建OP Tiling UT测试用例。

    1. 创建UT测试用例，有以下三种入口：

      右键单击算子工程根目录，选择“New Cases > TBE OP TILING UT Case”。

      若已经存在了算子的UT测试用例，可以右键单击“testcases”目录，或者“testcases > ut”目录，选择“New Cases > TBE OP TILING UT Case”，创建OP Tiling UT测试用例。

    2. 在弹出的算子选择界面，选择需要生成OP Tiling UT模板工程的算子，单击“OK”，如下图所示。

      若已存在此算子的OP Tiling UT测试用例，系统会提示“testcases/ut/ops_tiling_test/xx already exists. Do you want to overwrite?”

      可以选择“Overwrite”或者“Cancel”。

      创建完成后，会在算子工程根目录下生成testcases文件夹，目录结构如下所示：

      ├── MyOperator            //工程根目录
│   ├──  testcases
│   │   ├── libs                  // gtest框架，为第三方依赖，用户无需关注
│   │   ├──  ut
│   │   │   ├── ops_tiling_test
│   │   │   │   ├──add
│   │   │   │   │   ├── CMakeLists.txt        //用于编译可执行文件
│   │   │   │   │   ├── test_add_tiling.cc      //算子tiling的测试用例文件
│   │   │   │   ├── CMakeLists.txt             //用于编译可执行文件
│   │   │   │   ├── test_main.cc              //测试用例调用总入口

  3. 运行OP Tiling UT测试用例。

    开发人员可以执行当前工程中所有算子的OP Tiling UT测试用例，也可以执行单个算子的OP Tiling UT测试用例。

    • 右键单击“testcases/ut/ops_tiling_test”文件夹，选择“Run TBE Operator‘all’UT Tiling”，执行整个文件夹下算子原型定义代码的测试用例。
    • 右键单击“testcases/ut/ops_tiling_test/算子名称”文件夹，选择“Run TBE Operator‘算子名称’UT Tiling”，执行单个算子原型定义代码的测试用例。
    • 右键单击“testcases/ut/ops_tiling_test/算子名称/test_算子名称_tiling_.cc”文件，选择“Run TBE Operator‘算子名称’UT Tiling”，执行单个算子原型定义代码的测试用例。
    第一次运行时会弹出运行配置页面，请参考配置，然后单击“Run”。后续如需修改运行配置，请参考修改运行任务配置。
    表3 运行配置信息

    参数

    说明

    Name

    运行配置名称，用户可以自定义。

    Test Type

    选择ut_tiling。

    Compute Unit

    计算单元，选择AI Core/Vector Core。

    Operator Name

    选择运行的测试用例。

    • all表示运行所有用例。
    • 其他表示运行某个算子下的测试用例。

    Case Names

    勾选需要运行的测试用例，即TEST_F中定义的用例。

    支持全选或勾选部分测试用例。

  4. 查看运行结果。

    运行完成后，通过界面下方的日志打印窗口，查看运行结果。结果中展示此次一共运行几个用例，成功几个，失败几个。如图4所示。

    图4 运行结果

父主题： UT测试


算子工程编译

简介

算子交付件开发完成后，需要对算子工程进行编译，生成自定义算子安装包custom_opp_Linux_Arch.run，详细的编译操作包括：

  • 将算子信息库定义文件*.ini编译成算子信息库*.json。
  • 针对AI CPU算子，将算子实现文件*.h与*.cc编译为动态库文件libcust_aicpu_kernels.so。
  • 将算子插件实现文件*.h与*.cc编译成算子插件libcust_{tf|caffe|onnx}_parsers.so。
  • 将算子原型定义文件.h与*.cc编译成算子原型库libcust_op_proto.so。
图1 编译过程

  • Windows操作系统不支持本地编译。
  • 旧版本的AI CPU算子工程在使用最新版本的Ascend-cann-toolkit开发套件包时，存在不兼容问题，需要修改CMakeLists.txt文件后重新编译算子工程。解决方法如下：
    1. 修改算子工程目录下/cpukernel/CMakeLists.txt文件。
      ...
set(AICPU_SOC_VERSION $ENV{AICPU_SOC_VERSION})
message(STATUS "AICPU_SOC_VERSION=${AICPU_SOC_VERSION}")

# 添加如下代码
if(EXISTS "${ASCEND_AICPU_PATH}/opp/built-in/op_impl/aicpu/aicpu_kernel/lib/${AICPU_SOC_VERSION}/libascend_protobuf.a")
    target_link_options(${AICPU_KERNEL_TARGET} PRIVATE
        -s
        -Wl,-Bsymbolic
        -Wl,--exclude-libs=libascend_protobuf.a
    )
    target_link_libraries(${AICPU_KERNEL_TARGET} PRIVATE
        -Wl,--whole-archive
        ${ASCEND_AICPU_PATH}/opp/built-in/op_impl/aicpu/aicpu_kernel/lib/${AICPU_SOC_VERSION}/libascend_protobuf.a
        -Wl,--no-whole-archive
    )
endif()

if(EXISTS "${ASCEND_AICPU_PATH}/opp/built-in/op_impl/aicpu/aicpu_kernel/lib/${AICPU_SOC_VERSION}/libcpu_kernels_context.a")
...
    2. 参考本章节重新编译算子工程。

编译操作

  1. （可选）AI CPU算子引用的三方库路径可通过修改算子工程目录下的“cpukernel/CMakeLists.txt”文件进行配置。

    • include_directories：添加头文件所在的目录。

      示例如下：

      include_directories(
directoryPath1
directoryPath2
)
    • link_directories：添加库文件所在的目录。

      示例如下：

      link_directories(
directoryPath3
directoryPath4
)
    • link_libraries：添加算子实现文件的库文件。

      示例如下：

      link_libraries(
libName1
libName2)

    关于cmake参数的详细介绍，请参见https://cmake.org/cmake/help/latest/guide/tutorial/index.html，选择对应版本后查看参数。

  2. 在MindStudio工程界面，选中算子工程，单击顶部菜单栏的“Build > Edit Build Configuration...”。
  3. 进入编译配置页面。单击 [image] 添加新增配置，默认添加编译类型“Release(default)”，请参考表1 表2进行编译配置。

    表1 编译配置参数说明

    参数

    说明

    Build Configuration

    编译配置名称，默认为Build-Configuration

    Target OS

    目标运行环境的操作系统。

    Target Architecture

    目标运行环境的操作系统架构。
    图2 编译配置页面
    表2 编译配置参数说明

    参数

    说明

    Name

    配置名称自定义，默认为Release。

    Build type

    配置类型，可选，默认为Release。

    Toolchain

    工具链配置器，根据已安装的CANN包预置架构一致的自定义Toolchain，支持本地和远程编译功能。

    可单击“Manage toolchains...”自定义配置Toolchain，配置详情请参见Toolchains。

    CMake options

    CMake选项，默认：“-DCMAKE_BUILD_TYPE=Release”。

    Build directory

    编译目录相对路径，该路径是相对于工程目录的路径。

    Build options

    编译加速选项。

    Environment variables

    环境变量配置：支持编译前配置环境变量。

    可直接手动配置或单击 [image] 符号，在弹出窗中配置管理。

    Environment from path

    输入路径或单击右侧 [image] ，选择环境变量配置文件。配置文件以单行<变量名>=<变量值>方式填写，保存为文件，如：

    APATH=/usr/local/xxx
X_PATH=/xxx/xxx

    若选用远程Toolchain，将默认添加一个Deployment，用户需要配置环境变量。

    在Environment Variables输入框中输入环境变量。

    • ASCEND_TENSOR_COMPILER_INCLUDE：CANN软件头文件所在路径。
      ASCEND_TENSOR_COMPILER_INCLUDE=/include
    • ASCEND_OPP_PATH：用于查找AI CPU算子头文件所在的路径编。
      ASCEND_OPP_PATH=/opp;
    • ASCEND_AICPU_PATH：用于查找AI CPU算子相关的静态库。
      ASCEND_AICPU_PATH=
    • AICPU_KERNEL_TARGET：AI CPU算子实现文件编译生成的动态库文件名称。
      AICPU_KERNEL_TARGET=cust_aicpu_kernels_3.3.0

      建议用户配置AICPU_KERNEL_TARGET环境变量，并添加软件版本号的后缀，避免后续由于AI CPU软件升级造成自定义AI CPU动态库文件的冲突。

      若不配置此环境变量，使用默认值：cust_aicpu_kernels。

      若选用本地编译需用户在操作系统中增加环境变量。
      export ASCEND_AICPU_PATH=
export AICPU_KERNEL_TARGET=cust_aicpu_kernels_3.3.0（建议配置）

  4. 单击 [image] 或“Build > Build Ascend Operator Project”进行工程编译。
  5. 在界面最下方的窗口查看编译结果，并在算子工程的cmake-build目录下生成自定义算子安装包custom_opp_Linux_Arch.run。

    其中Arch的取值根据安装的CANN包和Toolchain的信息获取。

父主题： 算子开发


算子部署

  • 本地部署
  • 远程部署
父主题： 算子开发


本地部署

  • 执行ST测试操作时，会自动编译生成自定义算子安装包并将其部署到开发环境的opp目录下，若用户已参见ST测试进行了算子的ST测试，则此步骤可跳过；若需要单独部署自定义算子安装包，可参见此章节进行部署。
  • 进行算子部署前，需要参见算子工程编译生成自定义算子安装包custom_opp_Linux_Arch.run。
  • Windows操作系统不支持算子本地部署。
  1. 在MindStudio工程界面菜单栏依次选择“Ascend > Operator Deployment”，弹出算子部署界面。
  2. 在弹出的界面中选择“Operator Deploy Locally”，在“Operator Package”中选择指定的算子库OPP包目录并单击“Operator deploy”。

    在下方Output页签出现如下信息，代表自定义算子部署成功。

    自定义算子包安装成功后，会将自定义算子部署在/opp目录下或指定的算子库OPP目录下的对应文件夹中。

    目录结构示例如下所示：

    ├── opp      //算子库目录
│   ├── vendors    //自定义算子所在目录
│       ├── config.ini     // 自定义算子优先级配置文件
│       ├── vendor_name1   // 存储对应厂商部署的自定义算子，此名字为编译自定义算子安装包时配置的vendor_name，若未配置，默认值为customize
│           ├── op_impl
│               ├── ai_core    //TBE算子实现文件及算子信息库所在目录
│                   ├── tbe
│                       ├── config
│                           ├── soc_version     //对应 AI处理器版本
│                               ├── aic-soc_version-ops-info.json     //TBE算子信息库文件
│                       ├── impl               //TBE算子实现代码文件
│                           ├── add.py
│               ├── cpu    //AI CPU算子实现文件及算子信息库所在目录
│                   ├── aicpu_kernel/
│                       ├── impl               //AI CPU算子实现代码文件
│                           ├── libcust_aicpu_kernels.so
│                   ├── config
│                       ├── cust_aicpu_kernel.json     //AICPU算子信息库文件
│               ├── vector_core   //此目录预留，无需关注
│           ├── framework
│               ├── caffe   //存放Caffe框架的自定义算子插件库
│                   ├── libcust_caffe_parsers.so
│                   ├── custom.proto
│               ├── onnx          //存放ONNX框架的自定义算子插件库
│                   ├── libcust_onnx_parsers.so
│               ├── tensorflow          //存放TensorFlow框架的自定义算子插件库及npu对相关自定义算子支持度的配置文件
│                   ├── libcust_tf_parsers.so
│                   ├── libcust_tf_scope_fusion.so    //scope融合规则定义库文件
│                   ├── npu_supported_ops.json
│           ├── op_proto    //自定义算子原型库所在目录
│               ├── libcust_op_proto.so
│       ├── vendor_name2   // 存储厂商vendor_name2部署的自定义算子

父主题： 算子部署


远程部署

将自定义算子安装包custom_opp_Linux_Arch.run部署到对应 AI处理器所在硬件环境的算子库中，为后续算子在网络中运行构造必要条件。

  1. 在MindStudio工程界面，选中算子工程。
  2. 单击顶部菜单栏的“Ascend > Operator Deployment”，进入算子打包部署界面。

    请在“Operator Deploy Remotely > Deployment”选择配置项，配置“Deployment”的方法请参见Ascend Deployment。

  3. 配置环境变量，两种配置方式如下所示：

    • 在对应 AI处理器所在硬件环境Host侧配置环境变量。

      MindStudio使用Host侧的运行用户在Host侧进行算子部署，进行算子部署执行前，需要在Host侧进行如下环境变量的配置。

      1. 以运行用户在Host侧的$HOME/.bashrc文件中配置如下环境变量。
        export ASCEND_OPP_PATH=/opp

        为OPP组件（算子库）的安装路径，请根据实际情况配置。

      2. 执行命令使环境变量生效。
        source ~/.bashrc
    • 在“Environment Variables”中添加环境变量。

      可以在“Environment Variables”中直接输入ASCEND_OPP_PATH=/opp。

      为OPP组件（算子库）的安装路径，请根据实际情况配置。

      也可以单击文本框后的图标，在弹出的对话框中填写。

      • 在Name中输入环境变量名称：ASCEND_OPP_PATH。
      • 在Value中输入环境变量值：/opp。

  4. 选择指定的算子库OPP包。

    在“Operator Package”中选择指定的算子库OPP包目录。

  5. 选择算子部署的目标服务器，单击“Operator deploy”。
  6. 算子部署过程即算子工程编译生成的自定义算子安装包的安装过程，部署完成后，算子被部署在Host侧算子库OPP对应文件夹中，若不选择指定的算子库OPP包则默认路径为/usr/local/Ascend/opp/。

    图1 算子部署日志打印

    Host侧自定义算子部署完成后目录结构示例如下所示：

    ├── opp      //算子库目录
│   ├── vendors    //自定义算子所在目录
│       ├── config.ini     // 自定义算子优先级配置文件
│       ├── vendor_name1   // 存储对应厂商部署的自定义算子，此名字为编译自定义算子安装包时配置的vendor_name，若未配置，默认值为customize
│           ├── op_impl
│               ├── ai_core
│                   ├── tbe
│                       ├── config
│                           ├── aic_ops_info.json      //自定义算子信息库文件
│                       ├── vendor_name1_impl          //自定义算子实现代码文件
│                           ├── add.py
│               ├── cpu
│                   ├── aicpu_kernel/
│                       ├── vendor_name1_impl               //自定义算子实现代码文件
│                           ├── libcust_aicpu_kernels.so
│                   ├── config
│                       ├── cust_aicpu_kernel.json     //自定义算子信息库文件
│               ├── vector_core     //此目录预留，无需关注
│           ├── framework
│               ├── caffe        //存放Caffe框架的自定义算子插件库
│               ├── onnx         //存放ONNX框架的自定义算子插件库
│               ├── tensorflow          //存放TensorFlow框架的自定义算子插件库
│                   ├── libcust_tf_parsers.so
│                   ├── npu_supported_ops.json
│           ├── op_proto
│               ├── libcust_op_proto.so    //自定义算子原型库文件

父主题： 算子部署


PyTorch适配

MindStudio暂不支持PyTorch算子适配，在完成TBE或AI CPU算子开发后，PyTorch适配请参见《CANN 6.3.RC2 PyTorch算子开发指南》。

PyTorch适配请读者根据《CANN 6.3.RC2 PyTorch算子开发指南》完成以下操作。

  • 安装PyTorch依赖环境
  • 编译和安装PyTorch框架
  • PyTorch框架下适配TBE或AI CPU算子
父主题： 算子开发


ST测试

概述

MindStudio提供了新的ST（System Test）测试框架，可以自动生成测试用例，在真实的硬件环境中，验证算子功能的正确性和计算结果准确性，并生成运行测试报告，包括：

  • 编译算子工程并将算子部署到算子库，最后在硬件环境中执行测试用例，验证算子运行的正确性。
  • 基于算子信息库生成算子测试用例定义文件。
  • 基于算子测试用例定义文件设计算子的测试用例。
  • 自动生成运行报表（st_report.json）功能，报表记录了测试用例信息及各阶段运行情况。
  • 根据用户定义并配置的算子期望数据生成函数，回显期望算子输出和实际算子输出的对比测试结果，验证计算结果的准确性。

前提条件

  • 完成自定义算子如下交付件的开发：算子代码实现（TBE DSL）、算子原型定义和算子信息库定义，ST测试不会对算子适配插件进行测试。
  • MindStudio已连接硬件设备。

生成ST测试用例定义文件

  1. 创建ST测试用例，有以下三种方式：

    • 右键单击算子工程根目录，选择“New Cases > ST Case”。
    • 右键单击算子信息定义文件创建ST测试用例。

      TBE算子：{工程名} /tbe /op_info_cfg/ai_core/{SoC version} /xx.ini，选择“New Cases > ST Case”。

      AI CPU算子：{工程名} /cpukernel/op_info_cfg/aicpu_kernel/xx.ini，选择“New Cases > ST Case”。

    • 若已经存在了对应算子的ST Case，可以右键单击“testcases”目录，或者“testcases > st”目录，选择“New Cases > ST Case”，追加ST测试用例。

  2. 在弹出的“Create ST Cases for an Operator”界面中选择需要创建ST测试用例的算子。

    如下图所示。

    • Operator Name：下拉选择算子名称。
    • SoC Version：下拉选择对应 AI处理器的类型。若对AI CPU算子进行ST测试，默认选择aicpu_kernel。
    • 若不勾选“Import operator info from a model”，单击“OK”后，会生成shape为空的算子测试用例定义文件，用户需要进行shape信息的配置，用于生成测试数据及测试用例，也可以根据需要进行其他字段的配置，每个字段的详细要求可参见TBE算子ST测试用例定义文件参数解释或AI CPU算子ST测试用例定义文件参数解释。
    • 若用户勾选“Import operator info from a model”，选择包含算子的Tensorflow模型文件（*.pb）或者onnx格式的模型文件后，界面会显示获取到的模型文件的首层shape信息。

      用户也可以在“Input Nodes Shape”中修改首层输入的shape信息。单击“OK”后，工具会自动根据首层shape信息dump出选择算子的shape信息，生成对应的算子测试用例定义文件。

      此文件用于生成测试数据及测试用例，可以参见TBE算子ST测试用例定义文件参数解释或AI CPU算子ST测试用例定义文件参数解释进行相关字段的修改。

      该功能需要在运行环境中安装第三方框架（PyTorch使用该功能需要在运行环境中安装onnx库）。若为Windows操作系统则需要在Windsows本地安装TensorFlow框架和ONNX库。

  3. 若要将算子与标杆数据对比，需要定义并配置算子期望数据生成函数。

    1. 自定义实现算子期望数据生成函数。

      算子期望数据生成函数需要开发者使用Python语言自行实现，用于在CPU上运行生成标杆数据。例如，开发者可以使用numpy等接口实现与自定义算子功能相同的函数。标杆数据用来与自定义算子生成数据进行对比，根据对比结果确定自定义算子精度。算子期望数据生成函数用python语言实现，在一个python文件中可以实现多个算子期望数据生成函数。该函数的输入、输出、属性与自定义算子的输入、输出、属性的Format、Type、Shape保持一致。

    2. 配置算子测试用例定义文件。

      在算子测试用例文件中配置算子期望数据生成函数。有两种场景，分别为“Design”视图和“Text”视图下进行配置。

      • 若在“Design”视图下，配置方法为在“Expected Result Verification”下的“Script Path”中选择算子期望数据生成函数的python文件所在路径。在“Script Function”中输入算子期望数据生成函数的函数名。

        “Script Function”中可以输入算子期望数据生成函数的函数名，也可以为空。

        • 当输入算子期望数据生成函数的函数名时，ST测试时会使用该函数名对应的函数生成标杆数据。
        • 当输入为空时，会自动匹配Script Path路径下的python文件中与自定义算子同名的函数，用于ST测试时生成标杆数据。若无同名函数，则会提示匹配失败。
      • 若在Text视图下，增加“calc_expect_func_file”参数，其值为算子期望数据生成函数对应的文件路径及算子函数名，如：
        "calc_expect_func_file": "/home/teste/test_*.py:function",   //配置期望算子文件

        其中，/home/teste/test_*.py为算子期望数据生成函数的实现文件，function为对应的函数名称。算子期望数据生成函数文件路径和函数名称用冒号隔开。

        示例：test_add.py文件为add算子期望数据生成文件，函数实现如下：

        def calc_expect_func(input_x, input_y, out):
    res = input_x["value"] + input_y["value"]
    return [res, ]

        用户需根据开发的自定义算子完成算子期望数据生成函数。测试用例定义文件中的全部Input、Output、Attr的name作为算子期望数据生成函数的输入参数。

  4. 若要使用python脚本批量生成测试用例，采用fuzz方式生成测试用例。

    1. 实现fuzz测试参数生成脚本。该脚本可以自动生成测试用例定义文件中Input[xx]、Output[xx]、Attr内除了name的任何参数。
      下面以随机生成shape和value参数为例，创建一个fuzz_shape.py供用户参考。该示例会随机生成一个1-4维，每个维度取值范围在1-64的shape参数，用于ST测试。
      1. 导入脚本所需依赖。
        import numpy as np
      2. 实现fuzz_branch()方法，若用户自定义随机生成待测试参数的方法名，需要在算子测试用例定义文件中Fuzz Function字段配置自定义方法。
        def fuzz_branch():
    # 生成测试参数shape值
    dim = random.randint(1, 4)
    x_shape_0 = random.randint(1, 64)
    x_shape_1 = random.randint(1, 64)
    x_shape_2 = random.randint(1, 64)
    x_shape_3 = random.randint(1, 64)
    if dim == 1:
        shape = [x_shape_0]
    if dim == 2:
        shape = [x_shape_0, x_shape_1]
    if dim == 3:
        shape = [x_shape_0, x_shape_1, x_shape_2]
    if dim == 4:
        shape = [x_shape_0, x_shape_1, x_shape_2, x_shape_3]
    # 根据shape随机生成x1、x2的value
    fuzz_value_x1 = np.random.randint(1, 10, size=shape)
    fuzz_value_x2 = np.random.randint(1, 10, size=shape)

    # 用字典数据结构返回shape值，将生成的shape值返回给input_desc的x1、x2和output_desc的y的shape参数。其中x1、x2、y测试用例定义文件输入、输出的name。
    return {"input_desc": {"x1": {"shape": shape,"value": fuzz_value_x1},
                           "x2": {"shape": shape,"value": fuzz_value_x2}},
            "output_desc": {"y": {"shape": shape}}}
        • 该方法生成测试用例定义文件Input[xx]、Output[xx]、Attr内除了name的任何参数，用户可自定义实现参数的生成方法，以满足算子测试的需求。
        • 该方法的返回值为字典格式，将该方法生成的参数值以字典的方式赋值给算子进行st测试。返回的字典结构与测试用例定义文件中参数结构相同。
        • 该方法生成的测试用例定义文件命名格式为Test_optype_001_ sub_case_001_format_type，format和type的取值为该case中第一个Output中的值。若case中没有Output，则文件名不包含后缀，文件名为Test_OpType_001_ sub_case_001。
    2. 将算子测试用例定义文件中需要随机生成的字段的值设为"fuzz"。

      此时显示K-Level Test Cases配置项，包含Fuzz Script Path和Fuzz Case Num选项。

    3. 在Fuzz Script Path中输入fuzz生成测试参数的脚本的相对路径或绝对路径，如：“fuzz_shape.py”。
    4. 在Fuzz Case Num中输入利用fuzz脚本生成多少条测试用例，如：2000。
    5. （可选）在Fuzz Function中配置自定义的随机生成待测试参数的方法，若不配置默认使用fuzz_branch方法。
    6. fuzz用例不采取正交生成，因此在该场景下算子测试用例定义文件中各字段的取值需唯一。

  5. 修改Case信息后，单击“Save”，修改会保存到算子测试用例定义文件。

    TBE算子测试用例定义文件存储目录为算子工程根目录下的“testcases/st/OpType/{SoC Version}”文件夹下，命名为OpType_case_timestamp.json。

    AI CPU算子测试用例定义文件存储目录为算子工程根目录下的“testcases/st/OpType/aicpu_kernel”文件夹下，命名为OpType_case_timestamp.json

    请勿更改算子测试用例定义文件命名格式，以及请勿将其他文件的以该命名格式保存在算子工程根目录下的“testcases/st/OpType/{SoC Version}”或“testcases/st/OpType/aicpu_kernel”文件夹下，否则会导致文件解析错误。

运行ST测试用例

  1. （可选）AI CPU算子引用的三方库路径可通过修改算子工程目录下的“cpukernel/CMakeLists.txt”文件进行配置。

    • include_directories：添加头文件所在的目录。

      示例如下：

      include_directories(
directoryPath1
directoryPath2
)
    • link_directories：添加库文件所在的目录。

      示例如下：

      link_directories(
directoryPath3
directoryPath4
)
    • link_libraries：添加编译算子依赖的库文件。

      示例如下：

      link_libraries(
libName1
libName2)

    关于cmake参数的详细介绍，请参见https://cmake.org/cmake/help/latest/guide/tutorial/index.html，选择对应版本后查看参数。

  2. 运行ST测试用例。

    右键单击生成ST测试用例定义文件中生成的ST测试用例定义文件（TBE算子：“testcases> st > OpType > {SoC Version} > xxxx.json”，AI CPU算子：“testcases > st > OpType > aicpu_kernel > xxxx.json”），选择“Run ST Case 'xxx.json'”。
    表1 运行配置信息

    参数

    说明

    Name

    运行配置名称，用户可以自定义。

    Test Type

    选择st_cases 。

    Execute Mode
    • Remote Execute：远程执行测试
    • Local Execute：本地执行测试
      说明：
      • Windows操作系统中不支持Local Execute功能。
      • 动态shape算子工程运行ST测试时，若编译机器跟运行机器是两台不同的机器，在编译机器和运行机器上都部署算子包，方可支持Remote Execute功能。

    Deployment

    当Execute Mode选择Remote Execute时，deployment功能，详细请参见Ascend Deployment，可以将指定项目中的文件、文件夹同步到远程指定机器的指定目录。

    CANN Machine

    CANN工具所在设备deployment信息。

    说明：

    该参数仅支持Windows操作系统。

    Environment Variables
    • 在文本框中添加环境变量。

      PATH_1=路径1;PATH_2=路径2

      多个环境变量用英文分号隔开。

    • 也可以单击 [image] ，在弹出的对话框中填写。
      • 在Name中输入环境变量名称：PATH_1。
      • 在Value中输入环境变量值：路径1。

    Operator Name

    选择需要运行的算子。

    SoC Version

    选择对应 AI处理器类型。

    说明：

    对应 AI处理器类型为Atlas 推理系列产品（Ascend 310P处理器）、Atlas 训练系列产品系列时，请用户根据实际情况选择具体的类型。

    Product Form

    针对AI CPU算子配置产品形态。若SoC Version配置为Ascend310时显示该配置项。

    • EP
    • RC

    Executable File Name

    下拉选择需要执行的测试用例定义文件。

    若对AI CPU算子进行ST测试，测试用例文件前有（AI CPU）标识。

    Toolchain

    工具链配置器，根据已安装的CANN包预置架构一致的自定义Toolchain，支持本地和远程编译功能。

    可单击“Manage toolchains…”自定义配置Toolchain，配置详情请参见Toolchains。

    Case Names

    选择运行的Case Name。

    默认全选所有用例，可以去除勾选部分不需要运行的用例。

    Enable Auto Build&Deploy

    选择是否在ST运行过程中执行编译和部署。

    默认开启。

    Advanced Options

    高级选项

    ATC Log Level

    选择ATC日志级别

    • INFO
    • DEBUG
    • WARNING
    • ERROR
    • NULL

    Precision Mode

    精度模式

    • force_fp16
    • allow_mix_precision
    • allow_fp32_to_fp16
    • must_keep_origin_dtype

    Device Id

    设备ID，设置运行ST测试的芯片ID。用户根据使用的AI芯片ID填写。

    Error Threshold

    配置自定义精度标准，取值为含两个元素的列表：[val1，val2]

    • val1：算子输出结果与标杆数据误差阈值，若误差大于该值则记为误差数据。
    • val2：误差数据在全部数据占比阈值。若误差数据在全部数据占比小于该值，则精度达标，否则精度不达标。

    取值范围为[0.0,1.0]。

    Generate Error Report

    生成比对不一致数据的报表。

    该选项默认开启。针对比对失败的用例，将算子期望数据与实际用例执行结果不一致的数据独立生成{case.name}_error_report.csv文件，文件所在目录为“testcases/st/out/OpType/run/out/test_data/data/st_error_reports”。单个csv文件保存数据的上限为5万行，超过则依次生成新的.csv文件，文件命名如：{case.name}_error_report0.csv。

    使用“Generate error report”功能前，需要指定算子期望数据生成函数自定义脚本，请参见3。

    Enable System Profier

    使能profiling，获取算子在对应 AI处理器上的性能数据。该选项默认关闭。

    该功能需要将运行环境中的msprof工具所在路径配置到PATH环境变量中，msprof工具所在路径为：toolkit工具路径下的toolkit/tools/profiler/bin/msprof。

    对于TBE算子，打开情况下会出现下拉框，可下拉选择AI Core性能指标采集项，采集项如下：

    • PipeUtilization（默认）
    • ArithmeticUtilization
    • Memory
    • MemoryL0
    • MemoryUB
    • ResourceConflictRatio

  3. 运行用户设置。

    运行用户需在deployment中添加，并且该用户必须为HwHiAiUser属组。配置deployment请参见Ascend Deployment。

  4. 在运行环境上有两种方式配置相关组件的环境变量。

    • 在远程设备上配置环境变量。

      针对Ascend EP，需要在硬件设备的Host侧配置安装组件路径的环境变量。

      以Host侧运行用户在~/.bashrc文件中配置runtime或compiler、driver组件的安装路径。若没有配置，请参考以下操作。

      1. 修改~/.bashrc文件，在文件中添加如下内容。
        # Ascend-cann-toolkit环境变量（请根据实际路径修改）
source $HOME/Ascend/ascend-toolkit/set_env.sh
      2. 使环境变量生效。
        source ~/.bashrc
    • 在Environment Variables中添加环境变量。

      在运行ST测试用例中运行的窗口对Environment Variables参数进行环境变量配置。

      • 在文本框中添加环境变量。
        ASCEND_DRIVER_PATH=/usr/local/Ascend/driver;
ASCEND_HOME=/usr/local/Ascend;
ASCEND_AICPU_PATH=${ASCEND_HOME}/<target architecture>-linux;    //仅AI CPU算子需要配置
#若远程设备为推理环境：
LD_LIBRARY_PATH=${ASCEND_DRIVER_PATH}/lib64:${ASCEND_HOME}/lib64:$LD_LIBRARY_PATH;
#若远程设备为训练环境：

        请根据driver和CANN的实际安装路径配置，远程操作系统的使用架构修改环境变量内容。

      • 单击 [image] ，在弹出的对话框中填写。

        分别在Name中输入环境变量名称，在Value中输入环境变量值。

  5. 单击“Run”。

    MindStudio会根据算子测试用例定义文件在算子根目录“testcases/st/out/<operator name>”下生成测试数据和测试代码，并编译出可执行文件，在指定的硬件设备上执行测试用例。运行成功后会打印对比报告及保存运行信息。

    • 将执行结果和与标杆数据对比报告打印到Output窗口中。
      • 总体信息

        total_count：对比元素总数量。

        max_diff_thd：最大误差阈值，若存在预期结果与真实结果误差超出该阈值，直接判定该测试用例失败。

      • 详细信息

        Index（对比元素序号）、ExpectOut（期望输出）、RealOut（实际输出）、FpDiff（精度误差）、RateDiff（误差比）。

      • 误差容忍信息及结果

        预期结果与真实结果误差小于DiffThd（误差阈值）的数量占比高于PctThd（准确率阈值）则Result（比对结果）为通过，否则失败，同时会打印出PctRlt（实际准确率）。

      • system_profiler信息及结果

        在步骤2开启“Enable System Profier”开关，配置采集项后才会以表格形式输出system_profiler信息及结果。具体字段含义请参见《CANN 6.3.RC2 性能分析工具使用指南》或《CANN 6.2.RC2 性能分析工具使用指南》。

    • 在算子根目录“testcases/st/out/<operator name>”下生成st_report.json文件。st_report.json文件信息含义请参见表2。
      表2 st_report.json报表主要字段及含义

      字段

      说明

      run_cmd

      -

      -

      命令行命令。

      report_list

      -

      -

      报告列表，该列表中可包含多个测试用例的报告。

      trace_detail

      -

      运行细节。

      st_case_info

      测试信息，包含如下内容。

      • expect_data_path：期望计算结果路径
      • case_name：测试用例名称
      • input_data_path：输入数据路径
      • planned_output_data_paths：实际计算结果输出路径
      • op_params：算子参数信息

      stage_result

      运行各阶段结果信息，包含如下内容。

      • status：阶段运行状态，表示运行成功或者失败
      • result：输出结果
      • stage_name：阶段名称
      • cmd：运行命令

      case_name

      -

      测试名称。

      status

      -

      测试结果状态，表示运行成功或者失败。

      expect

      -

      期望的测试结果状态，表示期望运行成功或者失败。

      summary

      -

      -

      统计测试用例的结果状态与期望结果状态对比的结果。

      test case count

      -

      测试用例个数。

      success count

      -

      测试用例的结果状态与期望结果状态一致的个数。

      failed count

      -

      测试用例的结果状态与期望结果状态不一致的个数。

父主题： 算子开发


其他功能及操作

  • 算子工程管理
  • 查看单算子Profiling数据
  • UT测试接口参考
  • ST测试其他功能
父主题： 算子开发


算子工程管理

  • 导入算子工程样例
  • 切换到算子逻辑视图
  • 新增/删除算子
父主题： 其他功能及操作


导入算子工程样例

Ascend-cann-toolkit开发套件包提供了完整的算子实现代码样例，可以参考本节内容导入算子工程样例，无需修改算子代码即可体验算子验证、算子部署、算子网络验证过程。

  1. 配置完成Ascend-cann-toolkit开发套件包后，Linux场景下需执行如下操作。

    cp -r /tools/msopgen/template/operator_demo_projects $HOME/MindstudioProjects
chmod -R 750 $HOME/MindstudioProjects/operator_demo_projects

    $HOME/MindstudioProjects为用户自定义存放工程的目录。

  2. 进入工程导入页面。

    • MindStudio欢迎界面：在“Welcome to MindStudio”窗口中，单击“Open”。
    • MindStudio工程界面：在顶部菜单栏单击“File > Open...” 。

  3. 在“Open File or Project”窗口中，选择样例工程所在文件夹。

    • Windows场景下样例工程所在路径：C:\Users\用户名\.mindstudio\huawei\adk\remote\CANN包版本号\toolkit\tools\msopgen\template\operator_demo_projects
    • Linux场景下样例工程所在路径：$HOME/MindstudioProjects/operator_demo_projects

  4. 单击“OK”，导入样例工程。

    如该工程存在代码风险，在打开时会弹出信任窗口。
    • 如该工程源码可被信任且安全，请单击“Trust Project”。（可通过勾选“Trust project in <工作区目录>”复选框信任该目录下的所有工程。）
    • 如该工程不被信任，仅用于查看其中源码，请单击“Preview in Safe Mode”进入安全模式预览。
    • 如放弃打开该工程，请单击“Don't Open”取消工程导入操作。

  5. 若工作窗口已打开其他工程，会出现确认提示。

    • 选择“This Window”，则直接在当前工作窗口打开新创建的工程。
    • 选择“New Window”，则新建一个工作窗口打开新创建的工程。

父主题： 算子工程管理


切换到算子逻辑视图

开发者可以将前算子工程视图切换为算子逻辑视图，该视图按照算子维度展示算子工程目录下的文件，实际文件结构和位置不发生变化。

开发者可以在算子逻辑视图下进行算子开发、算子验证、并且能方便地新增和删除算子。

在算子工程的Project窗口中，单击 [image] 按钮，在下拉框中选择“Operators”，如图1所示。
图1 切换入口
切换成功后，可以查看算子逻辑视图，如图2所示。
图2 查看算子逻辑视图

该视图以算子维度展示算子交付件，包括算子信息定义文件、算子实现文件、算子原型定义文件、算子插件实现文件、算子融合信息定义文件和算子测试用例。

父主题： 算子工程管理


新增/删除算子

本节介绍如何在已创建的工程中新增算子和删除已有算子。

在算子工程视图中新增算子

在算子工程视图中，选中算子工程，右键选择“New > Operator”，可以在弹出框中设置新算子信息，如图1所示。从而实现在当前算子工程中实现多个算子，如果算子类型重复，会提示用户是否进行覆盖。

图1 在算子工程视图中新增算子

在算子逻辑视图中新增算子

在算子逻辑视图中，选中算子工程，右键选择“New > Operator”，可以在弹出框中新增算子信息，如图2所示。如果算子类型重复，会提示用户是否进行覆盖。

图2 在算子逻辑视图中新增算子

在算子逻辑视图中删除算子

在算子逻辑视图中，选中待删除的算子名称，右键选择“Delete Operator”，如图3所示。
图3 在算子逻辑视图中删除算子
父主题： 算子工程管理


查看单算子Profiling数据

查看Profiling数据

在执行TBE算子UT测试时，设置运行配置参数Target为Simulator__TMModel，并运行UT测试用例。Profiling执行成功后，在IDE下方控制台会展示执行仿真过程中所生成的Profiling性能数据。如果已经执行过UT测试，通过右键单击算子工程名称，并选择“View Profiling Result”查看Profiling性能数据。Profiling性能数据展示如图1所示。
图1 查看Profiling性能数据
并行度视图（Parallel Analysis）展示单算子运行中各个指令执行的并行度情况，横轴为时间（Tick，时钟周期），纵轴为各指令单元，鼠标移动到时间块上，可以显示单条指令的消耗时间以及相关指令。

“Start”和“End”表示数据展示的时间范围，“End”为Cycle数，此数值越大，代表运行时间越长。图中数据展示的时间范围可通过滚动鼠标放大或缩小进行变更。

设置代码跳转功能

针对TIK方式开发的算子，如果使用从并行度视图（Parallel Analysis）跳转到TBE、CCE代码功能，需要在运行UT测试用例前，开启Debug开关。

开启Debug开关的方法：在算子代码中的BuildCCE接口中增加config参数，并设置参数tbe_debug_level值为2，编译生成cce代码，生成的算子目标文件中包含debug信息。

TIK算子开启Debug配置参数如下。

        config = {
                 "tbe_debug_level": 2
                 }

         self.tik_instance.BuildCCE(
             kernel_name = self.kernel_name,
             inputs=(self.var_gm, self.indices_gm, self.updates_gm),
             enable_l2 = Fales,
             config=config)

TIK算子开启Debug开关，并执行UT测试后，显示的并行度视图（Parallel Analysis）如图2所示。右键单击时间块，显示“Goto TIK Code”和“Goto CCE Code”，单击即可跳转。

图2 并行度视图（Parallel Analysis）
  • 并行度视图（Parallel Analysis）的右上角设置了隐藏TIK Code内部操作的开关，该默认关闭。开启后，当单个TIK Code代码块无法跳转时，在并行度视图上隐藏该代码块。
  • “Goto TIK Code”跳转功能暂不支持跳转至对应代码行，需自行查找对应的TIK Code。
父主题： 其他功能及操作


UT测试接口参考

  • OpUT
  • BroadcastOpUT
  • ElementwiseOpUT
  • ReduceOpUT
父主题： 其他功能及操作


OpUT

概述

OpUT为UT测试框架的基类，提供了测试用例定义及测试用例执行的接口，主要包含如下两个接口：

  • add_case
  • add_precision_case

OpUT测试类定义

  • 函数原型

    OpUT(op_type, op_module_name=None, op_func_name=None)

  • 参数说明
    • op_type：算子的类型。
    • op_module_name：算子的module名称（即算子的实现文件名称和路径），例如：impl.add（文件路径为：impl/add.py）。默认值为None，可根据op_type自动生成，op_type到算子实现文件名称的转换规则可参见4，例如BiasAdd算子自动生成module名称"impl.bias_add"。
    • op_func_name：算子的接口名称，算子实现文件中的算子接口名。默认值为None，可根据op_type自动生成，op_type到算子实现文件中接口名称的转换规则可参见4，例如Add算子，则需要在impl/add.py中存在add接口，接口定义如下所示：
      @check_op_params(REQUIRED_INPUT, REQUIRED_INPUT, REQUIRED_OUTPUT, KERNEL_NAME)
def add(input_x, input_y, output_z, kernel_name="add"):

add_case接口

  • 函数原型

    OpUT.add_case(support_soc=None, case=None)

  • 功能说明

    添加算子编译的测试用例，测试算子是否支持相关规格，编译出“.o”文件。

  • 参数说明
    • support_soc：测试该用例是否支持对应的对应 AI处理器，对应 AI处理器的取值范围可从“$HOME/Ascend/ascend-toolkit/latestcompiler/data/platform_config”目录下查看，对应“*.ini”文件的名字即为可配置的对应 AI处理器类型。support_soc支持的数据类型为str、tuple或者list，tuple或者list表示可以支持多个SoC。若配置为“all”或者“None”，表示支持所有的SoC。
    • case：该参数为dict类型。
      不带属性算子case示例：
      {
    "params": [
        {
          "shape": (32, 64),
          "ori_shape": (32, 64),
          "format": "ND",
          "ori_format": (32, 64),
          "dtype": "float16"
        },
        {
          "shape": (32, 64),
          "ori_shape": (32, 64),
          "format": "ND",
          "ori_format": (32, 64),
          "dtype": "float16"
        }
    ],
    "case_name": "test_add_case_1",
    "expect": "success"
}
      带属性算子case示例：
      # 以conv2d算子为例，详细算子实现请参见“样例工程”提供的conv2d算子实现文件。
# def get_op_support_info(inputs, weights, bias, offset_w, outputs, strides, pads, dilations,groups=1, data_format='NCHW', offset_x=0, kernel_name="conv2d")

{
    "params": [
        # inputs参数（tensor）
        {'shape': (1, 1, 16, 16, 16), "format": "NC1HWC0", 'ori_shape': (1, 16, 16, 16), 'ori_format': 'NCHW', 'dtype': 'float16', "param_type": "input", "value_range": [1.0, 2.0]},
        # weights参数（tensor）
        {'shape': (1, 1, 16, 16), "format":"FRACTAL_Z", 'ori_shape': (16, 16, 1, 1), 'ori_format': 'NCHW', 'dtype': 'float16', "param_type": "input", "value_range": [1.0, 2.0]},
        # bias参数
        None,
        # offset_w参数
        None,
        # outputs参数（tensor）
        {'shape':(1, 1, 16, 16, 16), 'ori_shape':(1, 16, 16, 16), "format": "NC1HWC0",  'ori_format': 'NCHW', "param_type": "output", 'dtype': 'float16'},
        # strides参数
        (1, 1, 1, 1),
        # pads参数
        (0, 0, 0, 0),
        # dilations参数
        (1, 1, 1, 1),
        # 可选groups参数
         1,
        # 可选data_format参数
         'NCHW',
        # 可选offset_x参数
         0
    ],
    "case_name": "test_conv2d_case_1",
    "expect": "success"
}
      该dict中key字段含义如表1所示：
      表1 key字段配置信息

      参数

      值

      params

      该字段在测试用例运行时透传给算子接口。该字段中的参数应与算子接口的参数顺序一致。

      • 若输入的参数为tensor，可选择如下字段传递。
        • shape：tensor的形状
        • ori_shape：tensor的原始形状
        • format：tensor的格式
        • ori_format：tensor的原始格式
        • param_type：tensor类型
        • dtype：tensor的数据类型
        • value_range：tensor取值范围，默认值为[0.1, 1.0]
      • 若输入的参数为非tensor，请传递实际参数值。
      • 若输入的参数为空，请传递None。

      case_name

      测试用例的名称，可选参数。

      若不设置，测试框架会自动生成用例名称，生成规则如下：

      test_{op_type}_auto_case_name_{case_count}

      例如： test_Add_auto_case_name_1

      expect

      期望结果。

      默认为期望“success”，也可以是预期抛出的异常，例如RuntimeError。

add_precision_case接口

  • 函数原型

    OpUT.add_precision_case(support_soc=None, case)

  • 功能说明

    添加算子编译+精度测试的用例。

  • 参数说明
    • support_soc：测试该用例是否支持对应的对应 AI处理器，对应 AI处理器的取值范围可从“compiler/data/platform_config”目录下查看，对应“*.ini”文件的名字即为可配置的对应 AI处理器类型。support_soc支持的数据类型为str、tuple或者list，tuple或者list表示可以支持多个SoC。若配置为“all”或者“None”，表示支持所有的SoC。
    • case：该参数为dict类型，示例如下：
      不带属性算子case示例：
      {
    "params": [
        {
          "shape": (32, 64),
          "ori_shape": (32, 64),
          "format": "ND",
          "ori_format": "ND",
          "dtype": "float16",
          "param_type": "input"
        },
        {
          "shape": (32, 64),
          "ori_shape": (32, 64),
          "format": "ND",
          "ori_format": "ND",
          "dtype": "float16",
          "param_type": "output"
        }
    ],
    "case_name": "test_add_case_1",
    "calc_expect_func": np_add #一个函数
    "precision_standard": precision_info.PrecisionStandard(0.001, 0.001)  #可选字段
}
      带属性算子case示例：
      # 以conv2d算子为例，详细算子实现请参见“样例工程”提供的conv2d算子实现文件。
# def get_op_support_info(inputs, weights, bias, offset_w, outputs, strides, pads, dilations,groups=1, data_format='NCHW', offset_x=0, kernel_name="conv2d")

{
    "params": [
        # inputs参数（tensor）
        {'shape': (1, 1, 16, 16, 16), "format": "NC1HWC0", 'ori_shape': (1, 16, 16, 16), 'ori_format': 'NCHW', 'dtype': 'float16', "param_type": "input", "value_range": [1.0, 2.0]},
        # weights参数（tensor）
        {'shape': (1, 1, 16, 16), "format":"FRACTAL_Z", 'ori_shape': (16, 16, 1, 1), 'ori_format': 'NCHW', 'dtype': 'float16', "param_type": "input", "value_range": [1.0, 2.0]},
        # bias参数
        None,
        # offset_w参数
        None,
        # outputs参数（tensor）
        {'shape':(1, 1, 16, 16, 16), 'ori_shape':(1, 16, 16, 16), "format": "NC1HWC0",  'ori_format': 'NCHW', "param_type": "output", 'dtype': 'float16'},
        # strides参数
        (1, 1, 1, 1),
        # pads参数
        (0, 0, 0, 0),
        # dilations参数
        (1, 1, 1, 1),
        # 可选groups参数
         1,
        # 可选data_format参数
         'NCHW',
        # 可选offset_x参数
         0
    "case_name": "test_conv2d_case_1",
    "calc_expect_func": np_conv2d #一个函数
    "precision_standard": precision_info.PrecisionStandard(0.001, 0.001)  #可选字段
}
      该dict中key字段含义如表2下：
      表2 key字段配置信息

      参数

      值

      params

      该字段在测试用例运行时透传给算子接口。该字段中的参数应与算子接口的参数顺序一致。

      • 若输入的参数为tensor，可选择如下字段传递。
        • shape：tensor的形状
        • ori_shape：tensor的原始形状
        • format：tensor的格式
        • ori_format：tensor的原始格式
        • param_type：tensor类型
        • dtype：tensor的数据类型
        • value_range：tensor取值范围，默认值为[0.1, 1.0]
      • 若输入的参数为非tensor，请传递实际参数值。
      • 若输入的参数为空，请传递None。

      case_name

      测试用例的名称，可选参数。若不设置，测试框架会自动生成用例名称，生成规则如下：

      test_{op_type}_auto_case_name_{case_count}

      例如： test_Add_auto_case_name_1

      calc_expect_func

      期望结果生成函数。

      precision_standard

      自定义精度标准，取值为：(rtol, atol, Max_atol)。

      • rtol：相对容忍率
      • atol：绝对容忍率
      • Max_atol：（可选）最大容忍率
      说明：
      若不配置此字段，按照如下默认精度与期望数据进行比对：
      • 数据类型为float16时：双千分之一，(0.001, 0.001, 0.1)，即每个数据之间的误差不超过千分之一，误差超过千分之一的数据总和不超过总数据数的千分之一。
      • 数据类型为float32时：双万分之一，(0.0001, 0.0001, 0.01)，即每个数据之间的误差不超过万分之一，误差超过万分之一的数据总和不超过总数据数的万分之一。
      • 数据类型为int8或uint8时：(0.001, 1, 1)，即每个数据之间的误差不超过一，误差超过一的数据总和不超过总数据数的千分之一。
  • 调用示例
    示例1：
    from op_test_frame.ut import OpUT
# "ut_case" 为UT测试框架的关键字，不可修改
ut_case = OpUT("Add", "impl.add", "add")

def np_add(x1, x2, y):
    y = (x1.get("value") + x2.get("value"), )
    return y

ut_case.add_precision_case(case={
    "params": [
        {
            "shape": (32, 64),
            "ori_shape": (32, 64),
            "format": "ND",
            "ori_format": "ND",
            "dtype": "float16",
            "param_type": "input"
        },
        {
            "shape": (32, 64),
            "ori_shape": (32, 64),
            "format": "ND",
            "ori_format": "ND",
            "dtype": "float16",
            "param_type": "input"
        },
        {
            "shape": (32, 64),
            "ori_shape": (32, 64),
            "format": "ND",
            "ori_format": "ND",
            "dtype": "float16",
            "param_type": "output"
        }
    ],
    "case_name": "test_add_case_1",
    "calc_expect_func": np_add
})

if __name__ == '__main__':
    ut_case.run("Ascend910",None,"ca","/home/allan/Ascend/toolkit/tools/simulator")

    示例中仿真器所在的路径以“home/allan/Ascend/toolkit/tools/simulator”为例，MDC仿真器所在的路径为“/home/${USER}/Ascend/ascend-toolkit/5.0.mdc610/toolkit/tools/simulator”，其中“/home/${USER}”为仿真器的安装路径。

    ut_case.run：请参见run接口。

    此样例未设置算子的输入数据值，测试框架将默认使用np.random.uniform(value_range, size=shape).astype(dtype)为每一个输入自动生成输入数据。

    其中value_range使用默认值[0.1, 1.0]，shape和dtype的取值为“params”中的每一个输入。value_range也可以通过参数指定，如下所示：

    {
    "shape": (32, 64),
    "ori_shape": (32, 64),
    "format": "ND",
    "ori_format": "ND",
    "dtype": "float16",
    "param_type": "input",
    "value_range": [2.0, 3.0]
}

    也可以指定输入的值，如下所示：

    {
    "shape": (32, 64),
    "ori_shape": (32, 64),
    "format": "ND",
    "ori_format": "ND",
    "dtype": "float16",
    "param_type": "input",
    "value": np.zeros((32, 64), np.float16)
}

    示例2：

    自定义精度标准示例如下：

    from op_test_frame.common import precision_info
from op_test_frame.ut import OpUT

ut_case = OpUT("Add")
ut_case.add_precision_case(case={
    "params": [
        {
            "shape": (32, 64),
            "ori_shape": (32, 64),
            "format": "ND",
            "ori_format": "ND",
            "dtype": "float16",
            "param_type": "input"
        },
        {
            "shape": (32, 64),
            "ori_shape": (32, 64),
            "format": "ND",
            "ori_format": "ND",
            "dtype": "float16",
            "param_type": "input"
        },
        {
            "shape": (32, 64),
            "ori_shape": (32, 64),
            "format": "ND",
            "ori_format": "ND",
            "dtype": "float16",
            "param_type": "output"
        }
    ],
    "case_name": "test_add_case_1",
    "calc_expect_func": np_add,
    "precision_standard": precision_info.PrecisionStandard(0.1, 0.1) # 使用精度标准双十分之一，与期望数据进行比对
})

run接口

  • 函数原型

    OpUT.run(soc, case_name=None, simulator_mode=None, simulator_lib_path=None)

  • 功能说明

    执行测试用例。

  • 参数说明
    • soc：执行测试用例的对应 AI处理器，对应 AI处理器的取值范围可从/compiler/data/platform_config目录下查看，对应“*.ini”文件的名字即为可配置的对应 AI处理器类型。support_soc支持的数据类型为str、tuple或者list，tuple或者list表示可以支持多个SoC。
    • case_name：指定执行的case，配置为add_case接口及add_precision_case接口中的“case_name”。
    • simulator_mode：默认为None，如果仅跑算子编译的测试用例，不需要指定。在添加了精度测试用例的时候，需要指定仿真的模式，使用"ca"或者"pv"。 如果指定"tm"将仅输出打点图，不进行精度比对。
    • simulator_lib_path：仿真库所在的路径。

      该路径结构如下所示：

      simulator_lib_path/
  Ascend910/
      lib/
          libpv_model.so
          ...
  Ascend310/
      lib/
          libpv_model.so
          ...

    使用MindStudio运行UT测试用例时，无需用户手工调用OpUT.run接口。

父主题： UT测试接口参考


BroadcastOpUT

概述

BroadcastOpUT继承了OpUT，包含了OpUT的能力。

BroadcastOpUT主要供双输入单输出的Broadcast类型的算子进行测试用例的定义，例如Add、Mul等算子。BroadcastOpUT为这类算子提供了更加便利的接口，例如，创建算子编译用例时，对于一些简单场景无需输入format等信息。

BroadcastOpUT测试类定义

  • 函数原型

    BroadcastOpUT(op_type, op_module_name=None, op_func_name=None)

  • 参数说明
    • op_type：算子的类型。
    • op_module_name：算子的module名称（即算子的实现文件名称和路径），例如：impl.add（文件路径为：impl/add.py）。默认值为None，可根据op_type自动生成，op_type到算子实现文件名称的转换规则可参见4，例如BiasAdd算子自动生成module名称"impl.bias_add"。
    • op_func_name：算子的接口名称，算子实现文件中的算子接口名。默认值为None，可根据op_type自动生成，op_type到算子实现文件中接口名称的转换规则可参见4，例如Add算子，则需要在impl/add.py中存在add接口，接口定义如下所示：
      @check_op_params(REQUIRED_INPUT, REQUIRED_INPUT, REQUIRED_OUTPUT, KERNEL_NAME)
def add(input_x, input_y, output_z, kernel_name="add"):

add_broadcast_case接口

  • 函数原型

    BroadcastOpUT.add_broadcast_case(self, soc, input_1_info, input_2_info, output_info=None,expect=op_status.SUCCESS, case_name=None)

  • 功能说明

    添加算子编译的测试用例，测试算子是否支持相关规格，编译出“.o”文件。

  • 参数说明
    • soc：测试该用例是否支持对应的对应 AI处理器，对应 AI处理器的取值范围可从“compiler/data/platform_config”目录下查看，对应“*.ini”文件的名字即为可配置的对应 AI处理器类型。support_soc支持的数据类型为str、tuple或者list，tuple或者list表示可以支持多个SoC。若配置为“all”或者“None”，表示支持所有的SoC。
    • input_1_info：算子的第一个输入的信息，有两种形式：
      • [dtype, shape, format, ori_shape, ori_format]
      • [dtype, shape, format]：此种形式下，ori_shape与ori_format的取值与shape、format的取值相同。
    • input_2_info：算子的第二个输入的信息，与input_1_info含义相同。
    • output_info：默认为None，不需要填写。
    • expect： 期望是否编译成功，默认为“op_status.SUCCESS”，当测试异常场景时，期望的结果可配置为RuntimeError。
    • case_name：默认为None，测试框架会自动生成测试用例的名称。

    示例：

    ut_case.add_broadcast_case("all", ["float16", (32, 32), "ND"], ["float16", (32, 32), "ND"])

ut_case.add_broadcast_case("all", ["float16", (32, 32), "ND", (32, 32), "ND"], ["float16", (32, 32), "ND", (32, 32), "ND"])

# 期望异常的用例
ut_case.add_broadcast_case("all", ["float16", (31, 32), "ND"], ["float16", (32, 32), "ND"], expect=RuntimeError)

add_broadcast_case_simple接口

  • 函数原型

    BroadcastOpUT.add_broadcast_case_simple(self, soc, dtypes, shape1, shape2, expect=op_status.SUCCESS, case_name=None)

  • 功能说明

    添加算子编译的测试用例，测试算子是否支持相关规格，编译出“.o”文件。此接口较add_broadcast_case更加简化。

  • 参数说明
    • soc：测试该用例是否支持对应的对应 AI处理器，对应 AI处理器的取值范围可从/compiler/data/platform_config目录下查看，对应“*.ini”文件的名字即为可配置的对应 AI处理器类型。support_soc支持的数据类型为str、tuple或者list，tuple或者list表示可以支持多个SoC。若配置为“all”或者“None”，表示支持所有的SoC。
    • dtypes：需要测试的数据类型，填写多个数据，相当于一次添加了多个测试用例。
    • shape1：算子的第一个输入的shape。
    • shape2：算子的第二个输入的shape。
    • expect： 期望是否编译成功，默认为“op_status.SUCCESS”，当测试异常场景时，期望的结果可配置为RuntimeError。
    • case_name：默认为None，测试框架会自动生成测试用例的名称。

    此接口较add_broadcast_case接口，相当于将输入的所有format配置为“ND”。

    示例：

    ut_case.add_broadcast_case_simple(["Ascend910", "Ascend310"], ["float16", "float32"], (32, 32), (32, 32))

    以上用例与调用如下add_case接口的用例实现功能相同：

    ut_case.add_case(support_soc=["Ascend910", "Ascend310"], case={
    "params": [{
        "shape": (32, 32),
        "ori_shape": (32, 32),
        "format": "ND",
        "ori_format": "ND",
        "dtype": "float16"
    }, {
        "shape": (32, 32),
        "ori_shape": (32, 32),
        "format": "ND",
        "ori_format": "ND",
        "dtype": "float16"
    }, {
        "shape": (32, 32),
        "ori_shape": (32, 32),
        "format": "ND",
        "ori_format": "ND",
        "dtype": "float16"
    }]
})

ut_case.add_case(support_soc=["Ascend910", "Ascend310"], case={
    "params": [{
        "shape": (32, 32),
        "ori_shape": (32, 32),
        "format": "ND",
        "ori_format": "ND",
        "dtype": "float32"
    }, {
        "shape": (32, 32),
        "ori_shape": (32, 32),
        "format": "ND",
        "ori_format": "ND",
        "dtype": "float32"
    }, {
        "shape": (32, 32),
        "ori_shape": (32, 32),
        "format": "ND",
        "ori_format": "ND",
        "dtype": "float32"
    }]
})
父主题： UT测试接口参考


ElementwiseOpUT

概述

ElementwiseOpUT继承了OpUT，包含了OpUT的能力。

ElementwiseOpUT主要供单输入单输出的Elementwise类型的算子进行测试用例的定义，例如Abs, Square等算子。

ElementwiseOpUT为这类算子提供了更加便利的接口，例如，创建算子编译用例时，对于一些简单场景无需输入format等信息。

ElementwiseOpUT测试类定义

  • 函数原型

    ElementwiseOpUT(op_type, op_module_name=None, op_func_name=None)

  • 参数说明
    • op_type：算子的类型。
    • op_module_name：算子的module名称（即算子的实现文件名称和路径），例如：impl.add（文件路径为：impl/add.py）。默认值为None，可根据op_type自动生成，op_type到算子实现文件名称的转换规则可参见4，例如MaximumGrad算子自动生成module名称"impl.maximum_grad"。
    • op_func_name：算子的接口名称，算子实现文件中的算子接口名。默认值为None，可根据op_type自动生成，op_type到算子实现文件中接口名称的转换规则可参见4，例如Add算子，则需要在impl/add.py中存在add接口，接口定义如下所示：
      @check_op_params(REQUIRED_INPUT, REQUIRED_INPUT, REQUIRED_OUTPUT, KERNEL_NAME)
def add(input_x, input_y, output_z, kernel_name="add"):

add_elewise_case接口

  • 函数原型

    ElementwiseOpUT.add_elewise_case(self, soc, param_info, expect=op_status.SUCCESS, case_name=None)

  • 功能说明

    添加算子编译的测试用例，测试算子是否支持相关规格，编译出“.o”文件。

  • 参数说明
    • soc：测试该用例是否支持对应的对应 AI处理器，对应 AI处理器的取值范围可从/compiler/data/platform_config目录下查看，对应“*.ini”文件的名字即为可配置的对应 AI处理器类型。support_soc支持的数据类型为str、tuple或者list，tuple或者list表示可以支持多个SoC。若配置为“all”或者“None”，表示支持所有的SoC。
    • param_info：算子的输入信息，有两种形式：
      • [dtype, shape, format, ori_shape, ori_format]
      • [dtype, shape, format]：此种形式下，ori_shape与ori_format的取值与shape、format的取值相同。
    • expect： 期望是否编译成功，默认为“op_status.SUCCESS”，当测试异常场景时，期望的结果可配置为RuntimeError。
    • case_name：默认为None，测试框架会自动生成测试用例的名称。

    示例：

    ut_case.add_elewise_case("Ascend910", ["float16", (32, 32), "ND"])

    以上用例与调用如下add_case接口的用例实现功能相同：

    ut_case.add_case(support_soc="Ascend910", case={
    "params": [{
        "shape": (32, 32),
        "ori_shape": (32, 32),
        "format": "ND",
        "ori_format": "ND",
        "dtype": "float16"
    }, {
        "shape": (32, 32),
        "ori_shape": (32, 32),
        "format": "ND",
        "ori_format": "ND",
        "dtype": "float16"
    }]
})

add_elewise_case_simple接口

  • 函数原型

    ElementwiseOpUT.add_elewise_case_simple(self, soc, dtypes, shape, expect=op_status.SUCCESS, case_name=None)

  • 功能说明

    添加算子编译的测试用例，测试算子是否支持相关规格，编译出“.o”文件。

  • 参数说明
    • soc：测试该用例是否支持对应的对应 AI处理器，对应 AI处理器的取值范围可从/compiler/data/platform_config目录下查看，对应“*.ini”文件的名字即为可配置的对应 AI处理器类型。support_soc支持的数据类型为str、tuple或者list，tuple或者list表示可以支持多个SoC。若配置为“all”或者“None”，表示支持所有的SoC。
    • dtypes：需要测试的数据类型，填写多个数据，相当于一次添加了多个测试用例。
    • shape：算子输入的shape。
    • expect： 期望是否编译成功，默认为“op_status.SUCCESS”，当测试异常场景时，期望的结果可配置为RuntimeError。
    • case_name：默认为None，测试框架会自动生成测试用例的名称。

    此接口较add_elewise_case接口，相当于将输入的所有format配置为“ND”。

    示例：

    ut_case.add_elewise_case_simple("Ascend910", ["float16", "float32"], [32, 32])

    以上用例与调用如下add_case接口的用例实现功能相同：

    ut_case.add_case(support_soc="Ascend910", case={
    "params": [{
        "shape": (32, 32),
        "ori_shape": (32, 32),
        "format": "ND",
        "ori_format": "ND",
        "dtype": "float16"
    }, {
        "shape": (32, 32),
        "ori_shape": (32, 32),
        "format": "ND",
        "ori_format": "ND",
        "dtype": "float16"
    }]
})

ut_case.add_case(support_soc="Ascend910", case={
    "params": [{
        "shape": (32, 32),
        "ori_shape": (32, 32),
        "format": "ND",
        "ori_format": "ND",
        "dtype": "float32"
    }, {
        "shape": (32, 32),
        "ori_shape": (32, 32),
        "format": "ND",
        "ori_format": "ND",
        "dtype": "float32"
    }]
})
父主题： UT测试接口参考


ReduceOpUT

概述

ReduceOpUT继承了OpUT，包含了OpUT的能力。

ReduceOpUT主要供Reduce类型的算子进行测试用例的定义，例如ReduceSum, ReduceMean等算子。ReduceOpUT为这类算子提供了更加便利的接口，例如，创建算子编译用例时，对于一些简单场景无需输入format等信息。

ReduceOpUT测试类定义

  • 函数原型

    ReduceOpUT(op_type, op_module_name=None, op_func_name=None)

  • 参数说明
    • op_type：算子的类型。
    • op_module_name：算子的module名称（即算子的实现文件名称和路径），例如：impl.add（文件路径为：impl/add.py）。默认值为None，可根据op_type自动生成，op_type到算子实现文件名称的转换规则可参见4，例如ReduceSum算子自动生成module名称"impl.reduce_sum"。
    • op_func_name：算子的接口名称，算子实现文件中的算子接口名。默认值为None，可根据op_type自动生成，op_type到算子实现文件中接口名称的转换规则可参见4，例如Add算子，则需要在impl/add.py中存在add接口，接口定义如下所示：
      @check_op_params(REQUIRED_INPUT, REQUIRED_INPUT, REQUIRED_OUTPUT, KERNEL_NAME)
def add(input_x, input_y, output_z, kernel_name="add"):

add_reduce_case接口

  • 函数原型

    ReduceOpUT.add_reduce_case(self, soc, input_info, axes, keep_dim=False, expect=op_status.SUCCESS, case_name=None)

  • 功能说明

    添加算子编译的测试用例，测试算子是否支持相关规格，编译出“.o”文件。

  • 参数说明
    • soc：测试该用例是否支持对应的对应 AI处理器，对应 AI处理器的取值范围可从/compiler/data/platform_config目录下查看，对应“*.ini”文件的名字即为可配置的对应 AI处理器类型。support_soc支持的数据类型为str、tuple或者list，tuple或者list表示可以支持多个SoC。若配置为“all”或者“None”，表示支持所有的SoC。
    • input_info：算子的输入信息，有两种形式：
      • [dtype, shape, format, ori_shape, ori_format]
      • [dtype, shape, format]：此种形式下，ori_shape与ori_format的取值与shape、format的取值相同。
    • axes：reduce的轴信息。
    • keep_dims：是否保持reduce的轴为1。True：是；False：否。
    • expect： 期望是否编译成功，默认为“op_status.SUCCESS”，当测试异常场景时，期望的结果可配置为RuntimeError。
    • case_name：默认为None，测试框架会自动生成测试用例的名称。

    示例：

    ut_case.add_reduce_case("Ascend910", ["float16", (32, 32), "ND"], [0,], False)

    以上用例与调用如下add_case接口的用例实现功能相同：

    ut_case.add_case(support_soc="Ascend910", case={
    "params": [{
        "shape": (32, 32),
        "ori_shape": (32, 32),
        "format": "ND",
        "ori_format": "ND",
        "dtype": "float16"
    }, {
        "shape": (32,),
        "ori_shape": (32,),
        "format": "ND",
        "ori_format": "ND",
        "dtype": "float16"
    }, [0,], False]
})

add_reduce_case_simple接口

  • 函数原型

    ReduceOpUT.add_reduce_case_simple(self, soc, dtypes, shape, axes, keep_dim=False, expect=op_status.SUCCESS, case_name=None)

  • 功能说明

    添加算子编译的测试用例，测试算子是否支持相关规格，编译出“.o”文件。

  • 参数说明
    • soc：测试该用例是否支持对应的对应 AI处理器，对应 AI处理器的取值范围可从/compiler/data/platform_config目录下查看，对应“*.ini”文件的名字即为可配置的对应 AI处理器类型。support_soc支持的数据类型为str、tuple或者list，tuple或者list表示可以支持多个SoC。若配置为“all”或者“None”，表示支持所有的SoC。
    • dtypes：需要测试的数据类型，填写多个数据，相当于一次添加了多个测试用例。
    • shape：算子输入的shape。
    • axes: reduce的轴信息。
    • keep_dims：是否保持reduce的轴为1。True：是；False：否。
    • expect： 期望是否编译成功，默认为“op_status.SUCCESS”，当测试异常场景时，期望的结果可配置为RuntimeError。
    • case_name：默认为None，测试框架会自动生成测试用例的名称。

    此接口较add_reduce_case接口，相当于将输入的所有format配置为“ND”。

    示例：

    ut_case.add_reduce_case_simple("Ascend910", ["float16", "float32"], [32, 32], [1,], True)

    以上用例与调用如下add_case接口的用例实现功能相同：

    ut_case.add_case(support_soc="Ascend910", case={
    "params": [{
        "shape": (32, 32),
        "ori_shape": (32, 32),
        "format": "ND",
        "ori_format": "ND",
        "dtype": "float16"
    }, {
        "shape": (32, 1),
        "ori_shape": (32, 1),
        "format": "ND",
        "ori_format": "ND",
        "dtype": "float16"
    }, [1,], True]
})

ut_case.add_case(support_soc="Ascend910", case={
    "params": [{
        "shape": (32, 32),
        "ori_shape": (32, 32),
        "format": "ND",
        "ori_format": "ND",
        "dtype": "float32"
    }, {
        "shape": (32, 1),
        "ori_shape": (32, 1),
        "format": "ND",
        "ori_format": "ND",
        "dtype": "float32"
    }, [1,], True]
})
父主题： UT测试接口参考


ST测试其他功能

双击“testcases/st/OpType/{SoC Version}”或“testcases/st/OpType/aicpu_kernel”文件夹下的算子测试用例定义文件或者右键该文件选择" OpType_case_timestamp.json"，会打开ST模板配置界面，该界面中的Design和Text均为json文件的一个视图。配置说明请参见TBE算子ST测试用例定义文件参数解释和AI CPU算子ST测试用例定义文件参数解释。

其他功能扩展

  • 支持Design和Text界面视图的切换

    在Design视图中的更改，若该视图不存在错误配置信息，切换到Text视图时，更改会自动同步到Text视图中；同理，在Text视图中的更改，切换到Design视图时，更改也会同步到Design视图中。

  • 新增测试用例

    在算子测试用例定义界面单击“Add”按钮，弹出如下图所示弹框，提示用户输入“Case Name”。

    “Case Name”为由数字、字母、下划线组成的字符串。

    单击“OK”后，会在Design Cases页面的尾部新增创建好的Case，新增Case的各个字段值为空，需要用户进行配置，配置规则可参见TBE算子ST测试用例定义文件参数解释。

  • 删除测试用例

    在算子测试用例定义界面，单击相应Case右侧的 [image] 图标，即可删除该Case。

  • 复制和新增算子输入

    在算子测试用例定义界面，单击相应Input[xx]右侧的 [image] 图标，即可复制该Input[xx]成为新的Input[xx]。或者单击 [image] 新增算子输入。用户根据实际情况进行修改参数项。

    如果算子ST工程支持动态多shape算子时，当复制x1的算子输入，此时“Name”参数应该按照x10，x11，x12，...，的格式进行命名，当复制x2的算子输入，此时“Name”参数应该按照x20，x21，x22，...，的格式进行命名。

  • 删除算子输入

    在算子测试用例定义界面，单击相应Input[xx]右侧的 [image] 图标，即可删除该Input[xx]。

  • 选择单个或多个测试用例运行

    在算子测试用例定义界面，勾选其中一个或多个Case，单击“Run”，即可运行选中的Case。

  • 支持修改和运行ST测试源码。
    1. 源码生成

      ST测试运行成功后，在./testcases/st/out/OpName/src目录中生成ST测试源码。

    2. 源码修改

      用户根据需要可以修改源码内容，实现自定义需求及功能。

    3. 源码运行

      右键单击./testcases/st/out/<operator name>，选择“Run St Source”，即可运行修改后的源码。

      若从其他入口运行ST测试，修改后的源码会被覆盖，请提前备份。

父主题： 其他功能及操作


参考

  • IR定义配置说明
  • TBE算子UT测试用例定义文件参数解释
  • TBE算子ST测试用例定义文件参数解释
  • AI CPU算子ST测试用例定义文件参数解释
父主题： 算子开发


IR定义配置说明

  • Excel文件配置参数说明
    表1 IR原型定义参数说明

    列名称

    含义

    是否必选

    Op

    算子的Operator Type。

    是

    Classify
    算子相关参数的类别，包含：
    • 输入：Input
    • 动态输入：DYNAMIC_INPUT
    • 输出：Output
    • 动态输出：DYNAMIC_OUTPUT
    • 属性：Attr

    是

    Name

    算子参数的名称。

    是

    Type

    算子参数的类型。

    包含如下取值：

    tensor、int、bool、float、ListInt、ListFloat等

    是

    TypeRange

    针对类型为tensor的参数，需要配置tensor支持的类型。

    包含如下取值：

    fp16,fp32,double,int8,int16,int32,int64,uint8,uint16,uint32,uint64,bool等。

    否

    Required

    是否必须输入，有如下取值：

    • TRUE
    • FALSE

    是

    Doc

    对应参数的描述。

    否

    Attr_Default_value

    属性的默认值。

    否

    Format

    针对类型为tensor的参数，配置为tensor支持的数据排布格式。

    包含如下取值：

    ND,NHWC,NCHW,HWCN,NC1HWC0,FRACTAL_Z等

    否
  • json IR文件配置参数说明
    创建算子工程的json IR文件配置请参见表2。
    表2 json文件配置参数说明

    配置字段

    类型

    含义

    是否必选

    Plugin Framework

    -

    列表

    算子所在模型文件的框架类型。

    • PyTorch
    • TensorFlow
    • Caffe
    • ONNX

    是

    Op Type

    -

    字符串

    算子的Operator Type。

    支持输入字母和数字组成，首字母需大写。

    是

    Input[xx]

    -

    列表

    输入参数描述。

    否

    Name

    字符串

    算子输入参数的名称。

    是

    Format

    字符串或列表

    针对类型为tensor的参数，配置为tensor支持的数据排布格式。如果tensor支持多个数据排布格式，请使用列表。例如["ND","NHWC"]。

    包含如下取值：

    ND,NHWC,NCHW,HWCN,NC1HWC0,FRACTAL_Z等。

    否

    Data Type

    字符串或列表

    输入数据支持的数据类型。

    包含如下取值：

    int32,uint64,float16,float,uint16,int16,int64,uint32,bool,int8,uint8等。

    所有输入输出tensor需支持相同数量的数据类型。

    是

    Param Type

    -

    参数类型：

    • Required
    • Optional
    • Dynamic

    未配置默认为Required。

    是

    Output[xx]

    -

    列表

    输出参数描述。

    是

    Name

    字符串

    算子输出参数的名称。

    是

    Format

    字符串或列表

    针对类型为tensor的参数，配置为tensor支持的数据排布格式。

    包含如下取值：

    ND,NHWC,NCHW,HWCN,NC1HWC0,FRACTAL_Z等。

    否

    Data Type

    字符串或列表

    输出数据支持的数据类型。

    包含如下取值：

    int32,uint64,float16,float,uint16,int16,int64,uint32,bool,int8,uint8等。

    所有输入输出tensor需支持相同数量的数据类型。

    是

    Param Type

    -

    参数类型：

    • Required
    • Optional
    • Dynamic

    未配置默认为Required

    是

    Attribute[xx]

    -

    列表

    属性描述。

    否

    Name

    字符串

    算子属性参数的名称。

    是

    Type

    字符串或列表

    算子参数的类型。

    包含如下取值：

    int、bool、float、string、list_int、list_float等。

    若为MindStudio框架包含如下取值：

    I8_Default,I16_Default,I32_Default,I64_Default,U8_Default,U16_Default,U32_Default,U64_Default,BOOL_Default等

    是

    Default Value

    -

    默认值。

    否

    Param Type

    -

    参数类型：

    • Required
    • Optional

    未配置默认为Required。

    是

    IR Template可以配置多个算子。单击Add按钮增加算子

    • 若存在Op Type同名算子，会以后一算子创建算子工程。
    • 若Input[xx]或Output[xx]中的Name参数相同，则后一个会覆盖前一参数。
    • Input[xx]，Output[xx]中的Data Type与Format需一一对应匹配，如果没有配置Format，自动以“ND”按Type的个数一一对应补齐。

    示例：

    Plugin Framework

    -

    TensorFlow

    Op Type

    -

    Conv2D

    Input[01]

    -

    -

    Name

    x

    Format

    ["NCHW"]

    Data Type

    ["fp16"]

    Param Type

    Required

    Input[02]

    -

    -

    Name

    filter

    Format

    ["NCHW"]

    Data Type

    ["fp16"]

    Param Type

    Required

    Output[01]

    -

    -

    Name

    y

    Format

    ["NCHW"]

    Data Type

    ["fp16"]

    Param Type

    Required

    Attribute[01]

    -

    -

    Name

    strides

    Type

    list_int

    Default Value

    -

    Param Type

    Required

    Attribute[02]

    -

    -

    Name

    pads

    Type

    list_int

    Default Value

    -

    Param Type

    Required

    Attribute[03]

    -

    -

    Name

    dilations

    Type

    list_int

    Default Value

    [1,1,1,1]

    Param Type

    Optional
父主题： 参考


TBE算子UT测试用例定义文件参数解释

表1 TBE算子UT测试用例定义json文件

参数

说明

Operator[xx]

-

可选。

-

OpName

算子的名称。

-

TestName

必选。测试用例的名称。

-

SocVersion

必选。支持的对应 AI处理器类型。

支持输入“all”，表示支持所有的对应 AI处理器。

-

FunctionType

必选。当前支持的函数类型，支持的参数如下：

  • add_precision_case：为当前算子添加一个精度测试用例。
  • add_case：为当前算子添加一个算子编译的测试，测试算子是否可以支持该规格，编译出.o文件。

Input[xx]

-

必选。

算子的输入。

-

Name

可选。算子输入的名称，string类型。

-

Format

必选。

String类型。

输入tensor数据的排布格式，不允许为空。

常见的数据排布格式如下：

  • NCHW
  • NHWC
  • ND：表示支持任意格式。
  • NC1HWC0：华为自研的5维数据格式。其中，C0与微架构强相关，该值等于cube单元的size，例如16；C1是将C维度按照C0切分：C1=C/C0， 若结果不整除，最后一份数据需要padding到C0。
  • FRACTAL_Z：卷积的权重的格式。
  • FRACTAL_NZ：华为自研的分形格式，在cube单元计算时，输出矩阵的数据格式为NW1H1H0W0。整个矩阵被分为（H1*W1）个分形，按照column major排布，形状如N字形；每个分形内部有（H0*W0）个元素，按照row major排布，形状如z字形。考虑到数据排布格式，将NW1H1H0W0数据格式称为Nz格式。其中，H0,W0表示一个分形的大小，示意图如下所示：

-

OriginFormat

可选。Tensor的原始format。

不带此字段时，默认Tensor的实现format与原始format一致。

-

Type

必选。

String类型。

所有输入输出tensor需支持相同数量的数据类型。

输入数据支持的数据类型。

  • bool
  • int8
  • uint8
  • int16
  • uint16
  • int32
  • int64
  • uint32
  • uint64
  • float16
  • float

-

Shape

必选。

int类型，一维数组。

输入tensor支持的形状，所有输入输出tensor需支持相同数量的形状。

例如：

[8, 3, 256, 256]。

若输入非法的形状会报错，例如：[0]。

需要注意，配置的shape需要和format相匹配。

-

OriginShape

可选。Tensor的原始shape。

不带此字段时，默认Tensor的实现shape与原始shape一致。

Output[xx]

-

必选。

算子输出。

-

Name

算子输入的名称，string类型。

-

Format

必选。

String类型。

输出tensor数据的排布格式，不允许为空。

常见的数据排布格式如下：

  • NCHW
  • NHWC
  • ND：表示支持任意格式。
  • NC1HWC0：华为自研的5维数据格式。其中，C0与微架构强相关，该值等于cube单元的size，例如16；C1是将C维度按照C0切分：C1=C/C0， 若结果不整除，最后一份数据需要padding到C0。
  • FRACTAL_Z：卷积的权重的格式。
  • FRACTAL_NZ：华为自研的分形格式，在cube单元计算时，输出矩阵的数据格式为NW1H1H0W0。整个矩阵被分为（H1*W1）个分形，按照column major排布，形状如N字形；每个分形内部有（H0*W0）个元素，按照row major排布，形状如z字形。考虑到数据排布格式，将NW1H1H0W0数据格式称为Nz格式。其中，H0,W0表示一个分形的大小，示意图如下所示：

-

OriginFormat

可选。Tensor的原始format。

不带此字段时，默认Tensor的实现format与原始format一致。

-

Type

必选。

String类型。

输出数据支持的数据类型：

  • bool
  • int8
  • uint8
  • int16
  • uint16
  • int32
  • int64
  • uint32
  • uint64
  • float16
  • float

-

Shape

必选。

int类型，一维或者二维数组。

输入tensor支持的形状。

例如：

[8, 3, 256, 256]。

若输入非法的形状会报错，例如：[0]。

-

OriginShape

可选。Tensor的原始shape。

不带此字段时，默认Tensor的实现shape与原始shape一致。

Attribute

-

可选。

-

Name

可选。string类型。

-

Type

若配置attr，则为必选属性支持的类型。

string类型。

输出数据支持的数据类型：

  • bool
  • int
  • float
  • string
  • list_bool
  • list_int
  • list_float
  • list_string
  • list_list_int

-

Value

若配置attr，则为必选，且不允许为null。

string类型。

属性值，根据type的不同，属性值不同。

  • bool: true/false
  • int: 10
  • float: 1.0
  • string: “NCHW”
  • list_bool: [false, true]
  • list_int: [1, 224, 224, 3]
  • list_float: [1.0, 0.0]
  • list_string: [“str1”, “str2”]
  • list_list_int: [[1, 3, 5, 7], [2, 4, 6, 8]]
父主题： 参考


TBE算子ST测试用例定义文件参数解释

表1 TBE算子ST测试用例定义json文件

参数

说明

Test_xxx_xx

-

必选。string类型。

测试用例的名称。

Input[xx]

-

必选。

算子的输入。

须知：

一个算子所有Input中参数取值的个数都要一致，否则测试用例生成会失败。

例如：Input[01]的format支持的类型个数2，则Input[02]的format支持的类型个数也需要为2。

同理，所有Input[xx]中的type、shape、data_distribute和value_range的取值个数也需要保持一致。

-

Name

必选。

算子输入的名称，string类型。

若配置期望函数，则算子输入的名称需与期望函数中输入的名称保持完全一致。

-

Format

必选。

String或者String的一维数组。

输入tensor数据的排布格式，不允许为空。

常见的数据排布格式如下：

  • NCHW
  • NHWC
  • ND：表示支持任意格式。
  • NC1HWC0：华为自研的5维数据格式。其中，C0与微架构强相关，该值等于cube单元的size，例如16；C1是将C维度按照C0切分：C1=C/C0， 若结果不整除，最后一份数据需要padding到C0。
  • FRACTAL_Z：卷积的权重的格式。
  • FRACTAL_NZ：华为自研的分形格式，在cube单元计算时，输出矩阵的数据格式为NW1H1H0W0。整个矩阵被分为（H1*W1）个分形，按照column major排布，形状如N字形；每个分形内部有（H0*W0）个元素，按照row major排布，形状如z字形。考虑到数据排布格式，将NW1H1H0W0数据格式称为Nz格式。其中，H0,W0表示一个分形的大小，示意图如下所示：

  • RESERVED：预留，当Format配置为该值，则Type必须配置为“UNDEFINED”，代表算子的此输入可选。

注意，Format、Type和Shape的数量需保持一致。

-

OriginFormat

可选。Tensor的原始format。

不带此字段时，默认Tensor的实现format与原始format一致。

-

ShapeRange

可选。Shape为动态时，unknow shape的取值范围。默认为[1, -1]。

例如，若Shape取值为[16, -1, 16, -1]，其中的-1表示unknow shape。ShapeRange取值为[[1, 128], [1, -1]]，[1, 128]表示Shape中第一个-1取值范围为1到128，[1, -1]表示Shape中第二个-1的取值范围为1到无穷大。

-

TypicalShape

固定shape，用来生成可用的测试数据。

-

Type

必选。

String或者String的一维数组。

所有输入输出tensor需支持相同数量的数据类型。

输入数据支持的数据类型。

  • bool
  • int8
  • uint8
  • int16
  • uint16
  • int32
  • int64
  • uint32
  • uint64
  • float16
  • float
  • UNDEFINED：表示输入类型为可选。

注意，Format、Type和Shape的数量需保持一致。

-

Shape

必选。

int类型，一维或者二维数组。

输入tensor支持的形状，所有输入输出tensor需支持相同数量的形状。

例如：

[8, 3, 256, 256]或[[1, 3, 256, 256], [8, 3, 256, 256]]。

若输入非法的形状会报错，例如：[0]。

注意，Format、Type和Shape的数量需保持一致。

-

OriginShape

可选。Tensor的原始shape。

不带此字段时，默认Tensor的实现shape与原始shape一致。

-

Value

可选。

路径String或者Tensor数组。

若用户需要指定输入数据时，可通过增加“Value”字段进行配置。有如下两种配置方式：

  • 直接输入tensor数据，如tensor的值为[1,2,3,4]。

    "Value": [1,2,3,4]

  • 输入二进制数据文件的路径，如数据文件为test.bin时。

    "Value": "home/HiHwAiUser/projects/test.bin"

二进制数据bin文件需用户自己准备。可以输入绝对路径。

若用户添加了“Value”字段，“DataDistribute”和“ValueRange”字段将会被隐藏。同时需要保证“Format”,"Type"，"Shape"字段的值与“Value”数据一致，且每个用例只能测试一种数据类型。

-

ValueRange

必选。

int类型或者float类型，一维或者二维数组。

取值范围，不能为空。

为[min_value, max_value]且min_value <=max_value。

-

DataDistribute

必选。

String或者String的一维数组。

使用哪种数据分布方式生成测试数据，支持的分布方式有：
  • uniform：返回均匀分布随机值
  • normal：返回正态分布（高斯分布）随机值
  • beta：返回Beta分布随机值
  • laplace：返回拉普拉斯分布随机值
  • triangular：返回三角形分布随机值
  • relu：返回均匀分布+Relu激活后的随机值
  • sigmoid：返回均匀分布 + sigmoid激活后的随机值
  • softmax：返回均匀分布 + softmax激活后的随机值
  • tanh：返回均匀分布 + tanh激活后的随机值

-

isConst

可选。

bool类型，默认为false。

  • true：若用户需要配置常量输入的用例，则配置该字段，并且其值为true。
  • false：若该字段值为false，则需要配置张量输入用例。

Output[xx]

-

必选。

算子输出。

须知：

Output中参数取值的个数都要与Input一致，否则测试用例生成会失败。

例如：Input的format支持的类型个数2，则Output的format支持的类型个数也需要为2。

-

Name

必选。

算子输入的名称，string类型。

若配置期望函数，则算子输出的名称与期望函数中输出的名称需保持完全一致。

-

Format

必选。

String或者String的一维数组。

输出tensor数据的排布格式，不允许为空。

常见的数据排布格式如下：

  • NCHW
  • NHWC
  • ND：表示支持任意格式。
  • NC1HWC0：华为自研的5维数据格式。其中，C0与微架构强相关，该值等于cube单元的size，例如16；C1是将C维度按照C0切分：C1=C/C0， 若结果不整除，最后一份数据需要padding到C0。
  • FRACTAL_Z：卷积的权重的格式。
  • FRACTAL_NZ：华为自研的分形格式，在cube单元计算时，输出矩阵的数据格式为NW1H1H0W0。整个矩阵被分为（H1*W1）个分形，按照column major排布，形状如N字形；每个分形内部有（H0*W0）个元素，按照row major排布，形状如z字形。考虑到数据排布格式，将NW1H1H0W0数据格式称为Nz格式。其中，H0,W0表示一个分形的大小，示意图如下所示：

注意，Format、Type和Shape的数量需保持一致。

-

OriginFormat

可选。Tensor的原始format。

不带此字段时，默认Tensor的实现format与原始format一致。

-

Type

必选。

String或者String的一维数组。

输出数据支持的数据类型：

  • bool
  • int8
  • uint8
  • int16
  • uint16
  • int32
  • int64
  • uint32
  • uint64
  • float16
  • float

注意，Format、Type和Shape的数量需保持一致。

-

Shape

必选。

int类型，一维或者二维数组。

输入tensor支持的形状。

例如：

[8, 3, 256, 256]或[[1, 3, 256, 256], [8, 3, 256, 256]]。

若输入非法的形状会报错，例如：[0]。

注意，Format、Type和Shape的数量需保持一致。

-

OriginShape

可选。Tensor的原始shape。

不带此字段时，默认Tensor的实现shape与原始shape一致。

Attribute

-

可选。

-

Name

若配置attr，则为必选。

string类型。

属性的名称，不为空。

-

Type

若配置attr，则为必选属性支持的类型。

string类型。

输出数据支持的数据类型：

  • bool
  • int
  • float
  • string
  • list_bool
  • list_int
  • list_float
  • list_string
  • list_list_int

-

Value

若配置attr，则为必选，且不允许为null。

string类型。

属性值，根据type的不同，属性值不同。

  • bool: true/false
  • int: 10
  • float: 1.0
  • string: “NCHW”
  • list_bool: [false, true]
  • list_int: [1, 224, 224, 3]
  • list_float: [1.0, 0.0]
  • list_string: [“str1”, “str2”]
  • list_list_int: [[1, 3, 5, 7], [2, 4, 6, 8]]

Expected Result Verification

-

可选。

-

Script Path

可选。

路径String类型。

算子期望数据生成函数路径。

-

Script Function

可选。

String类型。

算子期望数据生成函数名称。

K-Level Test Cases

-

可选。

-

Fuzz Script Path

可选。

路径String类型。

fuzz生成测试参数的脚本路径的绝对路径或者相对路径。

-

Fuzz Function

可选。

String类型。

fuzz脚本中生成fuzz输入的函数名，默认为：“fuzz_branch”。

-

Fuzz Case Num

可选。

int类型。

利用fuzz脚本生成测试用例数量，范围为1-2000。
  • 当算子信息定义文件（*.ini）中inputx.paramType=optional时，生成的算子测试用例中inputx的"format"需配置为"UNDEFINED"或"RESERVED"，"type"为"UNDEFINED"。
  • 若配置的Shape某个维度为-1或者Shape为[-2]时（某维度为-1，如[200, -1] 说明第二个轴长度未知， [-2]场景表示维度未知），生成的算子测试用例中新增ShapeRange字段和TypicalShape字段。ShapeRange字段值为: [[1,-1]]，表示Shape字段可以取任何值。用户需要在TypicalShape字段给出固定shape值，用于实际测试。
  • 算子信息定义文件（*.ini）Tensor的实现format中包含华为自研数据格式，且Tensor的实现format与原始format不同时，用户需在"OriginFormat"和"OriginShape"中填入原始format和shape，将OriginFormat与OriginShape转成离线模型需要的format与shape。
    • "OriginFormat"输入为原始算子支持的数据格式，个数必须与"Format"个数保持一致。
    • "OriginShape"的输入值必须与"Shape"一一对应，且与"Format"和"OriginFormat"格式相匹配。
  • Input[xx]、Output[xx]、Attr中除了name和Attr的Type以外的所有参数均支持fuzz输入。
父主题： 参考


AI CPU算子ST测试用例定义文件参数解释

表1 AI CPU算子ST测试用例定义json文件

参数

说明

Test_xxx_xx

-

必选。string类型。

测试用例的名称。

Input[xx]

-

必选。

算子的输入。

须知：

一个算子所有Input中参数取值的个数都要一致，否则测试用例生成会失败。

例如：Input[01]的format支持的类型个数2，则Input[02]的format支持的类型个数也需要为2。

同理，所有Input[xx]中的type、shape、data_distribute和value_range的取值个数也需要保持一致。

-

Name

必选。

算子输入的名称，string类型。

若配置期望函数，则算子输入的名称需与期望函数中输入的名称保持完全一致。

-

Format

必选。

String或者String的一维数组。

输入tensor数据的排布格式，不允许为空。

常见的数据排布格式如下：

  • NCHW
  • NHWC
  • ND：表示支持任意格式。
  • NC1HWC0：华为自研的5维数据格式。其中，C0与微架构强相关，该值等于cube单元的size，例如16；C1是将C维度按照C0切分：C1=C/C0， 若结果不整除，最后一份数据需要padding到C0。
  • FRACTAL_Z：卷积的权重的格式。
  • FRACTAL_NZ：华为自研的分形格式，在cube单元计算时，输出矩阵的数据格式为NW1H1H0W0。整个矩阵被分为（H1*W1）个分形，按照column major排布，形状如N字形；每个分形内部有（H0*W0）个元素，按照row major排布，形状如z字形。考虑到数据排布格式，将NW1H1H0W0数据格式称为Nz格式。其中，H0,W0表示一个分形的大小，示意图如下所示：

  • RESERVED：预留，当Format配置为该值，则type必须配置为“UNDEFINED”，代表算子的此输入可选。

注意，Format、Type和Shape的数量需保持一致。

-

OriginFormat

可选。Tensor的原始format。

不带此字段时，默认Tensor的实现format与原始format一致。

-

Type

必选。

String或者String的一维数组。

输入数据支持的数据类型。

  • bool
  • int8
  • uint8
  • int16
  • uint16
  • int32
  • int64
  • uint32
  • uint64
  • float16
  • float
  • double
  • complex64
  • complex128
  • UNDEFINED：当输入类型为可选时。

注意，Format、Type和Shape的数量需保持一致。

-

Shape

必选。

int类型，一维或者二维数组。

输入tensor支持的形状。

例如：

[8, 3, 256, 256]或[[1, 3, 256, 256], [8, 3, 256, 256]]。

若输入非法的形状会报错，例如：[0]。

注意，Format、Type和Shape的数量需保持一致。

-

OriginShape

可选。Tensor的原始shape。

不带此字段时，默认Tensor的实现shape与原始shape一致。

-

Value

可选。

路径String或者Tensor数组。

若用户需要指定输入数据时，可通过增加“Value”字段进行配置。有如下两种配置方式：

直接输入tensor数据，如tensor的值为[1,2,3,4]。

"Value": [1,2,3,4]

输入二进制数据文件的路径，如数据文件为test.bin时。

"Value": "home/HiHwAiUser/projects/test.bin"

二进制数据bin文件需用户自己准备。可以输入绝对路径。若用户添加了“Value”字段，“DataDistribute”和“ValueRange”字段将会被隐藏。同时需要保证“Format”,"Type"，"Shape"字段的值与“Value”数据一致。

-

ValueRange

必选。

int类型或者float类型，一维或者二维数组。

取值范围，不能为空。

为[min_value, max_value]且min_value <=max_value。

-

DataDistribute

必选。

String或者String的一维数组。

使用哪种数据分布方式生成测试数据，支持的分布方式有：
  • uniform：返回均匀分布随机值
  • normal：返回正态分布（高斯分布）随机值
  • beta：返回Beta分布随机值
  • laplace：返回拉普拉斯分布随机值
  • triangular：返回三角形分布随机值
  • relu：返回均匀分布+Relu激活后的随机值
  • sigmoid：返回均匀分布 + sigmoid激活后的随机值
  • softmax：返回均匀分布 + softmax激活后的随机值
  • tanh：返回均匀分布 + tanh激活后的随机值

-

isConst

可选。

bool类型，默认为false。

  • true：若用户需要配置常量输入的用例，则配置该字段，并且其值为true。
  • false：若该字段值为false，则需要配置张量输入用例。

Output[xx]

-

必选。

算子输出。

须知：

Output中参数取值的个数都要与Input一致，否则测试用例生成会失败。

例如：Input的format支持的类型个数2，则Output的format支持的类型个数也需要为2。

-

Name

必选。

算子输入的名称，string类型。

若配置期望函数，则算子输出的名称与期望函数中输出的名称需保持完全一致。

-

Format

必选。

String或者String的一维数组。

输出tensor数据的排布格式，不允许为空。

常见的数据排布格式如下：

  • NCHW
  • NHWC
  • ND：表示支持任意格式。
  • NC1HWC0：华为自研的5维数据格式。其中，C0与微架构强相关，该值等于cube单元的size，例如16；C1是将C维度按照C0切分：C1=C/C0， 若结果不整除，最后一份数据需要padding到C0。
  • FRACTAL_Z：卷积的权重的格式。
  • FRACTAL_NZ：华为自研的分形格式，在cube单元计算时，输出矩阵的数据格式为NW1H1H0W0。整个矩阵被分为（H1*W1）个分形，按照column major排布，形状如N字形；每个分形内部有（H0*W0）个元素，按照row major排布，形状如z字形。考虑到数据排布格式，将NW1H1H0W0数据格式称为Nz格式。其中，H0,W0表示一个分形的大小，示意图如下所示：

注意，Format、Type和Shape的数量需保持一致。

-

OriginFormat

可选。Tensor的原始format。

不带此字段时，默认Tensor的实现format与原始format一致。

-

Type

必选。

String或者String的一维数组。

输出数据支持的数据类型：

  • bool
  • int8
  • uint8
  • int16
  • uint16
  • int32
  • int64
  • uint32
  • uint64
  • float16
  • float
  • double
  • complex64
  • complex128

注意，Format、Type和Shape的数量需保持一致。

-

Shape

必选。

int类型，一维或者二维数组。

输入tensor支持的形状。

例如：

[8, 3, 256, 256]或[[1, 3, 256, 256], [8, 3, 256, 256]]。

若输入非法的形状会报错，例如：[0]。

注意，Format、Type和Shape的数量需保持一致。

-

OriginShape

可选。Tensor的原始shape。

不带此字段时，默认Tensor的实现shape与原始shape一致。

Attribute

-

可选。

-

Name

若配置attr，则为必选。

string类型。

属性的名称，不为空。

-

Type

若配置attr，则为必选属性支持的类型。

string类型。

输出数据支持的数据类型：

  • bool
  • int
  • float
  • string
  • list_bool
  • list_int
  • list_float
  • list_string
  • list_list_int

-

Value

若配置attr，则为必选，且不允许为null。

string类型。

属性值，根据type的不同，属性值不同。

  • bool: true/false
  • int: 10
  • float: 1.0
  • string: “NCHW”
  • list_bool: [false, true]
  • list_int: [1, 224, 224, 3]
  • list_float: [1.0, 0.0]
  • list_string: [“str1”, “str2”]
  • list_list_int: [[1, 3, 5, 7], [2, 4, 6, 8]]

Expected Result Verification

-

可选。

-

Script Path

算子期望数据生成函数路径。

-

Script Function

算子期望数据生成函数名称。

K-Level Test Cases

-

可选。

-

Fuzz Script Path

可选。

路径String类型。

fuzz生成测试参数的脚本路径的绝对路径或者相对路径。

-

Fuzz Case Num

可选。

int类型。

利用fuzz脚本生成测试用例数量，范围为1-2000。

-

Fuzz Function

可选。

String类型。

fuzz脚本中生成fuzz输入的函数名，默认为：“fuzz_branch”。
  • 当算子信息定义文件（*.ini）中inputx.paramType=optional时，生成的算子测试用例中inputx的"format"需配置为"UNDEFINED"或"RESERVED"，"type"为"UNDEFINED"。
  • 算子信息定义文件（*.ini）Tensor的实现format中包含华为自研数据格式，且Tensor的实现format与原始format不同时，用户需在"OriginFormat"和"OriginShape"中填入原始format和shape，将OriginFormat与OriginShape转成离线模型需要的format与shape。
    • "OriginFormat"输入为原始算子支持的数据格式，个数必须与"Format"个数保持一致。
    • "OriginShape"的输入值必须与"Shape"一一对应，且与"Format"和"OriginFormat"格式相匹配。
  • Input[xx]、Output[xx]、Attr中除了name和Attr的Type以外的所有参数均支持fuzz输入。
父主题： 参考


精度比对

  • 精度比对简介
  • 环境准备
  • 使用约束
  • 比对数据准备
  • Tensor比对
  • 附录
父主题： 操作指南


精度比对简介

自有实现的算子在对应 AI处理器上的运算结果与业界标准算子（如Caffe、ONNX、TensorFlow）的运算结果可能存在差异：

  • 在模型转换过程中对模型进行了优化，包括算子消除、算子融合、算子拆分，这些动作可能会造成自有实现的算子运算结果与业界标准算子（如Caffe、TensorFlow、ONNX）运算结果存在差异。

定义：为了帮助开发人员快速解决算子精度问题，需要提供自有实现的算子运算结果与业界标准算子运算结果之间进行精度差异对比的工具。

功能：精度比对工具提供Tensor比对能力，包含余弦相似度、欧氏相对距离、绝对误差（最大绝对误差、平均绝对误差、均方根误差）、相对误差（最大相对误差、平均相对误差、累积相对误差）、KL散度、标准差算法比对维度。

父主题： 精度比对


环境准备

  • 请参见《开发环境安装指南》手册完成开发环境搭建。
父主题： 精度比对


使用约束

  • 精度比对功能不支持打开多个工程同时进行比对，可以先完成一个比对程序后再进行下一个。
  • 精度比对功能要求protobuf版本在[3.13.0, 3.20.3]范围内。安装示例：pip3 install protobuf==3.13.0。非root用户安装，需要在安装命令后加上--user，例如：pip3 install protobuf==3.13.0 --user。
  • 精度比对支持的dump数据的类型：
    • FLOAT
    • FLOAT16
    • DT_INT8
    • DT_UINT8
    • DT_INT16
    • DT_UINT16
    • DT_INT32
    • DT_INT64
    • DT_UINT32
    • DT_UINT64
    • DT_BOOL
    • DT_DOUBLE
父主题： 精度比对


比对数据准备

  • 比对场景
  • 数据格式要求
  • 推理场景数据准备
父主题： 精度比对


比对场景

Tensor比对支持的精度比对场景如表1所示，请根据具体场景准备对应的文件。具体文件的获取方式请参见下文具体数据准备章节。

一般情况下，精度比对获取对应 AI处理器运行生成的dump数据文件与GPU/CPU运行生成的npy数据文件进行比对。若需要进行npy与npy数据文件之间的比对，请参见dump数据文件转换为npy数据文件完成dump文件转换成npy文件。

表1 Tensor比对前数据准备

序号

待比对数据（NPU Dump）

标准数据（Ground Truth）

离线模型文件/融合规则文件

推理场景

1

非量化离线模型在对应 AI处理器上运行生成的dump数据文件

非量化原始模型的npy文件(Caffe)

非量化离线模型文件（*.om）

2

非量化离线模型在对应 AI处理器上运行生成的dump数据文件

非量化原始模型的npy文件(TensorFlow)

非量化离线模型文件（*.om）

3

非量化离线模型在对应 AI处理器上运行生成的dump数据文件

非量化原始模型的npy文件(ONNX)

非量化离线模型文件（*.om）

4

量化离线模型在对应 AI处理器上运行生成的dump数据文件

非量化原始模型的npy文件(Caffe)
  • 量化离线模型文件（*.om）
  • 昇腾模型压缩后的量化融合规则文件（.json）

5

量化离线模型在对应 AI处理器上运行生成的dump数据文件

量化原始模型的npy文件(Caffe)

量化离线模型文件（*.om）

6

量化离线模型在对应 AI处理器上运行生成的dump数据文件

量化离线模型在对应 AI处理器上运行生成的dump数据文件
  • 不同CANN软件版本、同一模型的不同版本或优化前后的模型数据比对时，不需要指定模型文件和融合规则文件。
  • 开启算子融合功能前后分别进行模型转换，生成的dump数据比对时，需要分别指定开启算子融合功能前后的离线模型文件（*.om）或算子映射文件（.json）。

非量化离线模型在对应 AI处理器上运行生成的dump数据文件

非量化离线模型在对应 AI处理器上运行生成的dump数据文件

训练场景

1

通过对应 AI处理器运行生成的训练网络dump数据文件

TensorFlow原始训练网络npy文件

计算图文件（*.txt）

注：上述有关量化、非量化概念请参见《CANN 6.3.RC2 AMCT工具（Caffe）》或《CANN 6.2.RC2 AMCT工具（Caffe）》。
父主题： 比对数据准备


数据格式要求

当前版本支持多种比对方式，因此dump、npy数据文件命名需满足以下要求：

表1 数据文件命名规则

数据类型

数据命名格式

备注

非量化离线模型在对应 AI处理器上运行生成的dump数据文件

当前包含如下三种文件名格式：

  • {op_type}.{op_name}.{task_id}.{stream_id}.{timestamp}
  • {op_type}.{op_name_lxsliceX}.({stream_id}.){task_id}.{timestamp}.{task_type}.{context_id}.{thread_id}.{device_id}
  • {op_type}.{op_name}.({stream_id}.){task_id}.{timestamp}.{task_type}.{context_id}.{thread_id}.{device_id}

命名格式说明：

  • op_type（算子类型）、op_name（算子名）对应的名称需满足“A-Za-z0-9_-”正则表达式规则。
  • timestamp为16位时间戳。
  • task_id（任务ID）、stream_id（Stream ID）、output_index（第N个输出）、task_type（任务类型）、context_id（Context ID）、thread_id（线程ID）、device_id（运行卡的Device ID）为0~9数字组成。

量化离线模型在对应 AI处理器上运行生成的dump数据文件

npy数据文件（Caffe、TensorFlow或ONNX）

{op_name}.{output_index}.{timestamp}.npy
父主题： 比对数据准备


推理场景数据准备

  • 准备Caffe模型npy数据文件
  • 准备TensorFlow模型npy数据文件
  • 准备ONNX模型npy数据文件
  • 准备离线模型dump数据
父主题： 比对数据准备


准备Caffe模型npy数据文件

Caffe原始数据文件准备要求

Caffe原始npy数据文件要求：

  • 文件内容以numpy（.npy）格式保存。
  • 文件以{op_name}.{output_index}.{timestamp}.npy形式命名。设置numpy数据文件名包括output_index字段且值为0，确保转换生成的dump数据的output_index为0，否则无比对结果，原因是精度比对时默认从第一个output_index为0的数据开始。
  • 为确保生成符合命名要求的.npy文件，需要对原始的Caffe模型文件去除in-place，生成新的.prototxt模型文件用于生成.npy文件（例如：如果有未去除in-place的A、B、C、D四个融合算子，进行dump数据，输出的结果为D算子的结果，但命名却是A算子开头，就会导致比对时找不到文件）。针对量化场景，需要先在环境上安装AMCT再执行去除in-place命令，安装方法请参见《CANN 6.3.RC2 AMCT工具（Caffe）》或《CANN 6.2.RC2 AMCT工具（Caffe）》。

    进入/tools/operator_cmp/compare目录，执行命令去除in-place，命令行举例如下：

    python3 inplace_layer_process.py -i /home/HwHiAiUser/resnet50.prototxt

    执行命令后，在/home/HwHiAiUser目录下生成去除in-place的new_resnet50.prototxt文件。

  • 针对量化场景：为确保精度误差，需要执行Caffe模型推理时预处理数据与Caffe模型小型化时预处理数据一致。

生成npy数据文件

本版本不提供Caffe模型numpy数据生成功能，请自行安装Caffe环境并提前准备Caffe原始数据“*.npy”文件。本文仅提供生成符合精度比对要求的numpy格式Caffe原始数据“*.npy”文件的样例参考。

如何准备原始Caffe模型npy数据，您可以参考论坛发帖算子精度比对工具标杆数据生成环境搭建指导（Caffe + TensorFlow）或者自行获取其他方法。该贴仅供参考。

为输出符合精度比对要求的“*.npy”数据文件，需在推理结束后的代码中增加dump操作，示例代码如下：

    #read prototxt file
    net_param = caffe_pb2.NetParameter()
    with open(self.model_file_path, 'rb') as model_file:
        google.protobuf.text_format.Parse(model_file.read(), net_param)

        # save data to numpy file
        for layer in net_param.layer:
            name = layer.name.replace("/", "_").replace(".", "_")
            index = 0
            for top in layer.top:
                data = net.blobs[top].data[...]
                file_name = name + "." + str(index) + "." + str(
                    round(time.time() * 1000000)) + ".npy"
                output_dump_path = os.path.join(self.output_path, file_name)
                np.save(output_dump_path, data)
                print('The dump data of "' + layer.name
                      + '" has been saved to "' + output_dump_path + '".')
                index += 1

增加上述代码后，运行Caffe模型的应用工程，即可生成符合要求的“*.npy”数据文件。

父主题： 推理场景数据准备


准备TensorFlow模型npy数据文件

生成npy数据文件

本版本不提供TensorFlow模型numpy（.npy）数据生成功能，请自行安装TensorFlow环境并提前准备numpy数据。本文仅提供生成numpy格式TensorFlow原始数据“*.npy”文件的样例参考。

在进行TensorFlow模型生成npy数据前，您需要已经有一套完整的、可执行的、标准的TensorFlow模型应用工程。然后利用TensorFlow官方提供的debug工具tfdbg调试程序，从而生成npy文件。主要操作示例如下，请根据自己的应用工程适配操作：

  1. 修改TensorFlow推理脚本，添加debug选项设置。代码中增加如下代码：

    • Estimator模式：
      from tensorflow.python import debug as tf_debug
training_hooks = [train_helper.PrefillStagingAreaHook(), tf_debug.LocalCLIDebugHook()]

      如图1所示示例，添加tfdbg的hook。
      图1 Estimator模式
    • session.run模式：
      from tensorflow.python import debug as tf_debug
sess = tf_debug.LocalCLIDebugWrapperSession(sess, ui_type="readline")

      如图2所示示例，在run之前设置tfdbg装饰器。
      图2 session.run模式

  2. 执行推理脚本。
  3. 应用程序推理完成后，视图进入调试命令行交互模式tfdbg，执行run命令。

    run命令执行完成后，会在命令行交互界面保存数据为npy格式文件。

收集npy数据文件

run命令执行完成后，需要收集npy文件，但由于tfdbg一次只能dump一个tensor，为了自动收集所有npy文件，具体执行操作如下：

  1. 在tfdbg命令行视图下执行lt > tensor_name命令，将所有tensor的名称暂存到文件里。
  2. 重新开启一个命令行窗口，在新的命令行窗口下执行如下命令，用以生成在tfdbg命令行执行的命令。

    timestamp=$[$(date +%s%N)/1000] ; cat tensor_name | awk '{print "pt",$4,$4}' | awk '{gsub("/", "_", $3);gsub(":", ".", $3);print($1,$2,"-n 0 -w "$3".""'$timestamp'"".npy")}' > tensor_name_cmd.txt

    该示例生成符合精度比对需要的npy文件名称格式。其中，tensor_name为自定义tensor列表对应的文件名，timestamp需满足[0-9]{1,255}正则表达式。

  3. 回到tfdbg命令行，输入run执行脚本后，将上一步生成的所有tensor存储的命令粘贴执行，即可存储所有npy文件。

    npy文件默认是以numpy.save()形式存储的，上述命令会将“/”与“:”用下划线_替换。

    如果命令行界面无法粘贴文件内容，可以在tfdbg命令行中输入“mouse off”指令关闭鼠标模式后再进行粘贴。

  4. 检查生成的npy文件命名是否符合规则，如图3所示。

    • npy文件命名规则：{op_name}.{output_index}.{timestamp}.npy，其中op_name字段需满足“A-Za-z0-9_-”正则表达式规则，timestamp需满足[0-9]{1,255}正则表达式，output_index为0~9数字组成。
    • 如果因算子名较长，造成按命名规则生成的npy文件名超过255字符而产生文件名异常，这类算子不支持精度比对。
    • 因tfdbg自身原因或运行环境原因，可能存在部分生成的npy文件名不符合精度比对要求，请按命名规则手工重命名。如果不符合要求的npy文件较多，请参考如何批量处理生成的npy文件名异常情况重新生成npy文件。
    图3 查询.npy文件

父主题： 推理场景数据准备


准备ONNX模型npy数据文件

ONNX原始数据文件准备要求

  • 文件内容以numpy（.npy）格式保存。
  • 文件命名以{op_name}.{output_index}.{timestamp}.npy形式命名。设置numpy数据文件名包括output_index字段且值为0，确保转换生成的dump数据的output_index为0。因为精度比对时默认从第一个output_index为0的数据开始，否则无比对结果。
  • 需要确保每个算子节点有名称，否则无法生成正确的文件名。没有名称的算子节点需要先生成名称。
  • 本参考示例以每个节点只有一个输出为例，多个输出的需要在文件名生成处适配output_index的获取。

代码参考示例

本版本不提供ONNX模型npy数据生成功能，请自行安装ONNX环境并提前准备ONNX原始数据“*.npy”文件。本文仅提供生成符合精度比对要求的numpy格式ONNX原始数据“*.npy”文件的样例参考。

为输出符合精度比对要求的“*.npy”数据文件，需在推理结束后的代码中增加dump操作，示例代码如下：

import os
import onnx
import onnxruntime
import numpy as np
import time

from skl2onnx.helpers.onnx_helper import enumerate_model_node_outputs
from skl2onnx.helpers.onnx_helper import select_model_inputs_outputs
from skl2onnx.helpers.onnx_helper import save_onnx_model

#修改模型，增加输出节点
model_onnx = onnx.load("./resnet50.onnx")
output = []
for out in enumerate_model_node_outputs(model_onnx):
    output.append(out)

num_onnx = select_model_inputs_outputs(model_onnx,outputs=output)
save_onnx_model(num_onnx, "resnet50_dump.onnx")

#推理得到输出，本示例中采用随机数作为输入
input_data = np.random.random((1,3,224,224)).astype(np.float32)
input_data.tofile("test_data.bin")
sess = onnxruntime.InferenceSession("resnet50_dump.onnx")
input_name = sess.get_inputs()[0].name
output_name = [node.name for node in sess.get_outputs()]
res = sess.run(output_name, {input_name: input_data})

#获得输出名称，确保每个算子节点有对应名称
node_name = [node.name for node in model_onnx.graph.node]

#保存数据
node_output_num = [len(node.output) for node in model_onnx.graph.node]
idx = 0
for num, name in zip(node_output_num, node_name):
    for i in range(num):
        data = res[idx]
        file_name = name + "." + str(i) + "." + str(round(time.time() * 1000000)) + ".npy"
        output_dump_path = os.path.join("./onnx_dump/", file_name)
        np.save(output_dump_path, data.astype(np.float16))
        idx += 1

需要根据代码中的output_dump_path参数在当前目录新建对应“onnx_dump”目录或自定义目录。

父主题： 推理场景数据准备


准备离线模型dump数据

前提条件

本节介绍通过MindStudio提供的dump功能，生成离线模型的dump数据。启动dump前，需要完成以下操作：

  • 完成Caffe、TensorFlow或ONNX模型的ATC模型转换，将原始模型转换为OM离线模型。详细介绍请参见模型转换和调优。
  • 完成应用工程的开发、编译和运行，确保具备可执行的应用工程。详细介绍请参见应用开发。

生成dump数据文件

您可以参考以下步骤生成dump数据：

  1. 打开MindStudio，选择“Ascend > Dump Configuration”菜单，弹出“Select Offline Model”窗口，如图1所示。

    您也可以通过打开工程文件，然后右键单击.om模型文件，选择“Dump Configuration”菜单的方式配置dump。

    图1 选择.om模型文件

  2. 选择.om模型文件，单击“OK”，展示模型文件结构，设置dump开关。如图2所示。

    • 如果涉及多个模型需要dump数据，则需要分别设置各个模型文件的dump配置项。
    • 当使用相同系列网络模型时，可能会存在因模型的Model Name值相同，造成生成的acl.json文件中dump配置混淆。

      例如，先使用yolov2进行了dump配置，然后又使用yolov3，此时虽然未对yolov3配置，但acl.json文件中已经记录了yolov2的dump配置，又因为yolov2与yolov3的Model Name值相同，这样就会出现yolov3继承了yolov2的配置。

      因此，当存在因使用相同系列网络模型造成Model Name相同时，可以通过修改Caffe模型文件prototxt中的name字段值并重新进行模型转换，使得系列模型的name字段值不同；也可以在dump配置时先选择None进行清理之前的配置，再次重新进行dump配置。

    图2 设置dump

    通过窗口右侧配置项，设置.om模型文件的dump配置项。

    表1 参数说明

    参数

    说明

    Dump Option

    配置dump范围。取值为：

    • ALL：所有算子开启dump。
    • Several：自定义部分算子开启dump。选择该项后，需要右键单击待dump数据的算子并选择“Enable Dump”。
    • None：所有算子不开启dump。

    Dump Mode

    dump数据模式。取值为：

    • All：同时dump算子的输入、输出数据。
    • Input：dump算子的输入数据。
    • Output：dump算子的输出数据。

    Dump Path

    配置保存dump数据文件的路径，默认为：{project_path}/dump。如果Dump Path设置为其他路径，需要确保MindStudio安装用户对该路径具有读写权限。

    AclConfig File

    Acl配置文件，在dump操作中该文件保存算子的dump配置信息。一般路径为{project_path}/src/acl.json，实际路径可以在{project_path}/.project文件中查找。格式如图3或图4所示。当选择整个模型dump时，不含layer字段。
    • 不具有输出的TBE算子、AI CPU算子，如StreamActive、NetOutput、Send、Recv、const等不会生成dump数据。
    • 编译后的模型中部分算子并不会在AI CPU或AI Core执行，如concatD类型算子，则无法生成dump数据。
    • 采用dump部分算子场景下，因data算子不会在AI CPU或AI Core上执行，如果用户dump data节点算子，需要一并选择dump data节点算子的后继节点，才能dump出data节点算子数据。
    • 对于关联的算子需要同时开启或关闭dump：通过ATC解析OM模型文件得到算子之间的映射关系，识别出是新增算子、一对多、多对一、多对多、L1 Batch等关系。
    • const算子不支持开启dump。
    图3 整网所有算子开启dump
    图4 部分算子开启dump

  3. 设置dump完成后，分别单击MindStudio界面“Build”和“Run”菜单，重新编译和运行应用工程。

    设置dump完成后，单击MindStudio界面“Build”编译工程。

    参考SSH连接管理将用户设置为mdc，然后参考修改运行任务配置选择新增的mdc用户，单击“Run”运行工程。

    SSH连接和在MindStudio中远程运行功能仅在Development版本提供。

    建议先检查工程文件代码，确保正确引用了设置dump配置的.om模型文件。例如检查aclmdlLoadFromFile()函数或aclmdlLoadFromFileWithMem()函数。

    工程运行完毕后，可以在{project_path}/dump路径下查看到生成的dump数据文件。生成的路径及格式说明：

    time/device_id/model_name/model_id/data_index/dump文件
    表2 字段说明

    字段

    说明

    time

    dump数据回传落盘时间。格式为：YYYYMMDDhhmmss。

    device_id

    设备ID。

    model_name

    模型名称。

    model_id

    模型ID。

    data_index

    针对每个Task ID执行的次数维护一个序号，从0开始计数，该Task每dump一次数据，序号递增1。

    dump文件

    命名规则如数据格式要求。

    注：如果model_name、op_type、op_name出现了“.”、“/”、“\”、空格时，转换为下划线表示。

父主题： 推理场景数据准备


Tensor比对

  • 概述
  • 约束说明（仅推理场景）
  • 整网比对
  • 单算子比对
  • 精度问题分析流程
  • 扩展功能
父主题： 精度比对


概述

Tensor比对提供整网比对和单算子比对两种精度比对方式，请根据比对场景选择比对方式。

  • 整网比对：将准备好的标准数据文件与待比对数据文件作为输入文件，通过对文件内所有参与计算的算子进行精度比对。
  • 单算子比对：在整网比对的基础上指定具体算子名，对单个算子进行详细数据的比对。

标准数据文件与待比对数据文件的准备请参见整网比对，具体比对场景请参见单算子比对。

父主题： Tensor比对


约束说明（仅推理场景）

约束

  • 需要确保NPU Dump模型的数据文件与Ground Truth模型的数据文件为相同模型的数据。如果不是相同模型的数据，但模型中有相同的算子名称，也可以进行比较，但结果数据只显示匹配到的相同算子的比对结果。
  • 如果在图编译过程中，原图的算子发生了融合，导致算子的output在编译后的模型中找不到对应的output时，该算子无法进行比对。
  • 如果在图编译阶段对图做了结构性修改（如stride切分、L1 fusion、L2 fusion）的场景，会造成算子的input或output无法比对。
  • 如果比对数据两边相同算子有dump数据，但算子的shape不一致（离线模型算子shape变小）或format不支持转换，该算子无法进行比对。
  • 量化模型里经过量化处理的算子无法比对，必须是反量化的输出才能比对。例如，量化模型里AscendQuant算子的output无法比对。
  • 本节中使用到的文件的存放路径不能包含中文字符、特殊字符等，仅支持双引号中的字符组成的路径：“./\:_- 0-9a-zA-Z”。

说明

  • 针对FastRCNN网络场景，ProposalD算子及之后的算子，算子精度不达标属于正常情况，最终结果以FSRDetectionOutput算子的比对结果精度为准。
  • 当模型转换对输入数据做了额外的预处理，造成原始模型的输入与离线模型的data算子输入格式不同时（比如AIPP场景下data输入为YUV），data算子比对结果异常、不具备参考意义。
  • 精度比对工具推荐环境配置：CPU 8核 2.6Ghz，内存16GB，低于该配置可能会造成比对缓慢。
  • 使用量化离线模型在对应 AI处理器上运行生成的dump数据作为待比对数据时，由于量化与反量化算子之间存在影响精度的中间算子，在比对时会与源数据产生较大的精度损失，所以精度比对时会过滤掉中间算子进行比对，此时输出的结果将不包含整网的所有算子。
父主题： Tensor比对


整网比对

  • 比对操作
  • 比对结果
  • 比对结果专家建议
父主题： Tensor比对


比对操作

  1. 在MindStudio界面菜单栏选择“Ascend > Model Accuracy Analyzer > New Task”菜单，进入比对界面，如下图所示。

    图1 New Task（Linux_Remote Run_1）
    图2 New Task（Linux_Remote Run_2）
    图3 New Task（Linux_Local Run）
    图4 New Task（Windows_1）
    图5 New Task（Windows_2）

  2. 根据实际需求配置比对参数。各参数详细配置说明请参见表1。

    表1 精度比对New Task参数说明

    参数

    说明

    Run Mode
    • Remote Run：远程运行。
    • Local Run：本地运行。

    Windows使用场景下仅支持Remote Run，该参数不展示。

    Deployment

    运行配置，选择Remote Run模式时可见。通过Deployment功能，详细请参见Ascend Deployment，可以将指定项目中的文件、文件夹同步到远程指定机器的指定目录。

    Remote Toolkit Path

    远端运行环境toolkit软件包安装路径，选择Remote Run模式时可见。例如配置为${HOME}/Ascend/ascend-toolkit/{version}/toolkit。

    与Deployment参数为绑定关系，单击“Start”后参数值将被保存。再次配置时，如连接已配置过的Deployment，则参数自动填充，可手动修改。

    Environment Variables

    环境变量配置，选择Remote Run模式时可见，可以直接在框中输入，也可以单击 [image] 后在弹窗内单击 [image] 填写。

    当Model File指定文件为离线模型文件（*.om）时，需要配置环境变量，否则工具将无法为离线模型文件（*.om）进行ATC转换导致比对失败。

    与Deployment参数为绑定关系，单击“Start”后参数值将被保存。再次配置时，如连接已配置过的Deployment，则参数自动填充，可手动修改。

    Output Path

    比对数据结果存放路径。无论选择Remote Run模式还是Local Run模式，均需要指定为本端路径。默认路径为当前系统的用户目录。

    Analysis Mode

    精度比对分析模式。可选择模式为：

    • NPU vs NPU：表示两个比对文件均为对应 AI处理器上运行生成的dump数据文件。此时Model File参数可选。一般用于分析开启和关闭融合规则时进行模型转换后的dump数据文件之间的精度差。模型转换开启和关闭融合规则的详细介绍请参见模型转换和调优。
    • NPU vs GPU/CPU：表示对应 AI处理器上运行生成的dump数据文件与原始模型的npy文件进行比对。此时展示Framework必选参数。

    Framework

    比对数据所属的框架类型。Analysis Mode为NPU vs GPU/CPU时可见。可选类型为：

    • TensorFlow：TensorFlow框架模型dump数据的精度比对，支持推理、训练场景，Model File参数必选。
    • ONNX：ONNX框架模型dump数据的精度比对，支持推理场景，Model File参数必选。
    • Caffe：Caffe框架模型dump数据的精度比对，支持推理场景，Model File参数必选。

    NPU Dump

    对应 AI处理器上运行生成的dump数据文件目录。

    在远端执行比对时（Remote Run），须指定远端设备上的dump数据文件目录。

    Model File

    模型文件或融合规则文件。

    • Analysis Mode为NPU vs NPU时，进行离线模型转换开启算子融合功能前后的dump数据精度比对，需要指定开融合的算子映射文件（.json）或离线模型文件（*.om）和关融合的算子映射文件（.json）或离线模型文件（*.om）。
    • Analysis Mode为NPU vs GPU/CPU时，根据Framework选择的框架类型选择不同的文件：
      • TensorFlow：推理场景选择昇腾模型压缩后的量化融合规则文件（json文件）或离线模型文件（*.om）；训练场景选择计算图文件（*.txt）。
      • ONNX：选择昇腾模型压缩后的量化融合规则文件（json文件）或离线模型文件（*.om）。
      • Caffe：选择昇腾模型压缩后的量化融合规则文件（json文件）或离线模型文件（*.om）。

    具体选择文件请参见比对场景。

    Quantization Rule File（.json）

    量化算子映射关系文件（昇腾模型压缩输出的json文件）。仅Framework为Caffe时展示。

    Ground Truth

    原始模型的npy文件目录。

    在远端执行比对时（Remote Run），须指定远端设备上的原始模型的npy文件目录。

    Algorithm

    比对算法维度。取值为：

    • Cosine Similarity：余弦相似度算法，默认勾选。
    • Relative Euclidean Distance：欧氏相对距离算法，默认勾选。
    • Absolute Error，绝对误差，默认勾选，此项执行的比对算法为：
      • Max Absolute Error：最大绝对误差。
      • Mean Absolute Error：平均绝对误差。
      • Root Mean Square Error：均方根误差。
    • Relative Error，相对误差，默认勾选，此项执行的比对算法为：
      • Max Relative Error：最大相对误差。
      • Mean Relative Error：平均相对误差。
      • Accumulated Relative Error：累积相对误差。
    • Kullback Leibler Divergence：KL散度算法，默认不勾选。
    • Standard Deviation：标准差算法，默认不勾选。

    与Customized Algorithm自定义算法之间至少勾选一种算法。

    Advance Options

    扩展选项。包括Customized Algorithm、Advisor和Operator Range。

    Customized Algorithm

    自定义算法文件路径。

    与Algorithm内置算法之间至少勾选一种算法。

    需用户自行准备自定义算法.py文件，所在目录格式为“algorithm”，指定该目录下的自定义算法.py文件，生成自定义算法。自定义算法.py文件相关要求参见《CANN 6.3.RC2 精度比对工具使用指南》中的“准备自定义算法.py文件”章节。

    Advisor

    专家系统分析开关，默认关闭。开启后会在完成整网比对后对比对结果进行专家系统分析并输出问题节点、问题类型和优化建议。详细介绍请参见比对结果专家建议。

    本参数要求pandas为1.3或更高版本。

    与Operator Range无法同时开启。

    Operator Range

    设定算子比对范围。有两种设置方式：

    • 方式一：单击“Select”按钮，在弹出框内勾选需要比对的算子。
    • 方式二：根据Start、End、Step参数配置比对算子的范围。
      • start：第一个比对的算子，取值范围为[1, 参与计算的算子个数]，默认值为1。
      • end：最后一个比对的算子，取值范围为-1或[start, 参与计算的算子个数]，默认值为-1（动态获取网络模型中最后一个参与计算的算子）。
      • step：第start+step*n个比对的算子，step取值范围为[1, 参与计算的算子个数)，默认值为1，n为从1开始的正整数。
      • 配置格式为：“start,end,step”。比如：-r 1,101,20，表示算子1,21,41,61,81,101的Tensor参与比对。

    不配置本参数时，比对网络模型中的所有参与计算的算子。

    配置本参数且Analysis Mode参数配置为NPU vs NPU时，需同时指定NPU Dump和Ground Truth的Model File分别指定开融合的算子映射文件（.json）或离线模型文件（*.om）和关融合的算子映射文件（.json）或离线模型文件（*.om）。

    与Advisor无法同时开启。

    不建议调用与当前用户不一致的其它用户目录下的自定义算法文件（Customized Path）和OM模型文件，避免提权风险。当选择其他用户下的文件时，系统将提示风险。

  3. 单击“Start”按钮。

    结果说明请参考比对结果。

父主题： 整网比对


比对结果

Tensor比对结果及说明。

图1 Tensor比对结果

Tensor比对结果界面分为8个区域。其中1~4区域为整网比对结果，如图1所示，详细介绍请参见表1；5区域为整网比对结果的专家系统分析结果，详细介绍请参见比对结果专家建议。6~8区域为单算子比对功能及结果展示，详细介绍请参见单算子比对。

表1 整网比对结果说明
区域 | 区域名称 | 说明
1 | 菜单栏 | 从左到右分别为Open…、New Task、Refresh、Help四项功能。Open…为打开并展示比对结果csv文件；New Task为创建新的比对任务；Refresh用于读取并刷新File Manager中管理的文件；单击Help弹出小窗，可展示精度比对工具的使用限制（Restrictions）、使用建议、在线教程链接等。
2 | File Manager，历史数据管理 | 显示用户指定文件夹以及文件夹下生成的整网比对的csv文件以及显示通过Open…单独打开的csv文件；对文件夹和csv，提供历史数据管理功能，包括打开、删除、另存为；在文件夹处右键删除；在空白处右键创建新比对任务（New Task）、刷新（Refresh）和Open…（打开并展示比对结果csv文件）。
3 | Model Accuracy Analysis，精度比对分析界面 | 默认仅显示有结果的算子。可单击列名，进行排序，各列字段含义请参见表2。 单击勾选Show Invalid Data，可展示无法比对的数据；单击勾选Show Highlight Data，仅展示不符合Highlight阈值的比对结果数据；去勾选Show Highlight Data状态下，滑动右侧Highlight游标，则表格中不符合Highlight阈值的数据标红；Show Highlight Data由勾选转变为去勾选的状态，表格还原到默认状态。
4 | Scatter Diagram，各项算法指标的散点分布图 Show Model，比对模型可视化展示 | Scatter Diagram：横坐标表示算子的执行顺序，纵坐标为算法指标在对应Tensor上的实际取值。各字段含义请参见表3。 Show Model：分别展示NPU和Ground Truth的模型图。详细介绍请参见表4。
注：历史数据管理功能暂不支持数据老化，即当磁盘空间不足时系统无法自动删除多余的历史文件，请用户自行删除多余的文件以保证比对程序的运行。
表2 比对结果字段说明

字段

说明

Index

网络模型中算子的ID。

OpSequence

算子运行的序列。全网层信息文件中算子的ID。仅配置“Operator Range”时展示。

OpType

算子类型。

NPUDump

表示NPU Dump模型的算子名。光标悬浮时，可显示具体算子所在的文件路径。

DataType

表示NPU Dump侧数据算子的数据类型。

Address

dump tensor的虚拟内存地址。用于判断算子的内存问题。仅基于对应 AI处理器运行生成的dump数据文件在整网比对时可提取该数据。

GroundTruth

表示Ground Truth模型的算子名。光标悬浮时，可显示具体算子所在的文件路径。

DataType

表示Ground Truth侧数据算子的数据类型。

TensorIndex

表示NPU Dump模型算子的input ID和output ID。

Shape

比对的Tensor的Shape。

OverFlow

溢出算子。显示YES表示该算子存在溢出；显示NO表示算子无溢出；显示NaN表示不做溢出检测。

开启Advisor功能时展示，为比对结果专家建议的FP16溢出检测专家建议提供数据。

CosineSimilarity

进行余弦相似度算法比对出来的结果。取值范围为[-1,1]，比对的结果如果越接近1，表示两者的值越相近，越接近-1意味着两者的值越相反。

RelativeEuclideanDistance

进行欧氏相对距离算法比对出来的结果。取值范围为0到无穷大，值越接近于0，表明越相近，值越大，表明差距越大。

MaxAbsoluteError

进行最大绝对误差算法比对出来的结果。取值范围为0到无穷大，值越接近于0，表明越相近，值越大，表明差距越大。

MeanAbsoluteError

表示平均绝对误差（MAE），取值范围为0到无穷大。

  • MeanAbsoluteError趋于0，RootMeanSquareError趋于0，说明测量值与真实值越近似。
  • MeanAbsoluteError趋于0，RootMeanSquareError越大，说明存在局部过大的异常值。
  • MeanAbsoluteError越大，RootMeanSquareError等于或近似MeanAbsoluteError，说明整体偏差越集中。
  • MeanAbsoluteError越大，RootMeanSquareError越大于MeanAbsoluteError，说明存在整体偏差，且整体偏差分布分散。
  • 不存在以上情况的例外情况，因为RootMeanSquareError ≥ MeanAbsoluteError恒成立。

RootMeanSquareError

表示均方根误差（RMSE），取值范围为0到无穷大。

  • MeanAbsoluteError趋于0，RootMeanSquareError趋于0，说明测量值与真实值越近似。
  • MeanAbsoluteError趋于0，RootMeanSquareError越大，说明存在局部过大的异常值。
  • MeanAbsoluteError越大，RootMeanSquareError等于或近似MeanAbsoluteError，说明整体偏差越集中。
  • MeanAbsoluteError越大，RootMeanSquareError越大于MeanAbsoluteError，说明存在整体偏差，且整体偏差分布分散。
  • 不存在以上情况的例外情况，因为RootMeanSquareError ≥ MeanAbsoluteError恒成立。

MaxRelativeError

表示最大相对误差。取值范围为0到无穷大，值越接近于0，表明越相近，值越大，表明差距越大。

MeanRelativeError

表示平均相对误差。取值范围为0到无穷大，值越接近于0，表明越相近，值越大，表明差距越大。

AccumulatedRelativeError

进行累积相对误差算法比对出来的结果。取值范围为0到无穷大，值越接近于0，表明越相近，值越大，表明差距越大。

StandardDeviation

进行标准差算法比对出来的结果。取值范围为0到无穷大。标准差越小，离散度越小，表明越接近平均值。该列显示NPU Dump和Ground Truth两组数据的均值和标准差，第一组展示NPU Dump模型dump数据的数值(均值;标准差)，第二组展示Ground Truth模型dump数据的数值（均值;标准差）。

KullbackLeiblerDivergence

进行KL散度算法比对出来的结果。取值范围为0到无穷大。KL散度越小，真实分布与近似分布之间的匹配越好。

CompareFailReason

算子无法比对的原因。

若余弦相似度为1，则查看该算子的输入或输出shape是否为空或全部为1，若为空或全部为1则算子的输入或输出为标量，提示：this tensor is scalar。

注1：余弦相似度和KL散度比较结果为NaN，其他算法有比较数据，则表明左侧或右侧数据为0；KL散度比较结果为inf，表明右侧数据有一个为0；比对结果为nan，表示dump数据有nan。

注2：光标悬浮在表头可以看到对应的参数详细解释。

注3：若配置了自定义算法比对，则在比对结果的内置算法后增加对应自定义算法列。

注4：单击表中任意结果单元格，右侧散点分布图或模型图可跳转到对应算子并高亮；单击右侧Show Model的模型中任意算子，左侧表中对应算子的单元格高亮。

表3 散点分布图字段说明
字段 | 说明
Algorithm | 选择展示对应比对算法结果的散点分布图，不支持展示StandardDeviation、KullbackLeiblerDivergence和AccumulatedRelativeError。
Tensor | 过滤显示Input、Output结果散点分布图。
Highlight | 算子精度阈值。通过滑动游标在对应算法指标的[min,max]间滑动来设置算法指标（纵坐标）的阈值，符合阈值的点显示为蓝色，不符合阈值的点显示为红色，同时左侧表格不符合阈值的数据标红。对于CosineSimilarity算法来说低于阈值的数据为不符合；对于其他算法来说，高于阈值的数据为不符合。
注1：光标移动到对应Tensor点上时，浮窗显示Tensor信息。信息包括：Index（Tensor对应算子的Index）、Op Name（算子名称）、Tensor Index（Tensor类型（input/output））以及Value（在当前算法维度下的Tensor数值）。 注2：支持对散点图进行缩放。 注3：指定区域3中的Tensor时，高亮对应Tensor点。
表4 比对模型可视化展示字段说明
字段 | 说明
NPU Model | 离线模型可视化。指定算子映射文件（.json）或离线模型文件（*.om）展示。 训练场景下，若整网比对使用的Model File为计算图文件（*.txt），此处不支持展示模型图。
Ground Truth Model | 原始模型可视化。指定原始模型文件展示。
Input Model | 指定算子映射文件（.json）、离线模型文件（*.om）或原始模型文件。
注1：选中区域3中的某个Tensor时，模型网络跳转到对应节点并高亮。 注2：滑动散点分布图中的Highlight游标，模型网络中不符合Highlight阈值的节点标红。
父主题： 整网比对


比对结果专家建议

  • 概述
  • 分析结果说明
父主题： 整网比对


概述

精度比对工具本身只提供自有实现算子在对应 AI处理器上的运算结果与业界标准算子的运算结果的差异比对功能，而输出的比对结果需要用户自行分析并找出问题。而对结果的分析工作对于用户来说也是一大难点，本节提供专家系统工具为用户提供精度比对结果的结果分析功能，有效减少用户排查问题的时间。只需在比对操作配置任务时勾选“Advisor”选项，系统则会在比对完成后自动进行结果文件的分析，并输出优化建议。

当前支持的分析检测类型有：FP16溢出检测、输入不一致检测、整网一致性检测（整网一致性检测包括：问题节点检测、单点误差检测和一致性检测三个小点）

父主题： 比对结果专家建议


分析结果说明

专家系统分析结果展示在比对结果的5区域。

图1 专家系统分析结果（仅为示例）

Float16溢出检测

针对比对数据中数据类型为Float16的数据，进行溢出检测。如果存在溢出数据，输出专家建议。

专家系统分析结果：

Detection Type: FP16 overflow

Operator Index: 228

Expert Advice: Float16 data overflow occurs. Rectify the fault and perform comparison again.

检测类型：Float16溢出检测

Operator Index：228

专家建议：存在Float16数据溢出，请修正溢出问题，再进行比对。

输入不一致检测

针对整网的输入数据进行检测，主要判断整网两批待比对数据的输入data是否一致。如果存在不一致问题（余弦相似度<0.99），输出专家建议。

专家系统分析结果：

Detection Type: Input inconsistent

Operator Index: 0

Expert Advice: The input data of NPUDump is inconsistent with that of GroundTruth. Use the same data or check the data preprocessing process.

检测类型：输入不一致检测

Operator Index：0

专家建议：NPUDump和GroundTruth间的输入数据不一致，请使用相同数据或者检查数据预处理流程。

整网一致性检测（问题节点检测）

判断整网比对结果中，是否某层小于阈值，该层后续数据均小于阈值或最后一层小于阈值（余弦相似度<0.99），输出量化误差修正建议。

专家系统分析结果：

Detection Type: global consistency

Operator Index: 1174

Expert Advice: The accuracy of some tensors is low, resulting in an unqualified final accuracy. This may be caused by quantization. Calibrate the data or contact Huawei for further diagnosis.

检测类型：整网一致性检测

Operator Index：1174

专家建议：部分张量精度较低，且导致最终结果精度不达标；很可能由量化造成，请进行数据校准或者反馈给华为做进一步定位。

整网一致性检测（单点误差检测）

判断整网比对结果中，是否某层小于阈值（余弦相似度<0.99），但最终结果符合精度要求，输出专家建议。

专家系统分析结果：

Detection Type: global consistency

Operator Index: 195

Expert Advice: The accuracy of some tensors is low, while the final accuracy is qualified. This may be caused by Ascend internal optimization. Ignore or contact Huawei for further diagnosis.

检测类型：整网一致性检测

Operator Index：195

专家建议：部分张量精度较低，但最终结果精度达标，可能由内部优化导致，请忽略或反馈给华为做进一步定位。

整网一致性检测（一致性检测）

比对结果中的所有数据均符合精度要求，输出专家建议。

专家系统分析结果：

Detection Type: global consistency

Operator Index: NA

Expert Advice: All data in the comparison result meets the accuracy requirements.

If data accuracy of the model is still not up to standard in practical application, please check the post-processing process of model outputs.

检测类型：整网一致性检测

Operator Index：NA

专家建议：比对结果中的所有数据均符合精度要求。

如果模型实际应用中，精度依旧不达标，请排查输出数据的后处理流程。

父主题： 比对结果专家建议


单算子比对

单算子比对界面说明

单算子比对功能是在比对结果的基础上选择具体算子并根据需要指定参数进行比对的。界面展示为Tensor比对结果界面的6区域、7区域和8区域，如图1所示。详细介绍请参见表1。

图1 单算子比对
表1 单算子比对结果说明
区域 | 说明
6 | Operator Detail，单算子比对功能。下发单算子比对命令。具体操作请参见比对操作。 其中Dump Network按钮为子模型导出，单击后在MindStudio主界面弹出Dump Network界面，子模型导出详细介绍请参见子模型导出与比对。
7 | 单算子比对TopN结果。各列字段解释请参见表2。
8 | Cumulative Error，对于TopN Tensor元素，绘制的误差累积分布折线图。详细介绍请参见表2。

比对操作

单算子比对操作功能界面展示为图1的6区域，如图2所示。操作步骤如下：

图2 单算子比对操作
  1. 基于已经读取到的Tensor信息，通过Operator下拉框选择要比对的算子和对应Tensor（output/input）。
  2. 通过Metric选择比对算子的Absolute Error（绝对误差）或Relative Error（相对误差）。
  3. 配置输出该指标的TopN个Tensor元素（取值范围为[1,10000]）。
  4. 单击“Compare”按钮进行单算子比对。

    TopN结果显示请参见比对结果。

比对结果

单算子比对结果界面展示为图1的7区域和8区域，如图3所示。详细介绍请参见表2。

图3 单算子比对结果
表2 比对结果字段说明
字段 | 说明
7区域
Index | 算子比对的条数。
N C H W | 数据格式。
NPUDump | NPU Dump侧算子的dump值。
GroundTruth | Ground Truth侧算子的dump值。
AbsoluteError | 绝对误差，NPU Dump侧算子的dump值减Ground Truth侧算子的dump值取绝对值比对出来的结果。小数点后最多6位。
RelativeError | 相对误差，Absolute Error值除以Ground Truth侧算子的dump值比对出来的结果。当Ground Truth侧算子的dump值为0时，该处显示为“-”。小数点后最多6位。
8区域
A % of tensor elements (B elements) have an absolute error greater than C. | 当前算子比对的所有tensor元素的绝对误差结果中有A %的tensor也就是B个元素的绝对误差超过了C。其中absolute error根据5区域配置的Metric取值变化可以为relative error；右侧滑块控制C的取值，范围由6区域AbsoluteError或RelativeError的最大最小值决定。
误差累积分布折线图 | 横坐标为6区域的AbsoluteError或RelativeError，取值范围由AbsoluteError或RelativeError的最大最小值决定；纵坐标为累积百分占比，含义为AbsoluteError或RelativeError到达某个阈值时，小于等于该阈值的所有tensor元素在整体tensor元素中的占比。
注：光标移动到对应Tensor点上时，浮窗显示Tensor信息。信息包括：Index（算子比对的条数）、Absolute Error/Relative Error（绝对/相对误差）、Cumulative Percentage（累积百分占比）。
父主题： Tensor比对


精度问题分析流程

精度比对完成后若存在精度问题，则需要进行问题分析并找出解决方案，图1以Caffe推理应用场景为例提供精度问题分析基本思路参考。

图1 精度问题分析基本思路

以下介绍图1中各步骤的具体操作：

  1. 确认第一层data层的输入数据是否正确：找一张有精度问题的图片，编译、指令仿真、Caffe都用这张图片。比较仿真和Caffe每层的相似度。而后按照上图中顺序进行判断。
  2. 确认data层的相似度是否为≥0.999：
    • 是：执行下一个判断。
    • 否：确认data层输入一致。检查均值[mean_file]、缩放[data_scale]、预处理方式[norm_type]，是否和Caffe一致。（Mxnet和Darknet(yolo)）网络训练时，默认是RGB，所以转换模型时需要配置[RGB——order]为RGB。
  3. 确认是否存在data层相似度0.99+，逐层下降，最后一层小于0.95的情况：
    • 是：确认是否量化误差导致。

      修改ATC的配置项，配置[dump_data]为1，输出校准数据到mapper_quant目录。

      配置[forward_quantization_option]为1，即只做数据量化，权重不量化。比较mapper_quant和caffe的相似度，如果相似度达标，说明是权重量化误差导致。

      配置[forward_quantization_option]为2，即只做权重量化，数据不量化。比较mapper_quant和caffe的相似度，如果相似度达标，说明是数据量化误差导致。

      • 是：使用AMCT工具进行Calibration校准或者重训。
      • 否：向技术支持人员反馈问题。
    • 否：执行下一个判断。
  4. 确认是否存在最后一层相似度为0.99，中间某些层相似度＜0.90的情况：
    • 是：确认层的匹配情况。

      ATC优化网络结构，以适应硬件执行，所以相似度比较时有可能层和Caffe不匹配。

      1. 判断是否为Inplace写法，即top与bottom名称相同。某些层不支持Inplace，需要拆分。例如conv + tanh，在Caffe支持Inplace，只输出tanh的数据，而ATC不支持conv与tanh融合，分别输出conv和tanh，所以比较时需要注意。
      2. 判断是否为ATC修改网络。请查看cnn_net_tree.dot（ATC编译时生成），和原来的prototxt比较，是否修改了网络结构。如SPP层拆分为Pooling和Concat，所以要与Concat的结果比，或直接观察后面层的相似度（即执行下一个判断）。
      3. 层匹配，但相似度较低，向技术支持人员反馈问题。
    • 否：执行下一个判断。
  5. 如果所有层的相似度均为0.99+且绝对误差也很小，则可能是后处理的问题，确认后处理是否正确。

    假设Caffe的结果经过Caffe的后处理画框或分类，则把仿真结果也使用Caffe的后处理，观察是否正常画框或分类。

    如果正常，则说明是板端后处理问题，请比较板端和Caffe的后处理代码。

    如果不正常，而数据的相似度为0.99且绝对误差很小，则说明Caffe的后处理代码对数据很敏感，请检查Caffe的后处理代码。

  6. 向技术支持人员反馈问题。

    请将以下信息反馈给技术支持人员：

    • 如果是Caffe则返回prototxt、caffemodel，如果是PyTorch则返回ONNX模型和py定义，pth文件。如果不方便提供模型，请提供问题层对应的prototxt、py、pth、weights和输入/输出数据。
    • 编译用的参数、图片、均值文件。
    • 编译时打印的ATC版本号，如：Mapper Version 1.0.0.0_B010(PICO_1.0) 2110161033840ed952(CPU)(INST_2.0.9)
父主题： Tensor比对


扩展功能

  • dump数据文件转换为npy数据文件
  • npy与npy文件间的精度比对
  • 子模型导出与比对
父主题： Tensor比对


dump数据文件转换为npy数据文件

MindStudio精度比对工具提供dump数据文件转换为npy数据文件功能，用于用户根据自身需求将对应 AI处理器生成的dump数据文件转换成npy数据文件，方便查看或进行npy与npy文件间的精度比对。

  1. 在MindStudio界面菜单栏选择“Ascend > Model Accuracy Analyzer > Covert”菜单，进入转换配置界面，如下图所示，界面中参数解释如表1所示。

    图1 转换配置（Local Run）
    图2 运行配置（Remote Run）

    Remote Run模式下，配置完运行配置后，单击“Next”进入到转换配置界面，如图3所示。

    图3 转换配置（Remote Run）
    表1 参数说明

    参数

    说明

    Run Mode
    • Remote Run：远程运行。
    • Local Run：本地运行。

    Windows使用场景下仅支持Remote Run，该参数不展示。

    Deployment

    运行配置，选择Remote Run模式时可见，必选配置。通过Deployment功能，详细请参见Ascend Deployment，可以将指定项目中的文件、文件夹同步到远程指定机器的指定目录。

    Remote Toolkit Path

    远端运行环境Ascend-cann-toolkit软件包安装路径，选择Remote Run模式时可见，必选配置。例如配置为${HOME}/Ascend/ascend-toolkit/{version}/toolkit。

    与Deployment参数为绑定关系，单击“Next”后参数值将被保存。再次配置时，如连接已配置过的Deployment，则参数自动填充，可手动修改。

    Output Path

    转换成功后.npy文件输出本地路径，用户自行配置。

    NPU Dump

    待转换的dump文件。

    当前仅支持一次转换一个dump文件。

  2. 单击“Start”，在MindStudio界面下方Output栏显示转换完成信息，如图4所示。

    图4 Output

    比对结果存放在表1中“Output Path”配置的路径。

父主题： 扩展功能


npy与npy文件间的精度比对

概述

MindStudio精度比对工具支持单个npy与npy文件之间的精度比对。基本要求如下：

  • 对于dump数据文件需要先完成dump数据文件转换为npy数据文件。
  • 需要确保两个比对文件内的Shape一致。
  • 仅支持CosineSimilarity（余弦相似度）、MaxAbsoluteError（最大绝对误差）、AccumulatedRelativeError（累积相对误差）、RelativeEuclideanDistance（欧氏相对距离）、MeanAbsoluteError（平均绝对误差）、RootMeanSquareError（均方根误差）、MaxRelativeError（最大相对误差）、MeanRelativeError（平均相对误差）比对算法。

操作步骤

  1. 在MindStudio界面菜单栏选择“Ascend > Model Accuracy Analyzer > File Comparison”菜单，进入比对参数配置界面，如下图所示，比对界面参数说明如表1所示。

    图1 npy文件比对配置（Local Run）
    图2 运行配置（Remote Run）

    Remote Run模式下，配置完运行配置后，单击“Next”进入到比对配置界面，如图3所示。

    图3 npy文件比对配置（Remote Run）
    表1 参数说明

    参数

    说明

    Run Mode
    • Remote Run：远程运行。
    • Local Run：本地运行。

    Windows使用场景下仅支持Remote Run，该参数不展示。

    Deployment

    运行配置，选择Remote Run模式时可见。通过Deployment功能，详细请参见Ascend Deployment，可以将指定项目中的文件、文件夹同步到远程指定机器的指定目录。

    Remote Toolkit Path

    远端运行环境Ascend-cann-toolkit软件包安装路径，选择Remote Run模式时可见。例如配置为${HOME}/Ascend/ascend-toolkit/{version}/toolkit。

    与Deployment参数为绑定关系，单击“Next”后参数值将被保存。再次配置时，如连接已配置过的Deployment，则参数自动填充，可手动修改。

    Output Path

    比对结果输出本地路径，用户自行配置。

    NPU Dump(.npy)

    待比对的npy文件。

    在远端执行比对时（Remote Run），须指定远端设备上的npy数据文件。

    Ground Truth(.npy)

    待比对的npy标杆数据文件。

  2. 单击“Start”，在MindStudio界面下方Output栏显示比对完成信息，如图4所示。

    图4 Output

    比对结果存放在表1中“Output Path”配置的路径。

父主题： 扩展功能


子模型导出与比对

概述

在使用对应 AI处理器的推理功能时，可能存在推理结果和原始模型推理结果不一致的情况，使用精度比对工具可以定位到某个或者某些非用户自定义层出现精度下降的问题，此时需要用户将怀疑有问题的局部网络的相关数据截取出来进行局部结构精度比对，在该背景下，MindStudio提供Caffe和TensorFlow原始网络模型的子模型导出功能方便用户获取数据，导出原理如图1所示。

  • 若需使用TensorFlow框架的子模型导出功能，请自行安装TensorFlow 1.15 AI框架和Python3（版本要求：3.7.5~3.7.11）。
  • 若需使用Caffe框架的子模型导出功能，请自行安装Caffe AI框架并确保框架能在Python3.7或Python3.9下正常运行，其中yolov2、yolov3以及量化后的网络模型暂不支持在Caffe AI框架下的子网导出，Caffe AI框架支持的操作系统请参见Caffe官网中“Installation”模块；Windows系统不支持使用Caffe框架的子模型导出功能。
图1 子模型导出原理
  1. 使用ATC工具，将原始模型转换成适配对应 AI处理器的离线模型，详情请参见模型转换和调优。
  2. 使用转换后的离线模型进行推理。
  3. 如果推理结果和原始模型推理结果不一致，则通过精度比对，将怀疑有问题的原始网络模型的局部网络模型相关数据导出，详情请参见导出步骤。重复进行子模型导出与子模型的精度比对，将问题定位至最小模型。
  4. 针对最小模型进行优化。

    如果问题解决，则重新进行模型转换，然后进行模型推理。

导出入口

在MindStudio界面，依次单击菜单栏“Ascend > Dump Network”，进入子模型导出界面。

导出步骤

  1. 在MindStudio界面菜单栏选择“Ascend > Dump Network”进入子模型导出界面，如图2所示。

    图2 子模型导出界面
    表1 界面参数以及按钮说明

    参数

    说明

    Dump Data Path

    精度比对界面“NPU Dump”中配置的离线模型对应的dump数据。单击右侧的 [image] 选择dump目录。

    Offline Model File

    精度比对界面“Model File”中配置的离线模型文件。单击右侧的 [image] 选择离线模型文件。

    Deploy Model
    • 原始网络模型文件，单击右侧的 [image] 选择MindStudio安装服务器相应文件。
    • 如果为昇腾模型压缩工具量化后的模型文件，则此处需要选择量化后可在对应 AI处理器部署的模型文件。

    Deploy Weight
    • 原始网络模型权重文件，若模型文件与权重文件在MindStudio安装服务器相同位置，选择模型文件后，权重文件会自动填充，否则需要用户单击右侧的 [image] 自行选择。
    • 如果为昇腾模型压缩工具量化后的权重文件，则此处需要选择量化后可在对应 AI处理器部署的权重文件。
      说明：

      只有原始网络模型文件为Caffe模型时，才会显示并需要添加Caffe模型权重文件（*.caffemodel）。

    Dump Output Path

    子模型导出目录，单击右侧的 [image] 选择导出目录，若没有目录，请先自行创建。

    Show Result

    单击该按钮，会解析原始模型文件，并将解析后的结果以图的形式呈现在右侧空白区域。

    Dump

    子模型导出按钮。

  2. 配置好参数后，单击“Show Result”，解析原始网络模型。

    如果模型转换后导出的.om模型文件中的原模型“Model Name”取值与Caffe原始网络模型文件（*.prototxt）或者TensorFlow原始网络模型文件（*.pb）中的“Model Name”取值不同时，解析网络模型时会弹出如图3所示界面。

    • 单击“Yes”继续解析，进入图4。
    • 单击“No”，返回子模型导出界面。
    图3 Model Name取值不同
    解析成功的原始网络模型如图4所示。
    图4 解析成功结果
    其中：
    • 查看算子信息

      单击图4中间区域框下方相关参数左侧的展开按钮 [image] ，查看参数的详细信息；单击 [image] 折叠所有的算子信息。

    • 查看算子输出shape信息

      图4还展示了每一层算子输出的维度和shape信息，如每一层算子连接线中间的NCHW，1,3,224,224等信息。

    • 搜索算子

      在图4所示界面，中间下方为搜索区域。

      搜索区域中给出了该模型所用到的所有算子，您可以在搜索区域对话框中输入算子名称，下方搜索区域会列出相关的算子。选择其中一个算子，左侧网络拓扑结构中相应算子会显示绿色选中框，中间区域框上方会展示该层算子的详细信息，包括算子名称、算子输入、输出等信息。

      图5 搜索算子内部信息
    • 搜索算子内部信息

      在图4中的 [image] 输入框输入想要查询的信息，之后单击 [image] 即可逐个查找。

  3. 选中怀疑有问题的局部网络模型第一个节点（输入节点），右键选择“start”；选中最后一个节点（输出节点）右击选择“end”，“start”与“end”中间的节点则为蓝色选中状态。

    • 选中了输入和输出节点后，如果想更换输入或输出节点，则在新的节点上右击选择相应的属性即可，新的节点颜色随之变化，原有节点恢复原始颜色。
    • 如果在某个节点选择“start”，并在该节点上方节点选择“end”，则无法选择。

  4. 确定输入节点和输出节点后，单击“Dump”导出子模型。

    MindStudio后台会在原始网络模型中寻找子模型，然后将子模型导出。界面右下角会有导出进度提示，单击该进度条可以查看详细进度。

    若出现图6所示信息，则说明导出成功。
    图6 导出成功提示

查看导出成功后结果

  1. 进入MindStudio安装服务器“Dump Output Path”所在目录可以看到以时间戳命名的文件夹dump_result_xxxx_xx_xx_xx_xx_xx，其中：

    • dump.prototxt：导出的Caffe子模型文件。
    • dump.pb：导出的TensorFlow子模型文件。
    • dump.caffemodel：导出的子模型权重文件（Caffe模型特有）。
    • dump_data：选中的“Start Layer”与“End Layer”中间，子模型所包括的所有算子的dump数据信息。

      该文件夹中不仅包括导出子模型所包括的所有算子的dump信息，还包括子模型“Start Layer”层的输入数据，用于子模型推理时作为输入数据使用。

  2. MindStudio界面“Output”窗口可以看到导出日志（如下日志中的所有数据都为样例数据，请以实际导出模型为准）：

    //导出过程中会为子模型添加输入信息
2020-05-22 16:27:57  Add Layer Into Prototxt:
name: "pool1_input_0"
type: "Input"
top: "conv1"
input_param {
  shape {
    dim: 1
    dim: 64
    dim: 112
    dim: 112
  }
}

//导出子模型的所有算子的dump数据信息
2020-05-22 16:27:57  Output Dump Path:/home/username/dumpdate/dumpresult/ir6/dump_result_2020_05_22_16_27_44/dump_data

//Start Layer与End Layer中间某层算子的dump信息，其中Output File表示Dump Layer层算子对应离线模型中相应算子的输出dump数据，Input File表示Dump Layer层算子对应的离线模型中相应算子的输入dump数据
2020-05-22 16:27:58  Dump Layer:[res2a_branch2c, bn2a_branch2c, scale2a_branch2c]
Output File:Conv2D.res2a_branch2cres2ares2a_relu.151.1585884515795667
Input File:Conv2D.res2a_branch2bres2a_branch2b_relu.149.1585884515771632
...

//Start Layer与End Layer中间所有算子的dump信息
2020-05-22 16:27:58  Export Layer:pool1,res2a_branch1,bn2a_branch1,scale2a_branch1,res2a_branch2a,bn2a_branch2a,scale2a_branch2a,res2a_branch2a_relu,res2a_branch2b,bn2a_branch2b,scale2a_branch2b,res2a_branch2b_relu,res2a_branch2c,bn2a_branch2c,scale2a_branch2c,res2a,res2a_relu

  3. 用户可以将导出的子模型再次进行精度比对，如果问题解决则进入下一步导出子模型重新执行推理验证。

导出子模型重新执行推理

  1. 将1导出的子模型，参见模型转换和调优转换成.om离线模型文件。

    如果导出的子模型不包括输入的data层节点，则转换.om离线模型时，请关闭AIPP预处理参数。

  2. 将1导出的子模型“start”层的输入数据，转换成bin格式，用户执行推理时，作为离线模型的输入数据使用。

    1. 查找“start”层的输入数据。

      输入数据为子模型导出时“Dump Layer”为“start”层算子对应的Input File文件，根据此信息，在MindStudio安装服务器“dump_data”目录下查找同名Input File文件，即为“start”层的输入数据。

    2. pb格式输入数据转成numpy格式。

      进入MindStudio安装服务器，切换到/tools/operator_cmp/compare路径，执行如下命令将pb格式的输入数据转换成numpy格式：

      python3 shape_conversion.py -i pb格式输入数据绝对路径 -format NCHW -o 转换为numpy格式数据的存放路径

      上述命令中的路径请根据实际情况进行替换，转换完成后，可以在numpy格式数据的存放路径看到.npy格式的输入数据。

    3. numpy格式输入数据转成bin格式。

      将如下脚本中的数据路径替换为实际路径，然后将脚本另存为.py格式，例如submodeldataprocess.py。

      import numpy as np

# 将numpy二进制格式转换为原始二进制格式
conv1_relu_0 = np.load(
    "/home/username/dumpdate/subModelData/xxx.npy")  # .npy格式的输入数据的绝对路径
conv1_relu_0 = conv1_relu_0.astype(np.float16)
conv1_relu_0.tofile(
    "/home/username/dumpdate/subModelData/xxx.bin")  # 转换为bin格式数据的存放路径

      将submodeldataprocess.py脚本上传到MindStudio安装服务器任意路径，然后执行如下命令将.npy格式的输入数据转换成bin格式：

      python3 submodeldataprocess.py

      进入bin格式数据的存放路径，可以看到.npy格式的输入数据已经转换成bin格式。

  3. 将导出的原始网络子模型在原始环境中执行推理业务，然后将1和2中的离线模型和输入数据在对应 AI处理器执行推理业务，查看两者推理结果是否有差异。如果仍有差异，则参见精度比对使用1中导出的原始网络子模型与1原始网络子模型转换后的离线模型重新和原始模型标杆数据进行精度比对。
  4. 重复执行子模型导出与子模型精度比对，把问题定位到最小模型，针对最小模型进行优化。
父主题： 扩展功能


附录

  • 查看dump数据文件
  • FAQ
父主题： 精度比对


查看dump数据文件

dump文件无法通过文本工具直接查看其内容，为了查看dump文件内容，本文提供以下脚本将dump文件转换为numpy格式文件后，再通过numpy官方提供的能力转为txt文档进行查看：

  1. 使用安装用户登录开发环境。
  2. 进入/home/HwHiAiUser/ Ascend/ascend-toolkit/5.0.mdc610/tools/operator_cmp/compare目录。
  3. 执行msaccucmp.py脚本，转换dump文件为numpy文件。举例：

    python3 msaccucmp.py convert -d dump_file [-out output] [-f format -s shape] [-o output_tensor] [-i input_tensor] [-v version] [-t type]
    表1 Format转换参数项说明

    参数名

    描述

    是否必选

    -d

    --dump_file

    对应 AI处理器生成的dump文件。

    支持指定单个文件；单个路径；同时指定多个文件，文件名用逗号隔开，例如-d /{PATH}/dump_file1,/{PATH}/dump_file2。

    是

    -out

    --output

    转换后的数据存放目录，默认为当前路径。

    否

    -f

    --format
    • 命令行包含-f参数，表示进行format转换，指定转换后数据format。如果dump文件包含original_shape字段，则会根据original_shape对数据进行切片。
    • 命令行不包含-f参数，表示进行dump文件解析。

    否

    -s

    --shape

    format转换需要的shape，当前仅FRACTAL_NZ转换需要配置该参数，格式为([0-9]+,)+[0-9]+，每个数字必须大于0。配置-f时有效。

    否

    -o

    --output_tensor

    转换指定index的output数据，与-i互斥。配置-f时有效。

    当-o与-i均未配置时，默认转换所有的input与output。

    否

    -i

    --input_tensor

    转换指定index的input数据，与-o互斥。配置-f时有效。

    否

    -v

    --version

    dump文件类型，1代表protobuf序列化后的数据文件，2代表自定义格式的数据文件。默认值为2。

    否

    -t

    --type

    输出文件的类型。取值为：

    • npy：输出文件保存为numpy格式。
    • msnpy：输出文件保存为numpy格式，一般用于MindSpore场景。
    • bin：输出文件保存为binary格式。

    默认值为npy。

    否

  4. 调用Python，转换numpy文件为txt文件。

    $ python3

>>> import numpy as np
>>> a = np.load("/home/HwHiAiUser/dumptonumpy/Pooling.pool1.1147.1589195081588018.output.0.npy")
>>> b = a.flatten()
>>> np.savetxt("/home/HwHiAiUser/dumptonumpy/Pooling.pool1.1147.1589195081588018.output.0.txt", b)

    转换为.txt格式文件后，维度信息、Dtype均不存在。详细的使用方法请参考numpy官网介绍。

父主题： 附录


FAQ

  • Tensor比对报错：ModuleNotFoundError: No module named 'google'
  • 如何批量处理生成的npy文件名异常情况
父主题： 附录


Tensor比对报错：ModuleNotFoundError: No module named 'google'

故障现象

执行Tensor比对时，界面弹出报错窗口，如图1所示。

图1 Tensor比对报错信息：未安装protobuf

output栏的打印信息如下：

2020-01-21 09:38:17 Error: Traceback (most recent call last): File "/home/phisik3/vb_workspace/work_code/toolchain/operator_cmp/compare/CompareVector.py", line 17, in <module> File
 "/home/phisik3/vb_workspace/work_code/toolchain/operator_cmp/compare/AccumulatedRelativeError.py", line 3, in <module> File
"/home/phisik3/vb_workspace/work_code/toolchain/operator_cmp/compare/VectorComparisonCommon.py", line 4, in <module> File
"/home/phisik3/vb_workspace/work_code/toolchain/operator_cmp/net_inference/caffe/DumpData_pb2.py", line 6, in <module> ModuleNotFoundError: No module named 'google'

故障原因

操作系统未安装protobuf导致解析Caffe模型的dump数据出错。

处理方法

针对该问题现象，可以先使用以下命令安装protobuf后再进行精度比对：

使用MindStudio安装用户登录MindStudio服务器，执行命令pip3 install protobuf --user。

父主题： FAQ


如何批量处理生成的npy文件名异常情况

故障现象

TensorFlow模型生成dump数据时，因tfdbg自身原因或运行环境原因，会出现tfdbg截断算子名，导致生成的npy文件名与预期不符，造成转换dump数据文件异常。

故障原因

tfdbg自身原因或运行环境原因。

处理方法

需要参考以下方法重新生成npy文件，使得npy文件名符合精度比对要求。

  • 本文中脚本名称、路径等均为举例，请根据实际替换。
  • 批量处理后，如果遇到某算子的dump文件存在，但是比对结果为NaN，需要检查该算子的dump文件名中的{op_name}是否与TensorFlow算子名称一致，如果不一致需要手动修改dump文件名中的算子字段与TensorFlow算子名称一致。其中如果出现"/"请修改为"_"。
  1. 执行TensorFlow工程。

    进入调试命令行交互模式后，输入run命令。

  2. 执行lt > tensor_name命令将所有tensor的名称暂存到文件里。
  3. 创建可执行脚本，如pt_cmd.sh，获取tensor_name文件中tensor_name对应的tensor_index。

    脚本内容如下：

    #!/bin/bash
timestamp=$[$(date +%s%N)/1000]
index=1
while read -r line
do
  tensor_index=`echo $line | awk '{print $4}'`
  echo "pt "$tensor_index" -n 0 -w "$((index++))"."$timestamp".npy" >> $2
done < $1

    赋予pt_cmd.sh可执行权限并执行脚本。

    chmod +x pt_cmd.sh
bash pt_cmd.sh tensor_name tensor_name.txt

  4. 回到tfdbg命令行，输入run命令后，将上一步生成的tensor_name.txt文件内容粘贴执行，生成npy文件。
  5. 将生成的npy文件，移动到新的文件夹，如npy_dir。
  6. 创建可执行脚本，如index_to_tensorname.sh，并执行脚本批量修改npy文件名。

    脚本内容如下：

    #!/bin/bash
timestamp=$[$(date +%s%N)/1000]
while read -r line
do
  tensor_index=`echo $line | awk '{print $2}'`
  real_file=`echo $line | awk '{print $6}'`
  changed1_tensor_index=${tensor_index//\//_}
  changed2_tensor_index=${changed1_tensor_index//:/.}
  echo $2/$real_file $2/$changed2_tensor_index"."$timestamp".npy"
  if [ -r $2/$real_file ]
  then
    mv $2/$real_file $2/$changed2_tensor_index"."$timestamp".npy"
  fi
done < $1

    增加index_to_tensorname.sh可执行权限并执行脚本。

    chmod +x index_to_tensorname.sh
bash index_to_tensorname.sh tensor_name.txt npy_dir

父主题： FAQ


基础操作

  • 启动MindStudio
  • SSH连接管理
  • Ascend Deployment
  • Toolchains
  • 运行管理
  • CANN管理
  • 常用快捷键
  • Python SDK设置
父主题： 操作指南


启动MindStudio

Linux系统参见如下方式启动MindStudio：

使用MindStudio的安装用户，进入软件包解压后的“MindStudio/bin”目录，执行如下命令启动MindStudio：

./MindStudio.sh

启动MindStudio后，执行以下命令查询进程：

ps -ef|grep idea

如果启动MindStudio时，提示无法为对象堆保留足够空间，请参见设置超大内存后无法启动MindStudio处理。

父主题： 基础操作


SSH连接管理

本章节介绍的SSH链接功能仅在Development版本提供。

概述

SSH连接是MindStudio与远程服务器建立远程登录会话的功能。SSH连接安全性高并且可以进行数据传输，便于MindStudio某些计算量较大的功能可以通过SSH连接来共享远端服务器的计算资源。

使用约束

为了安全起见，建议对SSH连接到的服务器进行以下加固操作：

  • Linux系统用户的口令加密算法，推荐使用SHA256或者SHA512。
  • SSH服务端配置文件中，对以下配置项进行加固：
    • MACs：指定允许在SSH-2中使用哪些消息摘要算法来进行数据校验，多个算法之间使用逗号分隔。目前支持算法：hmac-sha2-256、hmac-sha2-512、hmac-sha2-256-etm@openssh.com以及hmac-sha2-512-etm@openssh.com。
    • Ciphers：指定SSH-2允许使用的加密算法，多个算法之间使用逗号分隔。禁止CBC模式的加密算法用于SSH2.0协议中（如AES128-CBC、AES256-CBC）。目前支持算法：aes128-gcm@openssh.com和aes256-gcm@openssh.com。
    • HostkeyAlgorithms：指定SSH-2允许使用的身份认证公钥算法，多个算法之间使用逗号分隔。目前支持算法：ssh-ed25519（要求OpenSSH6.5级以上版本）、rsa-sha2-512以及rsa-sha2-256。其中rsa的长度需大于等于3072bits。
    • KexAlgorithms：指定SSH-2允许使用的密钥加密算法，多个算法之间使用逗号分隔。目前支持算法：curve25519-sha256、curve25519-sha256@libssh.org以及diffie-hellman-group-exchange-sha256。OpenSSH6.7开始支持curve25519密钥交换算法。
    • PermitRootLogin：是否允许root登录。建议禁止root用户可以直接登录。
  • MindStudio对工程内文件类型不做校验，需要确认上传文件的文件类型正确。
  • 为了MindStudio客户端能连接，服务端需要配置如下算法：

    ciphers aes128-gcm@openssh.com,aes256-gcm@openssh.com

    macs hmac-sha2-256,hmac-sha2-512,hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com

    hostkeyalgorithms ssh-ed25519,rsa-sha2-512,rsa-sha2-256

    kexalgorithms curve25519-sha256,curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256

    服务端修改方式参考如下：

    1. 执行如下命令编辑配置文件。
      vi /etc/ssh/sshd_config

      请用户修改文件对应行，如果找不到对应行，则新增即可。

    2. 重启ssh服务。
      • Red Hat和OpenEuler系列的操作系统
        service sshd restart
      • Ubuntu系列的操作系统
        service ssh restart
  • 请保存好SSH用户名密码，不要共享给不信任的用户，以免造成环境破坏等影响。
  • 为防止SSH暴力破解，建议用户在SSH端设置登录控制策略。

进行SSH连接和上板执行推理时，需要使用mdc用户，使用root用户执行dump推理可能出现推理执行失败的情况。

SSH配置入口

两种进入SSH配置界面方式如下所示，SSH配置界面如图1所示，界面参数解释如表1所示。

  • 在菜单栏依次选择“File > Settings... > Tools > Ascend SSH Configurations”进入SSH连接配置。
  • 在欢迎界面依次选择“Customize > All Settings... > Tools > Ascend SSH Configurations”进入SSH连接配置。
图1 SSH配置

SSH连接配置界面左侧展示SSH连接配置项别名，如果没有别名，显示格式为<username>@<host>:<port>，右键单击可修改别名。单击选中别名，可以在右侧详细面板中查看参数配置。

表1 参数及图标说明

参数及图标

说明

Lock the current connection

选项置灰，用户不可操作。如果SSH连接被添加到集群管理中，则该选项会自动勾选，SSH连接被锁定，不可修改和删除。

Host

连接目标地址（IP或域名）。

Port

连接目标地址的端口号，默认值：22。

User name

登录目标地址的用户名。

说明：

请使用mdc用户，使用root用户执行dump推理可能出现推理执行失败的情况。

Authentication type

身份验证方式。有两种方式可选：

  • Password：通过密码验证身份。
  • Key pair：通过密钥验证身份，可以自行参考通用方式申请SSH密钥。
    说明：
    • 对于Euler2.8、2.10 aarch架构、银河麒麟 V10 SP1 aarch架构、OpenEuler、Ubuntu20.04和CentOS8.2，使用Key pair方式来通过密钥验证身份时，需要使用ssh-keygen -m PEM或者ssh-keygen -t rsa -m PEM命令来申请SSH密钥。
    • 申请SSH密钥时，建议设置Passphrase不为空，且符合以下口令复杂度：
      • 口令长度至少8个字符。
      • 口令必须包含如下至少两种字符的组合：
        • 至少一个小写字母
        • 至少一个大写字母
        • 至少一个数字
        • 至少一个特殊字符：`~!@#$%^&*()-_=+\|[{}];:'",<.>/? 和空格
    • 当选择Key pair方式时，默认保存配置过的私钥文件。

Password

Authentication type选择验证方式为Password时显示，需要填写对应用户名的密码，勾选Save password复选框可以保存密码。

说明：

如果没勾选Save password。那么密码自动会在24小时后清除，届时再次使用到SSH会弹出密码输入框，需要再次输入密码方能执行SSH任务。

Private key file

Authentication type选择验证方式为Key pair时显示，选择本地私钥文件。

Passphrase

Authentication type选择验证方式为Key pair时显示，需要填写对应密语。勾选Save password复选框可以保存密语。

Test Connection

单击该按钮测试连接是否成功。

新增SSH连接配置。

删除SSH连接配置，选中需要删除的SSH连接配置，单击该按钮删除。

新增SSH连接

  1. 参见SSH配置入口进入SSH连接配置界面。
  2. 单击界面左侧导航栏上方 [image] 按钮。
  3. 根据表1配置参数后，单击“OK”或“Apply”。

删除SSH连接

  1. 参见SSH配置入口进入SSH连接配置界面。
  2. 选择要删除的SSH连接配置项，单击界面左侧导航栏上方 [image] 按钮。
  3. 单击“OK”或“Apply”。

保存SSH密码

  1. 参见SSH配置入口进入SSH连接配置界面。
  2. 进入密码保存方式界面有如下方式：

    • 在左边的导航栏选择“Appearance & Behavior > System Settings > Passwords”。
    • 在搜索栏中输入“Passwords”。
      图2 密码保存方式界面

  3. 选择密码保存方式。

    • In KeePass
    • Do not save，forget passwords after restart

      两种密码保存方式的详细说明请参见《IntelliJ IDEA使用说明》中的“Passwords”章节。

  4. 单击“OK”或“Apply”。

开启SSH Remote Terminal窗口

通过开启SSH Remote Terminal窗口功能，可以在MindStudio IDE界面上对SSH连接环境进行命令行操作。

已有配置好的SSH连接，详细操作请参见新增SSH连接。

  1. 在菜单栏选择“Tools > Start Ascend SSH session...”。

    弹出“Select Host to Connect”弹窗。

  2. 单击需要开启Remote Terminal窗口的SSH连接。

    在MindStudio IDE界面下方显示远端窗口信息，可直接进行命令行操作。

    图3 Remote Terminal

    为防止SSH长时间保持会话可能存在的安全风险，建议用户在服务端设置SSH会话超时时间。

父主题： 基础操作


Ascend Deployment

通过Ascend Deployment功能可以将指定的文件、文件夹同步到远程指定机器的指定目录。

配置Ascend Deployment功能

  1. 在菜单栏选择“File > Settings…”。

    在左边的导航栏选择“Tools > Ascend Deployment”，进入图1。

    图1 Ascend Deployment界面
    表1 参数及图标说明

    参数及图标

    说明

    新增Deployment。

    删除Deployment，选中需要删除的Deployment，单击该按钮删除。

    指定选中的Deployment为默认Deployment，单击该按钮。再单击一次该按钮，即可取消默认。

  2. 配置远程服务器连接。

    单击 [image] ，将弹出新建服务器命名窗口，输入服务器名字，单击“OK”，界面将显示需要配置的“Connetion”、“Mappings”及“Excluded Paths”。
    图2 Connection
    表2 参数及图标说明

    参数及图标

    说明

    Type

    文件传输协议类型。目前仅支持SFTP。

    SSH configuration

    SSH远程连接。单击 [image] 或 [image] 可选择已配置的SSH连接，如果没有需要的SSH连接，可单击 [image] ，在弹出的窗口中的 [image] 图标配置SSH连接。

    Upload Current Project

    同步当前工程至远程服务器。

    选中此按钮，单击Apply，将会自动同步当前工程至远端服务器，并且默认开启Automatic Upload（自动上传功能）。

    Test Connection

    单击该按钮测试连接是否成功。

  3. （必选）配置映射路径关系。

    图3 Mappings

    如需继续配置多条Mapping，可单击“Add New Mapping”进入多条配置界面，继续添加。

    图4 配置多条Mapping
    表3 参数及图标说明

    参数及图标

    说明

    新增映射路径关系信息。

    删除映射路径信息。选中需要删除的路径映射关系信息，再单击此按钮，即可删除指定的路径映射关系信息。

    Local Path

    本地项目文件夹路径。单击对应文本框，将自动识别已打开的项目文件夹路径，也可通过在文本框中手动输入或单击文本框右侧文件夹图标进行配置。

    取值示例如下：

    • Windows：C:\Users\username\MindstudioProjects\MyApp
    • Linux：/home/username/MindstudioProjects/MyApp

    Deployment Path

    本地项目文件夹路径映射到远端服务器中的路径。可通过在文本框中手动输入或单击文本框右侧文件夹图标进行配置。

  4. （可选）配置排除路径信息，用户根据需要配置。

    图5 Excluded Paths
    表4 参数及图标说明

    参数及图标

    说明

    新增排除路径信息。单击此按钮，可选择“Deployment Path”或“Local Path”，分别对应 [image] 和 [image] 图标。

    删除排除路径信息。选中需要删除的排除路径信息，再单击此按钮，即可删除指定的路径映射关系信息。

    排除远端服务器中的路径。通过在文本框手动输入或单击文件夹图标进行配置，配置生效后，将排除对该路径下的所有子目录文件和本目录文件进行上传、下载操作。

    排除本地路径。通过在文本框手动输入或单击文件夹图标进行配置，配置生效后，将排除该路径下的所有子目录文件和本目录文件进行上传、下载操作。

    取值示例如下：

    • Windows：C:\Users\username\MindstudioProjects\MyApp
    • Linux：/home/username/MindstudioProjects/MyApp

  5. 单击“Apply”，Deployment配置生效，在使用run/debug等功能时，会触发Deployment同步操作。

使用Ascend Deployment功能

如果需要使用Ascend Deployment功能，可通过如下操作实现。
  • 自动上传
    1. 在菜单栏选择“File > Settings…”。

      在左边的导航栏选择“Tools > Ascend Deployment”进入Ascend Deployment界面，在Deployment列表选中需要使用的Deployment，然后单击上方的 [image] 将其设置为默认Deployment。

    2. 在菜单栏选择“Tools > Ascend Deployment > Automatic Upload”。
  • 手动同步
    • 在左侧工程目录中选中需同步的文件或目录，在菜单栏选择“Tools > Ascend Deployment”，单击“Upload to...”或者“Download from...”手动触发Deployment的上传或者下载功能。
    • 在左侧工程目录中选中需同步的文件或目录，单击鼠标右键选择“Ascend Deployment”，单击“Upload to...”或者“Download from...”手动触发Deployment的上传或者下载功能。
  • 针对上传过程，Deployment会将mapping中的“Local Path”完全映射于对应的“Deployment Path”，若本地有a、b和c文件，而远端“Deployment Path”中有d文件，上传的结果是远端对应目录下只有a、b和c文件，d文件会被删除。
  • 针对下载过程，不会使用完全映射过程，如远端有a、b、c文件，本地有d文件，下载的结果是本地对应目录存在a、b、c和d文件。
父主题： 基础操作


Toolchains

通过Toolchains功能可以快速配置C/C++工程本地和远程编译的功能，支持gcc和LLVM编译工具。

工程在运行时，将根据编译过程时使用的Toolchain配置进行远端或本地运行。（如：编译时使用本地Toolchain配置，则该工程运行时，将默认在本地执行。）

远程编译和运行功能仅在Development版本提供。

本地编译配置

  1. 在菜单栏选择“File > Settings...”。

    在左边的导航栏选择“Tools > Toolchains”，进入图1。

    图1 配置工具链界面

  2. 单击“+”按钮，添加Toolchains配置项。

    • Linux配置工具链为“System”，如图2所示。
    • Windows配置工具链为“MinGW”，如图3所示。
    • LLVM工具链配置，Linux请参考图4进行配置；Windows请参考图5进行配置。
      图2 Linux配置工具链System
      图3 Windows配置工具链MinGW
      图4 Linux配置工具链LLVM
      图5 Windows配置工具链LLVM
      表1 参数及图标说明

      参数及图标

      说明

      Name

      Toolchains配置名称。

      Environment

      mingw的路径，配置环境变量后可自动识别，也可通过手动输入或单击右侧 [image] 进行配置。

      说明：

      Linux环境下无此选项。

      Cmake

      本地服务器中的Cmake路径，也可通过手动输入或单击右侧 [image] 进行配置。

      Make

      本地服务器中的Make路径，也可通过手动输入或单击右侧 [image] 进行配置。

      C Compiler

      本地服务器中的C Compiler路径，也可通过手动输入或单击右侧 [image] 进行配置。

      C++ Compiler

      本地服务器中的C++ Compiler路径，也可通过手动输入或单击右侧 [image] 进行配置。

      Debugger

      本地服务器中的Debugger路径，也可通过手动输入或单击右侧 [image] 进行配置。

      新增工具链配置。

      删除工具链配置，选中需要删除的工具链配置，单击该按钮删除。

    工具链生效后会在左边的导航栏“Tools > Toolchains”中自动生成一条信息，以供编译配置选择。

远程编译配置

  1. 在菜单栏选择“File > Settings...”。

    在左边的导航栏选择“Tools > Toolchains”，进入图6。

    图6 配置工具链界面

  2. 单击“+”按钮，配置工具链“Remote Host”。

    图7 配置工具链Remote Host
    表2 参数及图标说明

    参数及图标

    说明

    Name

    Toolchains配置名称。

    Credentials

    SSH配置，单击 [image] 或 [image] 图标选择需要的SSH连接，如果没有需要的SSH连接，可单击弹出窗口中的 [image] 图标进行SSH连接配置。

    Cmake

    指定远端服务器中的Cmake路径，配置“Credentials”后自动识别，也可通过手动输入或单击右侧 [image] 进行配置。

    Make

    指定远端服务器中的Make路径，配置“Credentials”后自动识别，也可通过手动输入或单击右侧 [image] 进行配置。

    C Compiler

    指定远端服务器中的C Compiler路径，配置“Credentials”后自动识别，也可通过手动输入或单击右侧 [image] 进行配置。

    C++ Compiler

    指定远端服务器中的C++ Compiler路径，配置“Credentials”后自动识别，也可通过手动输入或单击右侧 [image] 进行配置。

    Debugger

    指定远端服务器中的Debugger路径，配置“Credentials”后自动识别，也可通过手动输入或单击右侧 [image] 进行配置。

    新增工具链配置。

    删除工具链配置，选中需要删除的工具链配置，单击该按钮删除。

    工具链生效后会在左边的导航栏“Tools > Ascend Deployment”中自动生成一条Deployment信息，如图8所示。

    图8 生成Deployment信息

父主题： 基础操作


运行管理

本章节介绍的功能仅在Development版本提供。

  • 修改运行任务配置
  • 停止运行/重新运行任务
父主题： 基础操作


修改运行任务配置

  1. 在MindStudio主界面，在工具栏选择“Edit Configurations...”，如图1所示。

    图1 配置入口

  2. 在界面左侧导航栏选择待修改的运行任务配置信息，并在右侧修改相应的配置信息。
  3. 单击“Apply”，保存配置，单击“OK”关闭配置界面。
  4. 单击工具栏的运行按钮运行任务，如图2所示。

    图2 运行任务

父主题： 运行管理


停止运行/重新运行任务

如果想停止运行任务，可以单击图1 运行停止按钮（任选其一操作）所示的 [image] 按钮，从而查看运行日志打印。

图1 运行停止按钮（任选其一操作）

如果想重新运行，可以单击 [image] 按钮。

父主题： 运行管理


CANN管理

  • 概述
  • 切换/激活CANN包
  • 配置交叉编译环境
父主题： 基础操作


概述

CANN Manager为用户提供了在不重装MindStudio的前提下，切换以及更新Ascend-cann-toolkit开发套件包版本的功能。使用该功能之前，请确保已经完成MindStudio以及Ascend-cann-toolkit开发套件包的安装。

CANN管理入口：
  • 在MindStudio快捷工具栏，单击如下图标进入CANN Manager界面。
    图1 快捷工具栏进入CANN Manager
  • 在MindStudio工程界面菜单栏依次选择“File > Settings... > Appearance&Behavior > System Settings > CANN”，弹出CANN Manager界面。
  • 在MindStudio工程界面菜单栏依次选择“Ascend > CANN Manager”，弹出CANN Manager界面。
  • 在MindStudio欢迎页面依次选择“Customize > All settings... > Appearance&Behavior > System Settings > CANN”，弹出CANN Manager界面。
以上4种方式打开的CANN Manager界面如图2或图3所示。
图2 CANN Manager界面（Linux系统）

用户安装不同的CANN版本可能导致图2中的Component和Host OS Arch列显示与示例不同，具体显示请以实际界面为准。

界面参数以及图标解释如表1所示。

表1 CANN Manager界面参数以及图标说明（Linux系统）
参数以及图标 | 说明
CANN location | Ascend-cann-toolkit开发套件包的安装路径，默认为$HOME//{version}，通过单击右侧的 [image] 可以进行多版本CANN切换。
Change CANN | 可以进行多版本Ascend-cann-toolkit开发套件包切换。
Package | CANN包名称。
Component | 组件名称。
Version | CANN版本号以及各软件包版本号。
Host OS Arch | 开发环境操作系统以及架构。
图3 CANN Manager界面（Windows系统）

界面参数以及图标解释如表2所示。

表2 CANN Manager界面参数以及图标说明（Windows系统）
参数以及图标 | 说明
Remote Connection | Ascend-cann-toolkit开发套件包所在远程环境IP地址。
Remote CANN location | Ascend-cann-toolkit开发套件包的安装路径，默认为$HOME/Ascend/ascend-toolkit/{sotftware version}。
Change CANN | 可以进行多版本Ascend-cann-toolkit开发套件包切换。
Package | CANN包名称。
Component | 组件名称。
Version | CANN版本号以及各软件包版本号。
Host OS Arch | Host侧操作系统以及架构。
父主题： CANN管理


切换/激活CANN包

切换CANN

  • Linux系统：
    1. 请参考“概述”进入如图CANN管理页面，通过以下两种方式进入如图1所示界面。
      • 单击CANN location右侧的 [image] ，系统弹出Toolkit所在路径的页面。如图1所示。
      • 单击CANN管理页面中的“Change CANN”按钮，然后单击系统弹出的图2所示界面的 [image] 。
        图1 选择Toolkit版本
        图2 选择Ascend-cann-toolkit开发套件包安装路径
    2. 选中需要替换的Toolkit版本，单击“OK”。弹出确认页面，如图3所示。
      图3 确认页面
      1. 选择“OK”，CANN切换到新版本，MindStudio重启后该CANN处于激活状态。
      2. 若在切换CANN之前，已经有工程打开，则还会弹出如图4所示界面，单击“OK”，在随后弹出的如图5所示界面单击“Change”，选择切换后的Toolkit版本。
        图4 CANN未安装提示信息
        图5 修改工程属性（示例）
      3. 选择“Cancel”，CANN切换到新版本，但是状态为未激活状态，此时新版本CANN不可用。
父主题： CANN管理


配置交叉编译环境

进入CANN管理页面，在CANN管理界面选择“Cross Compiler”页签，系统显示当前激活状态的CANN需要安装的编译环境，如图1所示。如果Status显示“Not installed”，请参见《MindStudio安装指南》的“配置编译环境”章节进行手动配置。

  • MindStudio安装服务器环境下的Ascend-cann-toolkit开发套件包版本需要和运行环境下的CANN软件包版本保持一致。
  • MindStudio安装服务器环境下需要同时安装Ascend-cann-toolkit开发套件包和运行环境对应的CANN软件包。
图1 配置交叉编译环境

配置完成后，重新启动MindStudio，再次进入CANN管理，可以看到“Status”变成“Installed”。

父主题： CANN管理


常用快捷键

本节介绍IntelliJ IDEA的常用快捷键，了解更多内容请参考相关官方文档。

表1 常用快捷键
快捷键 | 说明
Alt + 左方向键 | 切换当前已打开的窗口中的子视图，比如Debug窗口中有Output、Debugger等子视图，用此快捷键就可以在子视图中切换（必备）
Alt + 右方向键 | 按切换当前已打开的窗口中的子视图，比如Debug窗口中有Output、Debugger等子视图，用此快捷键就可以在子视图中切换（必备）
Alt + 前方向键 | 当前光标跳转到当前文件的前一个方法名位置（必备）
Alt + 后方向键 | 当前光标跳转到当前文件的后一个方法名位置（必备）
Ctrl + = | 展开代码
Ctrl + - | 折叠代码
Ctrl + / | 注释光标所在行代码，会根据当前不同文件类型使用不同的注释符号 （必备）
Ctrl + F | 在当前文件进行文本查找（必备）
Ctrl + R | 在当前文件进行文本替换（必备）
Ctrl + Z | 撤销（必备）
Ctrl + Y | 删除光标所在行或删除选中的行（必备）
Ctrl + X | 剪切光标所在行或剪切选择内容
Ctrl + C | 复制光标所在行或复制选择内容
Ctrl + D | 复制光标所在行或复制选择内容，并把复制内容插入光标位置下面 （必备）
Ctrl + W | 递进式选择代码块。可选中光标所在的单词或段落，连续按会在原有选中的基础上再扩展选中范围 （必备）
Ctrl + E | 显示最近打开的文件记录列表（必备）
Ctrl + N | 根据输入的类名查找类文件（必备）
Ctrl + G | 在当前文件跳转到指定行处
Ctrl + Q | 光标所在的变量/类名/方法名等上面，显示文档内容
Ctrl + Alt + L | 格式化代码，可以对当前文件和整个包目录使用（必备）
Ctrl + Alt + O | 优化导入的类，可以对当前文件和整个包目录使用（必备）
Ctrl + Shift + F | 根据输入内容查找整个项目或指定目录内文件（必备）
Ctrl + Shift + R | 根据输入内容替换对应内容，范围为整个项目或指定目录内文件（必备）
父主题： 基础操作


Python SDK设置

设置全局Python SDK

  1. 在工程界面中，单击菜单栏中的“File > Project Structure”，进入“Project Structure...”设置页面。
  2. 在左侧菜单栏中选择“Platform Settings > SDKs”，在右侧配置窗口单击“+”，选择“Add Python SDK...”进入Python解析器添加窗口。

    图1 添加全局Python库

  3. 在“Add Python Interpreter”窗口中，根据实际情况，选择合适的Python解析器。可选解析器介绍请参见表1。单击“OK”添加完成。

    图2 Add Python Interpreter
    表1 Python解析器选项

    解析器

    说明

    Virtualenv Environment

    集成了Virtual Environment工具，用以创建独立的虚拟环境。

    Conda Environment

    使用Anaconda中带有的Python解释器。

    System Interpreter

    系统本地解析器。

    Pipenv Environment

    Pipenv是一种工具，提供了为Python项目创建虚拟环境所需的所有必要方法。

    Poetry Environment

    使用Poetry工具，创建基于工程依赖的虚拟环境。

    SSH Interpreter

    远程解析器。通过SSH方式添加远程设备的Python SDK并通过Deployment功能，将指定项目中的文件、文件夹同步到远程指定机器的指定目录，详细请参见Ascend Deployment。（如选择该选项，在工程运行时，MindStudio将以远端运行的方式进行。）

  4. 添加完成后，用户可根据实际情况，自行引入了其他第三方Python库或自定义Python库。单击“OK”，关闭Project Structure窗口。

    图3 查看Python库

设置工程级Python SDK

  1. 在工程界面中，单击菜单栏中的“File > Project Structure”，进入“Project Structure”设置页面。
  2. 在左侧菜单栏中选择“Project Settings > Project”，进入“Project”设置。

    在“SDK”选项中，下拉并选择已配置的Python SDK或选择“Add Python SDK...”，进入Python解析器添加窗口新增Python SDK，单击“Apply”应用配置，如图4所示。
    图4 选择Project SDK

设置模块级Python SDK（昇腾工程）

  1. 在工程界面中，单击菜单栏中的“File > Project Structure”，进入“Project Structure”设置页面。
  2. 在左侧菜单栏中选择“Project Settings > Modules”，进入“Modules”设置。

    在新增的“Python”项右侧，下拉选择已配置的Python SDK或单击 [image] 自定义Python SDK，单击“Apply”应用配置，如图5所示。
    图5 添加Python SDK

    图6 选择已有的Python SDK或自定义

设置模块级Python SDK（非昇腾工程）

  1. 在工程界面中，单击菜单栏中的“File > Project Structure”，进入“Project Structure”设置页面。
  2. 在左侧菜单栏中选择“Project Settings > Modules”，进入“Modules”设置。

    在“Dependencies”页签中，下拉选择已配置的Python SDK或选择“Add Python SDK...”，进入Python解析器添加窗口新增Python SDK，单击“Apply”应用配置，如图7所示。
    图7 选择Modules SDK

父主题： 基础操作


附录

  • 安全加固建议
  • 公网URL
  • FAQ
父主题： 操作指南


安全加固建议

  • 63342~63391端口段是MindStudio的内置Server服务端口段，可用于打开本地的web服务、html文件和xml文件等。为了提高安全性，建议此端口段仅支持本地使用，在防火墙中不要对其他设备开放。
  • 6942~6991端口段是MindStudio进程单实例绑定端口段，用于防止启动多个IDE进程，并不用于通信。为了提高安全性，建议此端口段仅支持本地使用，在防火墙中不要对其他设备开放。
  • 在执行远程运行等操作时，会把相关文件传输到远端。为了提高安全性，建议远端用户的umask值设置为0027，远端路径尽量选择个人用户路径。如果对ONNX算子编译时出现异常，需要自行将依赖包google/protobuf目录权限值设置为755。
  • 尽可能依赖本用户安装的CANN包；或者至少保证安装CANN包的普通用户是可信任的。以避免提权风险。
  • 若使用root启动MindStudio，在配置页面选择普通用户路径下的文件，或者将环境变量配置至普通用户路径下，存在提权风险，所以建议优先使用普通用户启动MindStudio。
  • 经由MindStudio调用第三方组件生成的文件、日志等，请用户自行保证权限最小化。
父主题： 附录


公网URL

MindStudio 6.0.RC2 公网URL说明.xlsx

父主题： 附录


FAQ

  • 获取帮助和提出建议
  • Windows上远程打开MindStudio时，复制的内容无法粘贴到编辑器窗口中
  • MobaXterm启动MindStudio编辑字符时，方向键变成数字
  • 配置不受信任的网址访问浏览器
  • 启动MindStudio时无法显示图形化界面
  • 中文显示乱码和界面显示不全不规整
  • 代码最大行宽与参考值不一致
  • MindStudio异常退出导致文件丢失
  • MindStudio界面闪退后，重新启动MindStudio时提示进程已存在
  • C语言printf信息在Debug时Console中概率性没有内容输出
  • 在Windows系统环境下创建训练样例工程时报错“Unzip failed. There is probleam occurred when unzipping file.”
  • 创建训练样例工程时报错“Download failed. Please see the log for more detail. You can also download sample from https://www.hiascend.com/software/modelzoo manually.”
  • 设置超大内存后无法启动MindStudio
  • 在Linux端使用MindStudio时出现阻塞，等待不定时间方可恢复
  • 基于MindX SDK开发应用，运行应用工程时，出现“can not find the element factory : mxpi_xxxpostprocessor”
  • 编译时出现依赖不存在的报错“libgfortran.so.4: No such file or directory”
  • 开发昇腾工程过程中，编译配置切换Toolchain后编译并运行时报错“cannot execute binary file: Exec format error”
  • MindStudio在启动时报错“java.io.IOException: No space left on device”
  • 输入框无法输入或删除字符，且后台报错“java.lang.RuntimeException: java.awt.event.KeyEvent“
  • 基于MindX SDK开发应用，使用MindX SDK Pipeline功能查看可视化pipeline时，发现插件置灰不可用
  • 在编写C++工程时，后台console或日志打印出大量Warning信息
  • 进行C++工程调试时无法结束
  • 执行工程转换将非昇腾工程转换为昇腾工程后，发现参数选择错误无法修改
  • MindStudio打开工程后，出现操作迟缓、卡顿现象
  • MindStudio在配置远端SDK后运行工程，前端界面无法显示动态进度条信息
  • glibc版本过低导致无法使用模型可视化功能
  • 加载集群场景性能数据时提示“Low memory”
  • 使用模型可视化功能时界面无法显示，且后台报错“SEVERE - #c.i.u.j.JBCefApp - /xxx/libjcef.so: /xxx/libcef.so: cannot allocate memory in static TLS block”
父主题： 附录


获取帮助和提出建议

在使用MindStudio的过程中，如果想查看更多相关信息，请直接在MindStudio主界面的菜单栏中单击“Help > MindStudio Help”，该操作会连接网络并跳转至昇腾社区MindStudio（https://www.hiascend.com/software/mindstudio）查看。

如有任何问题想要咨询或者提出改进建议，请直接在MindStudio主界面的菜单栏中单击“Help > Ascend Developer Zone”，该操作会连接网络并跳转至昇腾论坛（https://bbs.huaweicloud.com/forum/forum-945-1.html）进行反馈。

使用MindStudio Help和Ascend Developer Zone功能时需要使用浏览器登录网页，如果未安装浏览器，请用户自行安装。

图1 更多信息和帮助
父主题： FAQ


Windows上远程打开MindStudio时，复制的内容无法粘贴到编辑器窗口中

问题现象

Windows上远程打开MindStudio时，复制的内容无法粘贴到编辑器窗口中。

解决方案

  1. MobaXterm自带划取复制能力，导致打开的MindStudio也带上该能力，可以设置disable “select on copy”来解决，如下图所示。

  2. 打开MindStudio的“Settings”页面，选择“Tools > Terminal”，取消勾选“Copy to clipboard on selection”选项，如图1所示。

    图1 MindStudio设置

也可以当复制内容之后，在MindStudio编辑器窗口中光标不要再次选中内容，直接将复制的内容粘贴到对应位置即可解决。

父主题： FAQ


MobaXterm启动MindStudio编辑字符时，方向键变成数字

问题现象

MobaXterm启动MindStudio编辑代码或者在MindStudio配置界面输入字符时，方向键变成2468的数字。

解决方案

卸载或者切换不使用搜狗输入法，然后用MobaXterm远程连接启动MindStudio。

父主题： FAQ


配置不受信任的网址访问浏览器

问题现象

UT测试用例运行结束后，如果需要通过浏览器打开覆盖率html文件，可能会出现图1所示提示。

图1 提示

解决方案

请单击菜单栏中的“File > Settings”，参考图2修改。

图2 勾选Allow unsigned requests
父主题： FAQ


启动MindStudio时无法显示图形化界面

问题现象

启动MindStudio时，出现“Failed to initialize graphics environment”或者“Unable to detect graphics environment ”报错信息，如图1或者图2所示。

图1 无法显示图形化界面1
图2 无法显示图形化界面2

原因

  • 如果安装的是服务器版的Ubuntu系统，使用某用户登录了MobaXterm，所以图形工具已经被该用户所在的用户组占用，切换用户后，无法使用图形工具。
  • 如果安装的是桌面版的Ubuntu系统，登录Ubuntu系统的用户和启动MindStudio用户不一致。
  • 在使用CentOS7.6-aarch64系统时，未安装xorg-x11-xauth依赖。

解决方法

  • 如果安装的是服务器版的Ubuntu系统，请参见以下方法解决：
    • 把切换后的用户加入先前用户的用户组。
    • 使用想要启动MindStudio的用户重新登录MobaXterm。
    • 在当前启动MindStudio的用户下设置DISPLAY环境变量：
      export DISPLAY=显示图形界面的主机IP:0
    • 在当前启动MindStudio的用户下进入.bashrc，添加export DISPLAY=显示图形界面的主机IP:0环境变量后保存退出，然后执行source ~/.bashrc即可。
  • 如果安装的是桌面版的Ubuntu系统，请参见以下方法解决：
    • 使用启动MindStudio用户重新登录Ubuntu系统。
  • 在使用CentOS7.6-aarch64系统时，未安装xorg-x11-xauth依赖，请使用如下命令安装依赖，并重启MindStudio。
    yum install -y xorg-x11-xauth
父主题： FAQ


中文显示乱码和界面显示不全不规整

问题现象

  • 例如在新建APP应用工程时，中文显示乱码，例如README_CN.md文件，如图1所示。
    图1 中文显示乱码
  • 界面显示不全不规整，例如标题显示不全，如图2所示。
    图2 标题显示不全

解决方案

请自行安装微软雅黑字体(msyh.ttc)。

父主题： FAQ


代码最大行宽与参考值不一致

问题现象

打开工程目录下的文件时，代码最大行宽与参考值不一致，参考值一般默认为120。如图1所示。

图1 代码最大行宽与参考值不一致

解决方案

  1. 在MindStudio主界面选择“File > Settings > Editor > Color Scheme > Color Scheme Font”，进入字体选择界面，如图2所示。

    图2 Color Scheme Font

  2. 在“Font”参数后的下拉框中选择与当前字体不一致的字体，单击“Apply > OK”，返回工程目录下的文件查看代码最大行宽与参考值是否一致。

    • 是，操作完成。
    • 否，重复进行步骤1~2直至代码最大行宽与参考值一致。

      如果在等宽字体中未能找到合适字体，请把“Show only monospaced fonts”参数前的小方框去掉勾选，在等宽字体除外的其他字体中进行选择。

父主题： FAQ


MindStudio异常退出导致文件丢失

问题现象

MindStudio异常退出时，文件因未即使保存而导致丢失。

解决方案

通过以下设置，可实现MindStudio空闲15s后自动保存文件，避免因异常情况导致文件未保存而丢失。

打开MindStudio的“Settings”页面，选择“Appearance & Behavior > System Settings”，勾选“Save files if the IDE is idle for xx seconds”选项，如图1所示。可根据个人情况设置具体时间。
图1 自动保存
父主题： FAQ


MindStudio界面闪退后，重新启动MindStudio时提示进程已存在

问题描述

由于网络异常等原因导致MindStudio界面闪退。用户重新启动MindStudio，报错提示已有进程存在。如图1所示。

图1 提示信息

解决方案

  1. 执行ps -ef | grep java命令查看后台进程。找到对应的进程号PID，例如713。
  2. 执行kill -9命令关闭已有进程。例如执行kill -9 713命令关闭713进程。
  3. 执行./MindStudio.sh重新启动MindStudio。
父主题： FAQ


C语言printf信息在Debug时Console中概率性没有内容输出

问题现象

C语言printf信息在Debug时Console中概率性没有内容输出。

解决方案

这是gdb内部的bug，可以通过setbuf或setvbuf设置无缓冲，或者printf后主动调用fflush及时输出缓冲来规避该问题。

父主题： FAQ


在Windows系统环境下创建训练样例工程时报错“Unzip failed. There is probleam occurred when unzipping file.”

问题现象

在Windows系统环境下创建训练样例工程时，弹出报错对话框，提示“Unzip failed. There is probleam occurred when unzipping file.”

解决方案

修改环境变量TMP，指向非用户目录下的其他有读写权限的目录，如D:\temp。

父主题： FAQ


创建训练样例工程时报错“Download failed. Please see the log for more detail. You can also download sample from https://www.hiascend.com/software/modelzoo manually.”

问题现象

创建训练样例工程时，弹出报错对话框，提示“Download failed. Please see the log for more detail. You can also download sample from https://www.hiascend.com/software/modelzoo manually.”

解决方案

  1. 检查网络是否为连通状态，若网络不通则先将网络调试为连通状态。
  2. 若网络为连通状态，则查看日志，若日志出现如下图中字段“No module named 'requests'”，则需要进入命令行界面执行命令“pip3 install requests”安装requests模块。

    日志落盘路径为：

    • Linux：/home/XXXX/.cache/Huawei/MindStudioMS-XX/log/idea.log
    • Windows：C:\Users\XXX\AppData\Local\Huawei\MindStudioMS-XX\log\idea.log
父主题： FAQ


设置超大内存后无法启动MindStudio

问题描述

  • 在Windows启动MindStudio失败。
  • 在Linux启动MindStudio时，报错“Cound not reserve enough space for xxx object heap”，提示信息如下。

问题原因

用户在菜单栏选择“Help > Change Memory Settings”，弹出的Memory Settings窗口（以图1为例）中设置的运行内存大小超过启动运行主机的内存大小。如主机内存为512MB，而用户设置内存为2014MB。
图1 Memory Settings（Linux）

设置的运行内存大小应在256~2147483647范围内。若超过该范围，单击“Save and Restart”，将提示“The value should be an integer”。

解决方法

访问用户目录下的mindstudio64.exe.vmoptions文件，修改-Xmx参数的值，设置一个合理的大小，该值至少小于主机内存。

  • Windows端：C:\Users\个人用户\AppData\Roaming\Huawei\MindStudioMS-{version}\mindstudio64.vmoptions
  • Linux端： ~/.config/Huawei/MindStudioMS-{version}/mindstudio64.vmoptions

父主题： FAQ


在Linux端使用MindStudio时出现阻塞，等待不定时间方可恢复

问题描述

  • 启动MindStudio时出现界面无响应，且控制台阻塞在日志输出“WARN - o.ssh.connection.utils.KMCUtil - start init kmc”。

  • 使用MindStudio时出现阻塞，且查看/root/.cache/Huawei/MindStudioMS-x.x/log/idea.log，有如下日志报错“WARN - o.ssh.connection.utils.KMCUtil - kmc warn entropy may not enough, entropy_avil=2, read_wakeup_threshold=64”。

问题原因

曾在如图1SSH连接配置界面设置保存密码。SSH插件使用KMC加密套件做密码保存。而/dev/random产生随机数的原理是利用当前系统的熵池（random pool）来计算出固定一定数量的随机比特，然后将这些比特作为字节流返回。熵池就是当前系统的环境噪音，熵指的是一个系统的混乱程度，系统噪音可以通过很多参数来评估，如内存的使用，文件的使用量，不同类型的进程数量等等。如果当前环境噪音变化的不是很剧烈或者当前环境噪音很小，比如设备刚启动时产生的随机数熵值不足，/dev/random会阻塞当前的程序，直到根据熵池产生新的随机字节之后才返回。当熵源不足时，使用haveged组件进行补熵。

图1 SSH连接

解决方案

通过添加haveged服务解决随机数阻塞问题。

  1. 检查操作系统是否安装haveged服务。

    • 对于CentOS、OpenEuler、EulerOS 、Kylin系统，执行以下命令进行检查。
      /bin/rpm -qa | grep -w "haveged"
    • 对于Ubuntu系统，执行以下命令进行检查。
      dpkg -l | grep -w "haveged"

    若没有回显数据，则表示未安装haveged服务。

  2. 安装haveged服务。

    • 对于CentOS、OpenEuler、EulerOS 、Kylin系统，执行以下命令进行安装。
      sudo yum install haveged
    • 对于Ubuntu系统，执行以下命令进行安装。
      sudo apt-get install haveged

  3. 检查服务是否已经启动。

    systemctl status haveged.service
    • 回显包含“Active: active (running)”信息，表示服务已启动。
    • 回显包含“Active: inactive (dead)”信息，表示服务未启动，执行以下命令启动服务。
      systemctl start haveged.service

  4. 设置该服务开机自启动。

     systemctl enable haveged.service

父主题： FAQ


基于MindX SDK开发应用，运行应用工程时，出现“can not find the element factory : mxpi_xxxpostprocessor”

问题描述

使用MindX SDK时，出现“can not find the element factory : mxpi_xxxpostprocessor”，先在“$HOME/Ascend/mindx_sdk/<sdk_version_package>/opensource/bin”路径下执行./gst-inspect-1.0 mxpi_xxxpostprocessor(插件名) 检查插件，发现插件能够正常加载，但运行时仍然报同样的错误信息。

原因分析

gstreamer的历史缓存没有清除。

解决方案

  1. 确认环境已安装Python3.9，将“libpython3.9.so.1.0”拷贝至/usr/lib64/路径下。
  2. 执行以下命令（根据具体运行环境选择x86_64.bin或者aarch64.bin）清除gstreamer的历史缓存，再运行程序即可。

    rm ~/.cache/gstreamer-1.0/registry.x86_64.bin

父主题： FAQ


编译时出现依赖不存在的报错“libgfortran.so.4: No such file or directory”

原因分析

opensource文件中的so文件需要依赖libgfortran.so.4，在编译环境中找不到。

解决方案

执行以下命令安装gfortran（如果环境中找不到gfortran-4，也可以安装大于或等于4的版本）。

apt-get update
apt-get install gfortran-4
父主题： FAQ


开发昇腾工程过程中，编译配置切换Toolchain后编译并运行时报错“cannot execute binary file: Exec format error”

问题描述

在开发昇腾工程过程中，改变编译配置中的Toolchain，切换了编译架构，再次编译并在对应架构的环境中运行，出现如下报错。

cannot execute binary file: Exec format error

原因分析

工程内容未做任何改动的情况下，切换编译配置改变编译架构，并使用了“Build CMake Project”增量编译，导致最终编译结果未重新生成。

解决方案

工程切换编译配置后，使用“Rebuild CMake Project”进行全量编译，或使用“Clean CMake Project”清理编译结果后，再次使用“Build CMake Project”重新进行编译。

父主题： FAQ


MindStudio在启动时报错“java.io.IOException: No space left on device”

问题描述

启动MindStudio失败，并出现如下报错。

java.io.IOException: No space left on device

原因分析

MindStudio长时间运行后，在/home/{username}/tmp目录下会产生较多临时文件。如果MindStudio出错关闭或者由于其他意外原因未能正常关闭，tmp目录下的临时文件可能无法自动删除，从而占据大量磁盘空间，导致再次启动MindStudio时磁盘空间不足。

解决方案

手动清理/home/{username}/tmp目录下的临时文件，释放磁盘空间。

父主题： FAQ


输入框无法输入或删除字符，且后台报错“java.lang.RuntimeException: java.awt.event.KeyEvent“

问题描述

在使用Windows通过另一台Windows远程连接一台Linux设备上的MindStudio时，出现输入框无法输入或删除字符，且后台报“java.lang.RuntimeException: java.awt.event.KeyEvent“错误。

图1 报错信息（示例）

问题分析

由于Windows远程连接和X11转发这两个过程存在键盘间的相互映射，如果这种映射关系不正确，就会导致键盘键入不能够被正确识别。

解决方案

  1. 请根据Linux系统类型使用以下命令安装X11相关依赖。

    • Ubuntu：
      apt-get install -y xterm xorg x11-apps libxtst-dev libxext-dev libxrender-dev
    • CentOS：
      yum install -y xorg-x11-apps xterm libXext libXtst libXrender

  2. 配置MobaXterm上“X11”项。

    1. 在Linux上通过localectl命令查看设备的键盘配置，会出现类似如下回显信息。
      System Locale: LANG=en_US.UTF-8
LANGUAGE=en_US:en
VC Keymap: n/a
X11 Layout: cn
X11 Model: pc105
    2. 在MobaXterm界面中，单击菜单栏“Settings > Configuration”，在弹出的MobaXTerm配置窗口切换至“X11”页签，取消勾选“Unix-compatible Keyboard”，并设置“KeyBoard”值为2.a查询获得的X11 Layout值，如图2所示。
      图2 X11配置界面
    3. 单击“OK”，完成配置并重启MindStudio。

父主题： FAQ


基于MindX SDK开发应用，使用MindX SDK Pipeline功能查看可视化pipeline时，发现插件置灰不可用

问题描述

在MindStudio中开发基于MindX SDK应用，使用MindX SDK Pipeline功能查看可视化pipeline时，发现其中部分或全部插件置灰不可用。

问题分析

MindStudio在启动时未获取到插件在库中的文件路径。

解决方案

需确认是否存在自定义插件，根据实际情况选择以下方式进行处理。

  • 如当前pipeline未使用自定义插件，重新配置并生效SDK环境变量解决。
  • 如存在自定义插件，可通过MindX SDK Pipeline中的“Plugin Manager”功能，导入自定义插件目录（目录权限需为“440”）。

刷新插件库：打开pipeline并通过插件库中的 [image] 按钮刷新，可重新查看到自定义插件已完成加载。

父主题： FAQ


在编写C++工程时，后台console或日志打印出大量Warning信息

问题描述

在使用MindStudio编写C++工程时，后台Console界面或日志中打印出大量“AnnotationHolder.createInfoAnnotation()”的Warning日志。

问题分析

因第三方插件处于接口过渡时期，部分接口即将废弃，导致出现大量相关警告。

解决方案

该Warning告警仅提示接口废弃信息，不影响MindStudio的使用，用户可忽略该提示继续编写。

父主题： FAQ


进行C++工程调试时无法结束

问题描述

使用MindStudio进行C++工程单步调试时无法结束，后台Console界面告警。

问题分析

可能存在依赖版本不匹配或缺失的情况，需根据实际报错信息进行处理。

解决方案

查看Console界面打印的日志，根据其中报错或告警的信息进行处理，安装缺失的依赖或调整依赖的版本。

例如：

  • “Missing separate debuginfos...”：则需要安装其中缺失的debuginfos。
  • “Warning: Unable to find libthread_db matching inferior's thread library, thread debugging will not be available”：则需重新确认libc与libthread_db软件包版本匹配情况。
父主题： FAQ


执行工程转换将非昇腾工程转换为昇腾工程后，发现参数选择错误无法修改

问题描述

执行工程转换将非昇腾工程转换为昇腾工程后，发现Project Type或Framework/Sub Type参数选择错误，但无法修改和回退。

解决方案

在左侧工程目录中选中新创建的.project文件，单击鼠标右键，在弹出的菜单中单击“Delete...”，按照提示删除文件后，重新选择正确的Project Type和Framework/Sub Type，执行工程转换。

父主题： FAQ


MindStudio打开工程后，出现操作迟缓、卡顿现象

问题描述

MindStudio打开工程后，操作迟缓、卡顿，比如打开工程缓慢、编辑时卡顿。

问题分析

工程文件下可能存在较大的数据文件。

解决方案

将数据文件从工程目录转移到其他目录下。

父主题： FAQ


MindStudio在配置远端SDK后运行工程，前端界面无法显示动态进度条信息

问题描述

MindStudio在配置远端SDK后运行工程，前端界面无法显示动态进度条信息。

问题分析

MindStudio暂时不支持获取远端的动态变化数据在前端显示。

解决方案

动态进度条只是显示任务的执行进度，不影响工程的正常运行，用户可忽略并等待执行结果。

父主题： FAQ


glibc版本过低导致无法使用模型可视化功能

问题描述

当Linux环境为aarch64架构时，无法使用MindStudio的模型可视化功能。

问题分析

系统中的glibc版本小于2.29。

解决方案

重新安装2.29版本的glibc，目前只提供了Ubuntu和EulerOS的glibc安装包。

  1. 请根据操作系统下载对应的安装包，然后上传到MindStudio安装服务器任意路径（比如：$HOME/package）并解压。

    • Ubuntu：下载链接。
    • EulerOS：下载链接。

  2. 配置环境变量，在MindStudio安装路径下的bin目录中执行vi MindStudio.sh命令，打开MindStudio.sh启动脚本文件，在文件第167行后面添加以下内容（以非root用户为例）。

    export LD_LIBRARY_PATH=$HOME/package/glibc-2.29/build/math/:$LD_LIBRARY_PATH
export LD_PRELOAD=MindStudio安装目录/jbr/lib/libcef.so:$LD_PRELOAD
export LD_LIBRARY_PATH=MindStudio安装目录/jbr/lib/libcef.so:$LD_LIBRARY_PATH

  3. 执行:wq!命令保存文件并退出。
  4. 在MindStudio安装路径下的bin目录中使用如下命令重启MindStudio。

    ./MindStudio.sh

父主题： FAQ


加载集群场景性能数据时提示“Low memory”

问题描述

MindStudio对采集后的集群场景性能原始数据进行解析并展示，数据加载时提示“Low memory”，如下图所示。

图1 Low memory

问题分析

由于集群场景下采集到的原始性能数据较大，数据加载到内存中需要占用更多空间，导致MindStudio加载过程中出现异常提示。

解决方案

  1. 单击顶部菜单栏“Help > Edit Custom VM Options...”。
  2. 编辑虚拟机内存大小，调整到原虚拟机内存的5-10倍。如原内存为2048MB，可设置内存为20480MB，如图2所示。

    图2 设置虚拟机内存

  3. 完成配置并保存，再重启MindStudio。
父主题： FAQ


使用模型可视化功能时界面无法显示，且后台报错“SEVERE - #c.i.u.j.JBCefApp - /xxx/libjcef.so: /xxx/libcef.so: cannot allocate memory in static TLS block”

问题描述

在Ubuntu 20.04-aarch64环境上，使用Model Visualizer、Dump Configuration等模型可视化功能时界面无法显示，且提示“SEVERE - #c.i.u.j.JBCefApp - /xxx/libjcef.so: /xxx/libcef.so: cannot allocate memory in static TLS block”报错信息。

问题分析

libcef.so文件加载冲突。

解决方案

配置MindStudio环境变量。

  1. 在MindStudio安装路径下的bin目录中执行vi MindStudio.sh命令，打开MindStudio.sh启动脚本文件，在文件第167行后面添加以下内容（以非root用户为例）。

    export LD_PRELOAD=MindStudio安装目录/jbr/lib/libcef.so:$LD_PRELOAD
export LD_LIBRARY_PATH=MindStudio安装目录/jbr/lib/libcef.so:$LD_LIBRARY_PATH

  2. 执行:wq!命令保存文件并退出。
  3. 在MindStudio安装路径下的bin目录中使用如下命令重启MindStudio。

    ./MindStudio.sh

父主题： FAQ