CN110543425B - 一种嵌入式设备的编译与调试方法 - Google Patents

一种嵌入式设备的编译与调试方法 Download PDF

Info

Publication number
CN110543425B
CN110543425B CN201910841580.XA CN201910841580A CN110543425B CN 110543425 B CN110543425 B CN 110543425B CN 201910841580 A CN201910841580 A CN 201910841580A CN 110543425 B CN110543425 B CN 110543425B
Authority
CN
China
Prior art keywords
embedded
compiling
load
program
loop
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN201910841580.XA
Other languages
English (en)
Other versions
CN110543425A (zh
Inventor
陈本彬
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Individual
Original Assignee
Individual
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Individual filed Critical Individual
Priority to CN201910841580.XA priority Critical patent/CN110543425B/zh
Publication of CN110543425A publication Critical patent/CN110543425A/zh
Application granted granted Critical
Publication of CN110543425B publication Critical patent/CN110543425B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3604Software analysis for verifying properties of programs
    • G06F11/3608Software analysis for verifying properties of programs using formal methods, e.g. model checking, abstract interpretation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3604Software analysis for verifying properties of programs
    • G06F11/3612Software analysis for verifying properties of programs by runtime analysis
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • G06F11/3624Software debugging by performing operations on the source code, e.g. via a compiler

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Software Systems (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

本发明公开一种嵌入式设备的编译与调试方法,其包括预先在嵌入式设备的闪存上安装嵌入式智能编译系统;该嵌入式智能编译系统将原宿主机采用高级语言编写的嵌入式程序直接翻译成可以直接运行于嵌入式设备的目标程序,而不需要下载、交叉编译过程,该目标程序是虚拟机运行的DEX文件或嵌入式设备的主控制器可以运行的静态二进制文件,从而完成应用程序的编译。本申请通过自行设计的嵌入式智能编译系统代替现有嵌入式设备的硬件调试模块,且各个模块为可选模块,不仅可通过预先配置来适应更多嵌入式设备编译或者调试的场合,而且通过任务调度的优化算法,能够平衡嵌入式多核处理器的负载均衡,提高程序运行效率。

Description

一种嵌入式设备的编译与调试方法
技术领域
本发明涉及嵌入式设备技术领域,具体是一种针对嵌入式设备的编译与调试方法和系统。
背景技术
嵌入式系统的编译器或编译工具,一般运行在PC端。因为早期的嵌入式系统性能一般比较弱,本身不具备自开发能力,其软件系统编程需要通过嵌入式交叉编译环境,才能将开发人员编写的高级语言程序翻译成能够运行于目标机上的程序,如图1所示。所谓的交叉编译环境是借助于处理器资源丰富的宿主机(Host),一般为PC机(或工作站),使用特定的编译工具将程序翻译成可以运行于嵌入式设备目标机(Target)平台上的程序,从而完成应用程序的开发。这种在宿主机Host平台为目标机Target平台生成可执行程序的方式叫做交叉编译,具有这种功能的编译器则称之为交叉编译器(Cross Compiler)。简单的说,交叉编译是在一个平台上生成另一个平台的可执行代码。嵌入式系统编译器一般需要具有交叉编译和交叉调试功能。交叉调试是在主机上借助编译器和调试工具直接调试目标机上的代码,通常需要通过USB,JTAG等工具连接目标机器。
也就是说,嵌入式程序的编辑、编译、链接过程都是作为宿主机的PC机(或工作站)上完成的,而程序的最终运行却是在和宿主机有很大区别的目标机——嵌入式设备上进行的。其中,目标机和宿主机的主要差别为:一、硬件环境不同,即CPU(Central ProcessingUnit,处理器)类型不同;二、软件环境不同,宿主机上有成熟的操作系统的应用软件支持,而目标机一般是裸机或者需要调试的嵌入式系统。而调试同样是嵌入式系统软件开发过程中必不可少的环节。现有的嵌入式系统的调试系统通常有两种,一种是通过仿真器和特定调试总线进行的,例如ARM系列处理器通过JTAG/SWD总线和连接计算机的ARM仿真器进行调试,MIPS系列处理器通过EJTAG总线和连接计算机的MIPS仿真器进行调试。另一种是通过外接调试器来实现,例如一篇申请号为201210466402.1的发明专利公开的一种基于通用调试接口的SoC硬件调试器,其包括通用调试接口、TAP控制器、扫描链、调试控制寄存器模块、同步模块、JTAG-AHB协议转换模块、AHB-DMA模块、AHB总线控制器、调试支持模块、SoC外设模块和支持调试的处理器。该发明在调试时,将SoC硬件调试器与嵌入式系统连接,再执行相应的调试。但是,以上调试系统,由于每个处理器架构都需要配置专门的调试总线和仿真器,外接调试器也会针对不同的处理器有不同的硬件要求,因此,会带来使用不便、二次开发复杂等的问题。
发明内容
在下文中给出了关于本发明实施例的简要概述,以便提供关于本发明的某些方面的基本理解。应当理解,以下概述并不是关于本发明的穷举性概述。它并不是意图确定本发明的关键或重要部分,也不是意图限定本发明的范围。其目的仅仅是以简化的形式给出某些概念,以此作为稍后论述的更详细描述的前序。
根据本申请的一个方面,提供一种嵌入式设备的编译与调试方法,其包括以下步骤:
预先在嵌入式设备的闪存(FLASH)上安装嵌入式智能编译系统;
该嵌入式智能编译系统能支持更广泛的嵌入式高级语言,比如适配嵌入式特点的更为广泛的非标准ANSI C语言,将原宿主机采用高级语言编写的嵌入式程序(APP、中间件及各类系统软件)直接翻译成可以直接运行于嵌入式设备的目标程序,而不需要下载、交叉编译过程。该目标程序是虚拟机运行的DEX文件或嵌入式设备的主控制器可以运行的静态二进制文件。
其中,智能编译系统将嵌入式程序翻译成目标程序具体包括:对嵌入式程序的源代码进行解析,得到抽象语法树,将得到的抽象语法树中的非标准的标识符识别为嵌入式设备语言的关键字,得到嵌入式设备可识别的抽象语法树,并对该抽象语法树进行解析,转换为中间语言或目标程序。中间语言或目标程序由嵌入式智能编译系统编译生成,其源语言是一种或多种高级语言。
将得到的抽象语法树中的非标准的标识符识别为嵌入式设备语言的关键字具体是:词法分析器在词法分析时,在词法标识符节点(Token)采集阶段,将‘@’、‘#’、‘$’、‘%’、‘&’等特殊字符作为特殊的标识符识别出来,以‘@’为例,将其构造为<ATSIGN,‘@’>的伪标识符节点,最后再将其识别为关键字;同时,语义分析器在编译时,将特殊字符关键字等同标识为变量或函数的属性关键字,并将紧跟在特殊字符关键字的标识符内容解析为变量或函数属性(如noinline为非内联函数),以此丰富嵌入式语言与编译器的变量或函数表达与处理能力,避免编译器错误。
该嵌入式智能编译系统可运行当前嵌入式设备主控制器指令集,其包括IDE编辑和调试环境,编译器(HC)(及其扩展),汇编器(AS),链接器(LD),库文件,以及可选的JAVA虚拟机;该嵌入式智能编译系统的各模块根据嵌入式设备的需要进行配置:基于IDE编辑和调试环境、编译器和JAVA虚拟机,完成基于虚拟机上的程序编译;而基于IDE编辑和调试环境、编译器、汇编器与链接器以及库文件,完成程序的静态编译,将程序直接运行在主控制器上。
在硬件上,本申请的嵌入式设备可以包括主控制器或者多核SoC、存储器与FLASH,可选的其他输入、输出及通讯接口,但并不需要相应的调试模块(UART调试接口与电路),由本申请公开的嵌入式智能编译系统代替现有嵌入式设备的调试模块以及用于配合嵌入式设备的调试模块进行调试编译的外设。
嵌入式智能编译系统的编译器主要包括将宿主机的源代码解析为token的词法分析器、将token解析为AST的语法分析器、对语法分析器输出的AST进行编译的语义分析器、以及根据语义分析器编译后的AST生成代码的代码生成器。为了适应嵌入式设备的编译,本申请的编译器除了对现有的编译器模块进行优化裁剪,并针对嵌入式设备的特点,修改编译器的前端语言(标识符扩展和语法树扩展),同时针对嵌入式资源有限及低功耗要求,充分利用嵌入式多核资源,采用多核静态编译和多核负载均衡算法。
同时,嵌入式智能编译系统能够对编译的程序进行调试信息插入,实现对应用程序运行过程的调试与反馈。
另外,针对嵌入式设备的多核编译和并行化处理,本申请的嵌入式智能编译系统采用提出的一种基于评估函数的任务静态分配多核编译调度方法,该多核编译调度方法在任务静态分配的基础上,引入符号分析中评估函数的概念进一步保证静态调度负载均衡性。具体的,该基于评估函数的任务静态分配多核编译调度方法是通过对多核调度、任务划分和负载均衡等问题的描述,基于对并行循环的划分定义及负载函数的映射模型,利用了编译器获得的评估函数分析循环信息及其负载情况,依托包括贪婪算法在内的各种求解最优算法,获得最优的循环函数的迭代分布,以解决编译器静态调度的负载不均衡问题,提高嵌入式程序的并行效率。包括:
嵌入式程序的并行循环中,令load(IRk)为负载评估函数每个迭代的负载,则为达到负载均衡的最优迭代子集的负载即为循环迭代的负载之和与处理器个数P的商:
Figure GDA0002241952250000051
其中,K为循环迭代总数;
负载通过函数的面积计算时,评估函数的负载均衡问题转换为求解评估函数迭代子集的面积相等来计算,令S为评估函数的总面积,则有:
load(IRp)=S/P;Iinit为静态循环分配的循环变量的初值;
通过负载均衡的计算,可以获得精确的迭代子集划分,但由于迭代块大小Kp必须取整数,实际计算中需要采用取整的方法获得迭代子集IRp及其迭代块大小Kp,可采用向上取整的计算迭代块大小和迭代子集的计算方法,亦可以采用更加复杂的贪婪算法计算迭代子集的划分。
通过评估函数获得负载集合load(IR)迭代子集的划分及其迭代块大小Kp。由循环迭代集合IR、负载集合load(IR)以及通过评估函数建立的映射关系,求得循环函数的迭代划分IR'p如下:
Figure GDA0002241952250000052
Istep为静态循环分配的循环变量的步长;Icinit为静态循环分配的循环变量的每个迭代块的初值。
其中,K'p即为评估函数获得的Kp值,最终依据评估函数模型计算最优的负载均衡,以此完成循环迭代划分,从而保证了循环程序静态编译划分的负载均衡。
本申请采用上述方案,通过自行设计的嵌入式智能编译系统代替现有嵌入式设备的硬件调试模块,并针对嵌入式设备做了适应性的改进,不仅广泛适用于各种需要在嵌入式设备上编译调试的使用需求,而且更容易实现二次开发。同时,本申请的嵌入式智能编译系统的各个模块为可选模块,可通过预先配置来适应更多嵌入式设备编译或者调试的场合。同时,本申请提出的静态负载评估函数方法,将根据负载评估函数确定迭代子集的迭代块大小,以获得最佳的负载均衡,解决了嵌入式设备的多核编译和并行化处理问题,提高了嵌入式设备的运行效率。
附图说明
本发明可以通过参考下文中结合附图所给出的描述而得到更好的理解,其中在所有附图中使用了相同或相似的附图标记来表示相同或者相似的部件。所述附图连同下面的详细说明一起包含在本说明书中并且形成本说明书的一部分,而且用来进一步举例说明本发明的优选实施例和解释本发明的原理和优点。在附图中:
图1为现有嵌入式设备的调试系统的示意图;
图2为本发明的嵌入式设备的嵌入式智能编译系统的示意图;
图3为本发明的嵌入式智能编译系统的原理框图;
图4为本发明的编译器的标识符改造的流程图;
图5(a)和5(b)分别为两种表达式对应的两种推导方式,图5(c)为解析数,图5(d)为抽象语法树的表示形式;
图6为函数及其抽象语法树;
图7(a)是递减函数的静态和评估方法的分配方案中的默认静态分配;图7(b)为递减函数的静态和评估方法的分配方案中静态评估(Static_Eval)分配;
图8为各种调度运行时间比较图;
图9为并行运行加速比;
图10为各种静态调度运行效果比较图;
图11为单位负载不同情况下的运行时间;
图12为不同线程情况下的运行时间;
图13为迭代数很大时动态和静态评估方法比较。
具体实施方式
下面将参照附图来说明本发明的实施例。在本发明的一个附图或一种实施方式中描述的元素和特征可以与一个或更多个其它附图或实施方式中示出的元素和特征相结合。应当注意,为了清楚的目的,附图和说明中省略了与本发明无关的、本领域普通技术人员已知的部件和处理的表示和描述。
嵌入式系统编译器是交叉编译环境的核心,其提高嵌入式系统开发效率的同时,还可以用于嵌入式软件代码纠错,程序调试等各种嵌入式软件开发过程,极大的保证了嵌入式软件的开发,但其仍然需要PC机作为宿主机,需要交叉编译、调试环境与硬件支持,需要PC的程序编译、下载和调试过程。参见图2,本申请通过对现有的嵌入式设备进行改动,移植嵌入式智能编译系统(EHCS)到嵌入式设备的FLASH中并固化,并省去嵌入式设备端的UART或USB调试接口与电路,因此,本申请的方案不仅能够改变当前嵌入式开发的交叉编译与调试方式,方便嵌入式程序的开发过程,而且节省CPU IO接口并可将其用于其他通信接口,解决现有嵌入式平台的编译与调试问题及有限接口资源问题。
参见图3,该嵌入式智能编译系统可运行当前嵌入式设备主控制器指令集,其包括IDE编辑和调试环境,编译器(HC)(及其扩展),汇编器(AS),链接器(LD),库文件,以及可选的JAVA虚拟机;该嵌入式智能编译系统的各模块根据嵌入式设备的需要进行配置:基于IDE编辑和调试环境、编译器和JAVA虚拟机,完成基于虚拟机上的程序编译;而基于IDE编辑和调试环境、编译器、汇编器与链接器以及库文件,完成程序的静态编译,将程序直接运行在主控制器上。
在硬件上,本申请的嵌入式设备可以包括主控制器或者多核SoC、存储器与FLASH,可选的其他输入、输出及通讯接口,但并不需要相应的调试模块(UART调试接口与电路),由本申请公开的嵌入式智能编译系统代替现有嵌入式设备的调试模块以及用于配合嵌入式设备的调试模块进行调试编译的外设。
其中,该嵌入式设备可以直接实现应用程序的开发,其将Language A语言编写的程序(APP、中间件及各类系统软件)翻译成可以直接运行于嵌入式设备Target平台(目标平台)本身的Language B语言程序(可以是虚拟机运行的DEX文件或主控制器可以运行的静态二进制文件),从而完成应用程序的编译,其中Language B是编写编译工具与系统的语言,可以是一种或多种高级语言;目标处理器模型作为可配置或可选模块,使得EHCS具备适应多种嵌入式设备,多种嵌入式处理器的运行能力。
其中,编译与调试动作中,可以选择EHCS中的不同模块,也可以选择IDE编辑和调试环境与编译器的组合,编译出一种中间语言代码(如DEX),并将其运行在虚拟机上;也可以是IDE编辑和调试环境、编译器、汇编器、链接器以及存储库文件的整体的组合,编译出可以直接运行于主控制器上的静态程序代码。
嵌入式智能编译系统的编译器主要包括将宿主机的源代码解析为token的词法分析器、将token解析为AST的语法分析器、对语法分析器输出的AST进行编译的语义分析器、以及根据语义分析器编译后的AST生成代码的代码生成器。生成的目标代码可以是ASM形式的汇编,亦可以是某一种形式的中间语言,如DEX。可以与静态编译器后端连接,如汇编器与链接器,亦可以与JAVA虚拟机形式的动态解析形式的后端连接。
为了适应嵌入式设备的编译,本申请的编译器在前端语言与语法上做了适配嵌入式系统的扩展,如针对嵌入式设备有限代码资源的编译器移植与裁剪,编译器前端的标识符扩展与语法树扩展等,同时针对嵌入式负载不均衡和并行问题,采用多核静态编译和多核负载均衡算法。
对标识符进行扩展:
通常变量、类型或函数的类C语法如下:
Syntax:
Data_type Variable|Type|Function
嵌入式设备往往需要制定这些变量、类型或函数的具体地址,因此,增加’@’关键字对前端语法进行扩展。其语法特征如下:
Syntax:
Data_type Variable|Type|Function@memory_location
为此,首先需要在词法分析阶段进行处理。在词法标识符节点(Token)采集阶段,将‘@’作为特殊的标识符识别(伪标识符)出来,而后将其构造为类似于标识符节点的<ATSIGN,‘@’>节点,最后在将其识别为关键字。
由于C语言标识符I有如下文法规则,其中,*表示闭包:
L→A|B|…|Z|a|b|…|z|_|;
D→0|1|…|9;
I→L|(L|D)*;
增加’@’特殊的标识符节点会破坏原有标识符的构成。标识符的词法解析是通过标识符识别阶段进行的,图4是对标识符构造函数的改造流程图。在识别’@’作为特殊标识符的同时,避免了对原有标识符的破坏,保证原有标识符构成的同时可以将‘@’作为特殊的标识符,即关键字处理。
对语法树进行扩展:
由正则表达式和文法可知,推导可以将初始的非终结符构造一个特定的终结符的串。由于同一个串存在有多种推导过程,但其最后结果却可能完全一致,为此,提出一种回避不同推倒过程的表示形式,即推倒树,也称解析树。
定义1.1不含基本循环的无向连通图G称为树,用T表示。无向树中的边称为树枝,度为1的顶点称为树叶。
定义1.2C=(N,F,P,S)为一文法,则满足下面四个条件的一棵树称之为C的一棵推导树或解析树(Parse tree):
(1)每一结点均有一标记,此标记为N∪F中的一个符号;
(2)树的根结点以文法的开始符号S标记;
(3)若一结点至少有一个直接后继,则此结点上的标记为N中的一个符号;
(4)若一个以A为标记的结点有k个直接后继,且按从左至右的顺序,这些结点的标记分别为X1,X2,…,Xk,则A→X1X2…Xk必然是C的一个产生式。
解析树(或推导树)是与文法推导过程相对应的,其内部的节点表示非终结符,树的叶子节点由终结符表示,内部树节点的子节点表示某个推导步骤的相关非终结符推导过程。针对算术表达式文法规则:
expression→expression op expression|(expression)|number
op→+|-|*|/
存在如图5(a)和5(b)的两种推导方式,但相应的只有图5(c)一棵解析数,其中,推导过程中的符号ex和nu以简写方式代替文法规则的表达式和数字。
抽象语法树(AST)是基于语法解析数或推导树的抽象。对于算术运算表达式26*5+8,其抽象语法树的表示形式如图5(d)所示。解析树能够展示语法推导的过程,但实际应用中,编译器更关注的是推导后的结果。于是,抽象语法树简化了语法树的推导过程,着重体现了编译器需要关注的的各元素的实际关系。抽象语法树(AST)可以简称为语法树。
一个高级语言程序要实现若干功能,往往将其分为几个独立的部分,在结构化程序设计(如C语言中),是通过函数来实现的。例如,一种带’@’关键字的嵌入式语言的函数描述为如下形式:
存储类别数据类型函数名(形参定义表)@属性定义表
{
函数的执行部分
}
给定一个C语言函数“func”,简化的抽象语法树描述如图6所示。EHCS扩展了’@’为属性关键字,并利用属性定义表丰富编译器的表达能力。如图6所示,为防止编译器优化将“func”函数内联到调用函数中,通过”noinline”函数属性,告知编译器此函数不适合建立为inline函数,避免编译器错误。
多核静态编译调度:
通过对多核调度、任务划分和负载均衡等问题的描述,基于对并行循环的划分定义及负载函数的映射模型,提出一种基于静态评估函数的调度方法,以解决编译器静态调度的负载不均衡问题,提高嵌入式程序的并行效率。
多核编译和并行化技术一直是嵌入式编译器领域的重要课题。该专利基于共享内存多核处理器的并行编程与编译技术,提出基于评估函数的编译器静态调度方法解决多核循环静态调度的负载不均衡问题,通过对加速比、负载均衡和任务调度等的数学描述,阐述这种新的编译静态任务分配和调度方法,并对算法进行形式化描述,以解决多核静态任务分配的负载不均衡问题。最后,通过实验验证提出方案的有效性。
调度问题是一个NP完全问题,并行加速比、负载均衡和调度开销是衡量调度性能的三个重要指标。并行加速比是串行程序执行时间与并行程序执行时间的比值。假定共享存储器的并行处理器,处理器具有相同的处理能力,加速比公式如公式(1),其中T(1)程序串行执行时间,T(n)表示n个线程的并行执行时间。
Figure GDA0002241952250000121
负载均衡就是力争将负载均匀的分布在各个处理器上。
本发明针对共享内存处理器的程序循环任务分配和调度问题进行定量的描述,以此提出基于评估函数的多核静态编译调度优化方法,进一步改进编译器静态调度程序循环可能的负载不均衡问题。最后,通过GCC/LLVM实验验证并分析新方法的有效性。
定义1设X是非空集合,A={A1,A2,...,Am},
Figure GDA0002241952250000131
且Ai≠Φ(i=1,2,...,m),如果
Figure GDA0002241952250000132
则称A是X的覆盖。
定义2设A是X的覆盖,且满足Ai∩Aj=Φ(i≠j),则称A是X的一种划分或分配。A的任一元素Ai都称为A的一个类或划分的一个块。
循环任务并行是程序特别是多媒体应用程序并行的主要对象之一,而划分迭代子空间的方法是编译器循环迭代分配的主要方法。循环语句(如for循环)的执行是执行所有循环变量的取值相应循环体的内容;循环任务的并行分配是对循环变量进行迭代分配,再将分配的任务子集依据一定的规则在P个处理器上并行执行。根据静态循环分配的循环变量是整数类型的特点,假设i为循环变量,其初值为Iinit,步长为Istep,终止为Iend,使用循环上界LUB(Loop Upper Bound)来统一描述不同情况下的循环边界。则有:
Figure GDA0002241952250000133
定义3令IR为循环变量i构成的集合,K为其循环迭代总次数,若IR划分为P个迭代子集IRp(p=0,1,2,…,P-1),每个迭代子集中的迭代块大小为Kp
则有:
Figure GDA0002241952250000134
Figure GDA0002241952250000135
Figure GDA0002241952250000136
由定义3可知,循环迭代集合IR是循环变量构成的集合,可以表示为迭代变量i的函数关系如下。因此,各种循环调度实际上就是对IR或K的不同划分或分配。
IR={Iinit+i·Istep|i=0,1,2,...,K-1} (5)
定理1设IRp(其中p=0,1,2,…,P-1)是非空循环变量集合IR的一种划分,若关系
Figure GDA0002241952250000147
则R是IR中的等价关系。
证明:(1)当y=x时,关系xRx成立,且由划分可知
Figure GDA0002241952250000141
且IRi∈IR,则R是自反的。
(2)由R的定义可知,x,y的取值可以互换,即
Figure GDA0002241952250000142
则R是对称的。
(3)当x,y,z∈IR,使得xRy,yRz成立,
Figure GDA0002241952250000143
Figure GDA0002241952250000144
使得x∈IRi且y∈IRi,y∈IRj且z∈IRj成立。根据划分的定义,i≠j,
Figure GDA0002241952250000145
则i=j,z∈IRi。由R的定义可知,
Figure GDA0002241952250000146
则R是传递的。
由于R是自反的,对称的和传递的,所以,R是IR中的等价关系。证毕。
因此,由一个划分也可以确定唯一的一个等价关系,集合IR中的等价关系是对集合IR的元素的一种划分。这是划分的重要特性,在循环迭代中,通过判断关系R,将能够并行执行的迭代分配到不同划分块IRi(或类)中。而针对传统的多核任务静态分配通过Pragma指导的并行编程方法,编程者能够通过编程控制循环迭代的划分。
本发明提出一种带评估函数的静态调度(Static_Eval)算法,在传统静态调度调度开销小的优点上,通过引入符号分析中评估函数的概念进一步保证静态调度负载均衡性。扩展的传统的多核任务静态分配循环调度方法如下:
SCHEDULE(SCHT,CHUS)
其中,SCHT∈{1,2,3,4}
相对于传统的多核任务静态分配的SCHT取值,增加5为静态评估(evaluation)调度方法,使得多核任务静态分配具有如下的5种调度策略。
SCHT∈{static,dynamic,guided,runtime,evaluation}
当SCHT=evaluation时,CHUS为相应的循环负载评估函数或其指定的值。
将程序的循环分布分为四种典型的分布如下:
常规循环。每次迭代具有相同的计算负载。
随机循环。计算负载随着循环变量变化而随机变化。
递增循环。计算负载随着循环变量逐步变化而线性增加。
递减循环。计算负载随着循环变量逐步变化而线性减少。
定义4设f是从集合X到Y的一个二元关系,且对于任意x∈X,都有唯一的y∈Y,使得<x,y>∈f,则称f为从X到Y的函数或映射,并记作f:X→Y。
对于函数f:X→Y来说,若<x,y>∈f,则称x是自变量,y是函数f在x处的值或在f作用下x的像点,x称为y的原像或像源,通常用y=f(x)表示。通过建立循环迭代集合IR与负载集合load(IR)的评估函数f(x)的映射关系,完成负载均衡的计算,以此获得原始集合IR的一种划分。f(x)既是对负载的评估函数也是循环迭代集合IR与负载集合load(IR)的映射。
性质1:针对IR和load(IR)集合及其映射函数f,定义4具有如下属性:
函数f的定义域是IR,而不能是IR的任一真子集。
任一x∈IR,只能有唯一的像点y∈load(IR)。
定义5集合IR中,设负载函数load(IRi)=f(i),满足对任意i∈[0,K-1]∪(i+1)∈[0,K-1],若f(i)<f(i+1),则称load(IR)为负载递增循环。若f(i)>f(i+1),则称load(IR)为负载递减循环。
引理2负载递增和递减循环构成的集合IR,其循环迭代负载可以构成相应的集合load(IR),则关系R=f(i)构成偏序关系,亦是全序关系。
根据全序关系及定义4,令公式(14)L(x)为负载递减型函数的一种评估函数或映射函数,以此建立IR与Load(IR)的映射。
L(x)=loadinit-λX,L(x)>0,λ>00≤X≤K-1 (14)
其中loadinit为初始负载,评估函数负载L(x)恒大于零,假定评估函数的取值范围为[0,K-1],其中K为循环迭代总数。而
Figure GDA0002241952250000161
为线性调整因子,指示线性递减型负载的斜度变化。实际上,我们将评估函数的定义域设定为[0,K-1],即可通过公式(5),将其与IR建立一一对应关系。
不同于公式(6),(7)的传统静态调度迭代子集的迭代块大小Kp的计算方法,计算结果只与迭代总数K有关,一旦K确定,迭代子集就确定。本发明提出的静态负载评估函数方法,将根据负载评估函数确定迭代子集的迭代块大小Kp,以获得最佳的负载均衡。假设load(IRk)为负载评估函数每个迭代的负载,如公式(15),迭代子集的负载即为循环迭代的负载之和与处理器个数P的商:
Figure GDA0002241952250000162
如图7(b)所示,负载也可以通过函数的面积计算,评估函数的负载均衡问题就可以转换为求解评估函数迭代子集的面积相等来计算,如公式(16),令S为评估函数的总面积,则有,
load(IRp)=S/P=(1+Iinit)·K/2P (16)
通过负载均衡的计算,我们可以获得精确的迭代子集划分,但由于迭代块大小Kp必须取整数,实际计算中需要采用取整的方法获得迭代子集IRp及其迭代块大小Kp。本申请给出了向上取整的计算迭代块大小和迭代子集的计算方法,亦可以采用更加复杂的贪婪算法计算迭代子集的划分。
通过评估函数获得负载集合load(IR)迭代子集的划分及其迭代块大小Kp。由于循环迭代集合IR、负载集合load(IR)通过评估函数建立的映射关系。将Kp代入公式(10),求得循环函数的迭代划分IR'p如公式(17):
Figure GDA0002241952250000171
其中,K'p即为评估函数获得的Kp值,最终依据评估函数的划分,完成循环迭代划分,从而保证了静态划分的负载均衡。
传统采用公式(6)和(7)的静态划分方法,如图7(a)所示,针对负载递减函数负载严重不均衡,即load(IR0)>>load(IRP-1);而采用公式(15)~(17)的Static_Eval静态调度方法,如图7(b)所示,将循环迭代划分转换为求解评估函数负载均衡问题,应用评估函数计算的迭代块划分到实际的循环函数划分中,通过编译器获得基于负载均衡的最佳静态分配,即:
Figure GDA0002241952250000172
负载递增和递减循环的迭代负载load(IR)集合中,假设采用Static调度方案,设最大迭代块为IRmax,而令静态评估Static_Eval分配最大迭代块为IR'max,则相应的运行时间为t1=T(Load(IRmax))和t1'=T(Load(IR'max))。
定理3如果IRp(p=0,1,2,…,P-1)是负载递增和递减循环构成的集合IR的划分,当t1=T(Load(IRmax))且t1'=T(Load(IR'max)),则t1>t1'。
证明:由于运行时间与负载量成正比,为得到Static调度和Static_Eval调度的运行时间关系t1>t1',只要能够证明load(IRmax)>load(IR'max)。根据公式(16),采用静态评估方法的负载约为S/P。而由图7(a)可知,负载递减函数传统静态方法,最大迭代为IR0,根据相似原理,能够得到其负载为
Figure GDA0002241952250000181
Figure GDA0002241952250000182
同时,
Figure GDA0002241952250000183
∴当P>1时,2P-1>P
Figure GDA0002241952250000184
由此可知,当P>1时,采用基于负载均衡的静态评估方法与传统的默认静态分配方法相比,其load(IRmax)>load(IR'max),因此,t1>t1'。证毕。
在相同结构的多核处理器系统中,最大迭代块的运行时间决定了并行程序的运行时间,根据公式(1)亦可以得到
Figure GDA0002241952250000185
即静态评估能获得更高的加速比。通过合理的选用评估函数拟合负载模型,利用编译器通过合适的算法(如本申请实施例下面提及的一种计算划分的算法)静态解决并行划分问题,如计算IRp和Kp,就能保证Static_Eval方法各个处理器的负载相等或最接近于最优解。
假定Iinit=100,Istep=-1,K=100的递减型循环函数:
f(k)=100-k,k=0,1,...,99 (19)
对应的负载评估函数为公式(20):
y=100-x (20)
设P=4,根据公式(7)、(8)和(9),及公式(15),(16),通过本申请实施例下面提及的计算划分的算法,四个线程相应的迭代分配块大小Kp,及根据公式(11)计算负载不均衡的结果如表1所示。
表1迭代数为100的线性递减例程分配及负载不均衡表
Figure GDA0002241952250000191
Static_Eval调度方法,消除了传统静态调度可能的负载不均衡问题,达到最大限度的保证负载均衡的目的。下面为求解Static_Eval的迭代子集及其迭代块大小的一个计算划分的算法。
Figure GDA0002241952250000192
Figure GDA0002241952250000201
在Static_Eval负载均衡算法中,根据处理器个数P,计算评估函数的迭代子集的平均负载,再根据平均负载计算每个子集的迭代块大小Kp,由于评估函数的迭代总数与循环函数一致(或通过评估函数平移达到与循环函数迭代总数一致),获得的Kp可以直接应用于公式(17),以获得循环函数的迭代分布。以此解决循环迭代划分的负载不均衡问题。
本发明在传统的任务静态分配的基础上,通过定义、定理与证明,定量的描述静态任务分配,并基于此提出一种基于评估函数的(多核任务)静态编译调度方法,从数学上描述算法,通过数学方法解决最优化问题:基于对并行循环的划分定义及负载函数的映射模型,利用编译器获得的评估函数分析循环信息及其负载情况,获得最优的循环函数的迭代分布,以解决编译器静态调度的负载不均衡。
实验结果及其分析
本发明采用Intel(R)双核四线程平台i5-3230M,主频2.6GHz,4GB内存,使用Msys+MinGW编译和实验环境,选取递减无嵌套循环程序,利用GCC4.5.2版本编译的程序代码修改验证。实验验证并比较提出的Static_Eval静态调度方法与传统的多核任务静态、动态和指导调度方法的运行效果,并对实验数据进行分析。
使用递减无嵌套循环验证程序,采用默认4线程的实验环境,通过静态调度,新的静态评估(Static_Eval)调度,动态调度,指导调度及串行程序运行比较,获得相应的程序运行时间(tick为单位),并对实验结果进行比较分析。
如图8为各种调度方法随机抽取10次的运行时间(ticks)比较。从图可知,串行程序运行时间最长;默认的静态调度和指导调度,程序需要的运行时间较长,且程序运行的时间波动也较为明显,说明运行效果相对不稳定;动态调度和提出的静态评估调度,运行时间最短,而且程序运行时间相对稳定,说明提出的静态评估方法能够有效改进传统的默认静态调度由于可能的负载不均衡造成并行程序运行时间较长的问题。
图9由加速比公式(1)获得的加速比比较图。从图上可知,提出的静态评估调度方法获得的加速比最为接近动态调度的运行效果。
图10将几种静态运行效果独立出来比较。分别就默认的静态调度方法,及采用迭代块为1(Static,1)和2(Static,2)的两种静态调度算法与提出的静态评估调度方法的运行时间比较。虽然采用的是线性递减负载的循环测试程序,(Static,1)采用的最小迭代块为1的静态分配方法,能够在传统静态分配方法中,最大限度的降低静态负载不平衡问题。但从比较结果可知,本文提出的静态评估调度方法,仍然能够获得比(Static,1)方法更好的并行效果。其原因在于,本文提出的静态评估方法,在编译器可以依据评估函数尽可能的计算出最佳的负载平衡,而获得最优或次优的迭代子集。
负载变化的情况下,提出的静态评估调度方法是否能够获得相似的结果,图11通过改变负载的运行时间为1/2,1,2,4,8倍于先前实验的情形,验证提出的静态评估调度运行效果。由获得的数据可知,虽然负载变化会改变程序的执行时间(不同调度方法具有相似的线性变化过程),但Static_eval效果与dynamic效果保持几乎一致,达到比静态和指导调度更好的效果。当迭代负载趋近与0时,运行时间也相应的趋于0。
同样通过改变线程数比较运行效果,结果证明新的方法针对不同的线程的有效性。由图12可知,随着线程数的增加,并行运行时间逐渐降低,线程数大于4以后,曲线逐渐趋于平缓,动态调度和静态评估调度并行运行时间基本没有变化,接近于最佳的并行负载均衡,传统的默认静态调度和指导调度并行效果较差,静态评估调度和动态调度效果基本吻合,并行效果较好。特别的,静态评估和动态调度方法,在串行程序改为2个线程的并行程序时,即能获得较好的并行效果,运行效果也比较稳定,这非常有利于当前嵌入式并行CPU核数较少的情形,可以有效的改善嵌入式并行程序的负载均衡和加速比,同时降低嵌入式系统的能耗。
由于静态评估调度可以通过编译器静态计算获得最佳的负载均衡,且依据公式(12),静态调度开销比动态调度开销小,因此,从理论上分析,本发明提出的静态评估调度在能保证计算负载基本均衡的情况下(实际上由于迭代取整,会造成一定的负载不均衡),能够达到比动态调度更佳的效果。如公式(13)所示,静态评估调度的负载不均衡比动态调度开销小时,即能取得最佳的调度效果。
采用扩大迭代次数K,降低迭代负载,使得动态调度开销随着K变大而变大,负载均衡影响随着负载的降低而变得不太明显,即达到公式(13)的动态调度开销(次数)大于负载不均衡的情形,本发明提出的静态评估方法会获得比动态调度方法更好的运行效果。如将迭代n由100改为100000,负载以相反的方式降低,运行效果见图13所示,采用随机采样10组运行时间的统计值,静态评估调度获得了比动态调度更佳的运行效果。因此,在嵌入式并行循环中,如果迭代次数比较大,单位负载又相应的比较低,本发明提出的静态评估调度方法能够获得最佳的并行效果。
应该强调,术语“包括/包含”在本文使用时指特征、要素、步骤或组件的存在,但并不排除一个或更多个其它特征、要素、步骤或组件的存在或附加。
此外,本发明的方法不限于按照说明书中描述的时间顺序来执行,也可以按照其他的时间顺序地、并行地或独立地执行。因此,本说明书中描述的方法的执行顺序不对本发明的技术范围构成限制。
尽管上面已经通过对本发明的具体实施例的描述对本发明进行了披露,但是,应该理解,上述的所有实施例和示例均是示例性的,而非限制性的。本领域的技术人员可在所附权利要求的精神和范围内设计对本发明的各种修改、改进或者等同物。这些修改、改进或者等同物也应当被认为包括在本发明的保护范围内。

Claims (7)

1.一种嵌入式设备的编译与调试方法,其特征在于:包括以下步骤:
预先在嵌入式设备的闪存上安装嵌入式智能编译系统;
该嵌入式智能编译系统将原宿主机采用高级语言编写的嵌入式程序直接翻译成可以直接运行于嵌入式设备的目标程序,而不需要下载、交叉编译过程;
该目标程序是虚拟机运行的DEX文件或嵌入式设备的主控制器可运行的静态二进制文件,从而完成应用程序的编译;
所述嵌入式智能编译系统的编译器包括将宿主机的源代码解析为token的词法分析器、将token解析为AST的语法分析器、对语法分析器输出的AST进行编译的语义分析器、以及根据语义分析器编译后的AST生成代码的代码生成器;所述编译器修改了前端语言,对其进行标识符扩展和语法树扩展;
其中,所述编译器对标识符进行扩展,增加‘@’关键字对前端语法进行扩展,其语法特征如下:
Syntax:
Data_type Variable|Type|Function@memory_location;
为此,首先需要在词法分析阶段进行处理,在词法标识符节点采集阶段,将‘@’作为特殊的标识符识别出来,而后将其构造为<ATSIGN,‘@’>节点,最后再将其识别为关键字;
由于C语言标识符I有如下文法规则,其中,*表示闭包:
L→A|B|…|Z|a|b|…|z|_|;
D→0|1|…|9;
I→L|(L|D)*;
因此,增加’@’特殊的标识符节点会破坏原有标识符的构成,为此,标识符的词法解析是通过标识符识别阶段进行的,在识别’@’作为特殊标识符的同时,避免了对原有标识符的破坏,保证原有标识符构成的同时可以将‘@’关键字处理;
所述编译器对语法树进行扩展,采用不同推导过程的表示形式,其具有如下定义:
定义1.1不含基本循环的无向连通图G称为树,用T表示;无向树中的边称为树枝,度为1的顶点称为树叶;
定义1.2C=(N,F,P,S)为一文法,则满足下面四个条件的一棵树称之为C的一棵推导树或解析树:
(1)每一结点均有一标记,此标记为N∪F中的一个符号;
(2)树的根结点以文法的开始符号S标记;
(3)若一结点至少有一个直接后继,则此结点上的标记为N中的一个符号;
(4)若一个以A为标记的结点有k个直接后继,且按从左至右的顺序,这些结点的标记分别为X1,X2,…,Xk,则A→X1X2…Xk必然是C的一个产生式;
解析树是与文法推导过程相对应的,其内部的节点表示非终结符,树的叶子节点由终结符表示,内部树节点的子节点表示某个推导步骤的相关非终结符推导过程;
抽象语法树是基于语法解析树或推导树的抽象。
2.根据权利要求1所述的嵌入式设备的编译与调试方法,其特征在于:智能编译系统将嵌入式程序翻译成目标程序具体包括:对嵌入式程序的源代码进行解析,得到抽象语法树,将得到的抽象语法树中的非标准的标识符识别为嵌入式设备语言的关键字,得到嵌入式设备可识别的抽象语法树,并对该抽象语法树进行解析,转换为中间语言或目标程序。
3.根据权利要求2所述的嵌入式设备的编译与调试方法,其特征在于:将得到的抽象语法树中的非标准的标识符识别为嵌入式设备语言的关键字具体包括:词法分析器在词法分析时,在词法标识符节点采集阶段,将嵌入式程序中的特殊字符识别出来,将其构造为伪标识符节点,最后再将其识别为关键字;同时,语义分析器在编译时,将关键字等同标识为变量或函数的属性关键字,并将紧跟在关键字的标识符内容解析为变量或函数属性,避免编译器错误。
4.根据权利要求3所述的嵌入式设备的编译与调试方法,其特征在于:嵌入式程序中的特殊字符为抽象语法树中的非标准的标识符,该特殊字符包括‘@’、‘#’、‘$’、‘%’和‘&’;将特殊字符构造为伪标识符节点,最后再将其识别为关键字;同时,语义分析器在编译时,将特殊字符关键字等同标识为变量或函数的属性关键字,并将紧跟在特殊字符关键字的标识符内容解析为变量或函数属性,避免编译器错误。
5.根据权利要求1所述的嵌入式设备的编译与调试方法,其特征在于:该嵌入式智能编译系统包括IDE编辑和调试环境、编译器、汇编器、链接器、库文件、以及JAVA虚拟机;
对该嵌入式智能编译系统的各模块进行配置:基于IDE编辑和调试环境、编译器、以及JAVA虚拟机,完成基于虚拟机上的程序编译;基于IDE编辑和调试环境、编译器、汇编器与链接器以及库文件,完成程序的静态编译,将程序直接运行在主控制器上。
6.根据权利要求5所述的嵌入式设备的编译与调试方法,其特征在于:所述静态编译采用基于任务静态分配的多核编译调度方法,该多核编译调度方法在任务静态分配的基础上,基于对并行循环的划分定义及负载函数的映射模型,利用编译器获得的评估函数分析循环信息及其负载情况,获得最优的循环函数的迭代分布,以解决编译器静态调度的负载不均衡。
7.根据权利要求6所述的嵌入式设备的编译与调试方法,其特征在于:所述多核编译调度方法包括:
嵌入式程序的并行循环中,令load(IRk)为负载评估函数每个迭代的负载,则为达到负载均衡的最优迭代子集的负载即为循环迭代的负载之和与处理器个数P的商:
Figure FDA0003624211030000041
其中,K为循环迭代总数;
负载通过函数的面积计算时,评估函数的负载均衡问题转换为求解评估函数迭代子集的面积相等来计算,令S为评估函数的总面积,则有:
load(IRp)=S/P;Iinit为静态循环分配的循环变量的初值;
通过负载均衡的计算获得精确的迭代子集划分,即通过评估函数获得负载集合load(IR)迭代子集的划分及其迭代块大小Kp;由循环迭代集合IR、负载集合load(IR)以及通过评估函数建立的映射关系,求得循环函数的迭代划分IR′p如下:
Figure FDA0003624211030000042
Istep为静态循环分配的循环变量的步长;Icinit为静态循环分配的循环变量的每个迭代块的初值;
其中,K′p即为评估函数获得的Kp值,最终依据评估函数模型计算最优的负载均衡,以此完成循环迭代划分,从而保证了循环程序静态编译划分的负载均衡。
CN201910841580.XA 2019-09-06 2019-09-06 一种嵌入式设备的编译与调试方法 Active CN110543425B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201910841580.XA CN110543425B (zh) 2019-09-06 2019-09-06 一种嵌入式设备的编译与调试方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201910841580.XA CN110543425B (zh) 2019-09-06 2019-09-06 一种嵌入式设备的编译与调试方法

Publications (2)

Publication Number Publication Date
CN110543425A CN110543425A (zh) 2019-12-06
CN110543425B true CN110543425B (zh) 2022-06-21

Family

ID=68712815

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201910841580.XA Active CN110543425B (zh) 2019-09-06 2019-09-06 一种嵌入式设备的编译与调试方法

Country Status (1)

Country Link
CN (1) CN110543425B (zh)

Families Citing this family (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN114817028B (zh) * 2022-04-22 2023-04-14 陕西合友网络科技有限公司 一种基于软件开发平台中多目标交叉调试系统

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101196810A (zh) * 2006-12-08 2008-06-11 中颖电子(上海)有限公司 一种嵌入式设备运行方法
CN105843659A (zh) * 2016-03-17 2016-08-10 深圳市金玺智控技术有限公司 一种嵌入式c编译器的实现方法及系统

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
EP3065051A1 (en) * 2015-03-05 2016-09-07 Ingo Josopait Flow control for language-embedded programming in general-purpose computing on graphics processing units

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101196810A (zh) * 2006-12-08 2008-06-11 中颖电子(上海)有限公司 一种嵌入式设备运行方法
CN105843659A (zh) * 2016-03-17 2016-08-10 深圳市金玺智控技术有限公司 一种嵌入式c编译器的实现方法及系统

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
A static scheduling scheme of multicore compiler for loop load imbalance in OpenMP;Benbin Chen;《2014 International Conference on Anti-Counterfeiting, Security and Identification (ASID)》;20141231;第1-4页 *

Also Published As

Publication number Publication date
CN110543425A (zh) 2019-12-06

Similar Documents

Publication Publication Date Title
Ye et al. Scalehls: A new scalable high-level synthesis framework on multi-level intermediate representation
Mendonça et al. DawnCC: automatic annotation for data parallelism and offloading
Leopoldseder et al. Dominance-based duplication simulation (DBDS): code duplication to enable compiler optimizations
Guo et al. Practical and accurate low-level pointer analysis
Shuja et al. Analysis of vector code offloading framework in heterogeneous cloud and edge architectures
Grosse-Kunstleve et al. Automatic Fortran to C++ conversion with FABLE
Novillo Samplepgo-the power of profile guided optimizations without the usability burden
Mathews et al. Automatic code parallelization with openmp task constructs
CN110543425B (zh) 一种嵌入式设备的编译与调试方法
Saà-Garriga et al. OMP2MPI: Automatic MPI code generation from OpenMP programs
Nobre et al. Aspect-driven mixed-precision tuning targeting gpus
Sathyanathan et al. Incremental whole program optimization and compilation
Calvert Parallelisation of java for graphics processors
US20170206068A1 (en) Program optimization based on directives for intermediate code
Bispo et al. Multi-target C code generation from MATLAB
Kim et al. Comparison of LLVM and GCC on the ARM Platform
Prabhu et al. Chunking loops with non-uniform workloads
Aumage et al. Detecting simdization opportunities through static/dynamic dependence analysis
Leviathan et al. Validating software pipelining optimizations
Agathos et al. Adaptive openmp runtime system for embedded multicores
Kumar et al. First steps to compiling Matlab to X10
Kerscher Investigating the HIP programming model with regards to portability and performance portability
Muller et al. Modeling and analyzing evaluation cost of CUDA kernels
Teichgräber Julia: A competitive high-level choice for performance portability in HPC?
Carvalho et al. Framework for the Analysis and Configuration of Real-Time OpenMP Applications

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant