编译构建方法、装置、电子设备和存储介质与流程

文档序号:32348638发布日期:2022-11-26 12:11阅读:54来源:国知局
编译构建方法、装置、电子设备和存储介质与流程

1.本公开涉及编译技术,尤其是一种编译构建方法、装置、电子设备和存储介质。


背景技术:

2.随着处理器技术的飞速发展,多核处理器成为主流技术,通常多核处理器会存在多个核心,类型可以包括同构多核和异构多核。在对多核系统进行仿真验证中,尤其是异构多核系统的仿真验证中,通常需要相关验证工程师针对不同架构的核心开发对应的makefile脚本,来处理异构多核的编译工作,makefile脚本用于定义一系列规则来指定需要先编译的文件、需要后编译的文件以及需要重新编译的文件等,导致编译效率较低,进而导致验证工作效率较低。


技术实现要素:

3.为了解决上述多核系统编译效率较低等技术问题,提出了本公开。本公开的实施例提供了一种编译构建方法、装置、电子设备和存储介质。
4.根据本公开实施例的一个方面,提供了一种编译构建方法,包括:确定编译任务参数信息,所述编译任务参数信息包括至少一个处理器核心对应的编译任务参数;基于所述编译任务参数信息,生成所述处理器核心对应的编译任务规则文件;基于所述处理器核心对应的编译类对象,运行所述编译任务规则文件,生成所述处理器核心对应的中间文件;基于所述处理器核心对应的所述中间文件,生成所述处理器核心对应的目标文件。
5.根据本公开实施例的另一个方面,提供了一种编译构建装置,包括:第一确定模块,用于确定编译任务参数信息,所述编译任务参数信息包括至少一个处理器核心对应的编译任务参数;第一处理模块,用于基于所述编译任务参数信息,生成所述处理器核心对应的编译任务规则文件;第二处理模块,用于基于所述处理器核心对应的编译类对象,运行所述编译任务规则文件,生成所述处理器核心对应的中间文件;第三处理模块,用于基于所述处理器核心对应的所述中间文件,生成所述处理器核心对应的目标文件。
6.根据本公开实施例的再一方面,提供一种计算机可读存储介质,所述存储介质存储有计算机程序,所述计算机程序用于执行本公开上述任一实施例所述的编译构建方法。
7.根据本公开实施例的又一方面,提供一种电子设备,所述电子设备包括:处理器;用于存储所述处理器可执行指令的存储器;所述处理器,用于从所述存储器中读取所述可执行指令,并执行所述指令以实现本公开上述任一实施例所述的编译构建方法。
8.基于本公开上述实施例提供的编译构建方法、装置、电子设备和存储介质,可以针对同构多核或异构多核,自动化生成每个处理器核心对应的用于控制编译的编译任务规则文件,从而实现对多个处理器核心的编译工作,无需相关人员针对各处理器核心开发对应的makefile脚本,大大减少了相关工作量,有效提高编译效率。
9.下面通过附图和实施例,对本公开的技术方案做进一步的详细描述。
附图说明
10.通过结合附图对本公开实施例进行更详细的描述,本公开的上述以及其他目的、特征和优势将变得更加明显。附图用来提供对本公开实施例的进一步理解,并且构成说明书的一部分,与本公开实施例一起用于解释本公开,并不构成对本公开的限制。在附图中,相同的参考标号通常代表相同部件或步骤。
11.图1是本公开提供的编译构建方法的一个示例性的应用场景;
12.图2是本公开一示例性实施例提供的编译构建方法的流程示意图;
13.图3是本公开一个示例性实施例提供的步骤202的流程示意图;
14.图4是本公开一示例性实施例提供的步骤2021的流程示意图;
15.图5是本公开另一示例性实施例提供的步骤2021的流程示意图;
16.图6是本公开一示例性实施例提供的步骤203的流程示意图;
17.图7是本公开一示例性实施例提供的步骤2022的流程示意图;
18.图8是本公开一示例性实施例提供的步骤2024的流程示意图;
19.图9是本公开另一示例性实施例提供的编译构建方法的流程示意图;
20.图10是本公开再一示例性实施例提供的编译构建方法的流程示意图;
21.图11是本公开一示例性实施例提供的编译构建装置的结构示意图;
22.图12是本公开一示例性实施例提供的第一处理模块502的结构示意图;
23.图13是本公开一示例性实施例提供的第一确定单元5021的结构示意图;
24.图14是本公开另一示例性实施例提供的第一确定单元5021的结构示意图;
25.图15是本公开一示例性实施例提供的第二处理模块503的结构示意图;
26.图16是本公开一示例性实施例提供的第二确定单元5022的结构示意图;
27.图17是本公开一示例性实施例提供的第一生成单元5024的结构示意图;
28.图18是本公开一示例性实施例提供的第三处理模块504的结构示意图;
29.图19是本公开另一示例性实施例提供的编译构建装置的结构示意图;
30.图20是本公开一示例性实施例提供的第一确定模块501的结构示意图;
31.图21是公开再一示例性实施例提供的编译构建装置的结构示意图;
32.图22是本公开电子设备一个应用实施例的结构示意图。
具体实施方式
33.下面,将参考附图详细地描述根据本公开的示例实施例。显然,所描述的实施例仅仅是本公开的一部分实施例,而不是本公开的全部实施例,应理解,本公开不受这里描述的示例实施例的限制。
34.应注意到:除非另外具体说明,否则在这些实施例中阐述的部件和步骤的相对布置、数字表达式和数值不限制本公开的范围。
35.本领域技术人员可以理解,本公开实施例中的“第一”、“第二”等术语仅用于区别不同步骤、设备或模块等,既不代表任何特定技术含义,也不表示它们之间的必然逻辑顺序。
36.还应理解,在本公开实施例中,“多个”可以指两个或两个以上,“至少一个”可以指一个、两个或两个以上。
37.还应理解,对于本公开实施例中提及的任一部件、数据或结构,在没有明确限定或者在前后文给出相反启示的情况下,一般可以理解为一个或多个。
38.另外,本公开中术语“和/或”,仅仅是一种描述关联对象的关联关系,表示可以存在三种关系,例如,a和/或b,可以表示:单独存在a,同时存在a和b,单独存在b这三种情况。另外,本公开中字符“/”,一般表示前后关联对象是一种“或”的关系。
39.还应理解,本公开对各个实施例的描述着重强调各个实施例之间的不同之处,其相同或相似之处可以相互参考,为了简洁,不再一一赘述。
40.同时,应当明白,为了便于描述,附图中所示出的各个部分的尺寸并不是按照实际的比例关系绘制的。
41.以下对至少一个示例性实施例的描述实际上仅仅是说明性的,决不作为对本公开及其应用或使用的任何限制。
42.对于相关领域普通技术人员已知的技术、方法和设备可能不作详细讨论,但在适当情况下,所述技术、方法和设备应当被视为说明书的一部分。
43.应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步讨论。
44.本公开实施例可以应用于终端设备、计算机系统、服务器等电子设备,其可与众多其它通用或专用计算系统环境或配置一起操作。适于与终端设备、计算机系统、服务器等电子设备一起使用的众所周知的终端设备、计算系统、环境和/或配置的例子包括但不限于:个人计算机系统、服务器计算机系统、瘦客户机、厚客户机、手持或膝上设备、基于微处理器的系统、机顶盒、可编程消费电子产品、网络个人电脑、小型计算机系统﹑大型计算机系统和包括上述任何系统的分布式云计算技术环境,等等。
45.终端设备、计算机系统、服务器等电子设备可以在由计算机系统执行的计算机系统可执行指令(诸如程序模块)的一般语境下描述。通常,程序模块可以包括例程、程序、目标程序、组件、逻辑、数据结构等等,它们执行特定的任务或者实现特定的抽象数据类型。计算机系统/服务器可以在分布式云计算环境中实施,分布式云计算环境中,任务是由通过通信网络链接的远程处理设备执行的。在分布式云计算环境中,程序模块可以位于包括存储设备的本地或远程计算系统存储介质上。
46.本公开概述
47.在实现本公开的过程中,发明人发现,在对多核系统进行仿真验证中,尤其是异构多核系统的仿真验证中,通常需要相关验证工程师针对不同架构的核心开发对应的makefile脚本,来处理异构多核的编译工作,makefile脚本用于定义一系列规则来指定需要先编译的文件、需要后编译的文件,以及需要重新编译的文件等,且多套makefile调用逻辑非常繁琐,导致编译效率较低,进而导致验证工作效率较低。
48.示例性概述
49.图1是本公开提供的编译构建方法的一个示例性的应用场景。
50.在芯片验证场景中,针对芯片的多核系统,利用本公开提供的编译构建方法,用户可以通过终端或任意其他方式向执行该方法的编译构建装置输入编译任务命令列表,编译任务命令列表包括了至少一个处理器核心对应的编译任务参数,该装置则可以基于编译任务命令列表确定编译任务参数信息,进而基于编译任务参数信息生成处理器核心对应的编
译任务规则文件,编译任务规则文件与makefile类似,是定义一系列规则来指定需要先编译的文件、需要后编译的文件以及需要重新编译的文件等的脚本,编译任务规则文件可以是任意可实施的脚本文件,比如,可以采用任意的组织编译工具库与模板工具库生成的编译任务规则脚本文件,用来控制编译流程。例如,对于一些自动化构建工具,本公开可以用来替代make实现复杂的类makefile,从而生成编译任务规则文件。在生成了处理器核心对应的编译任务规则文件后,则基于处理器核心对应的编译类对象运行该编译任务规则文件,生成该处理器核心对应的中间文件,进而基于该中间文件生成该处理器核心对应的目标文件,目标文件是对中间文件进行链接操作、反编译操作、文件分析操作等获得的可执行文件(.so)、反汇编文件(.as)、二进制代码文件(.bin)、十六进制代码文件(.hex)中的至少一种。目标文件则可以用于芯片验证中,图中以一种示例性的多核系统的验证为例,其中,每个处理器核心簇对应一种核心架构,每个处理器核心簇可以包括该种架构的多个处理器核心。针对多核系统,本公开基于面向对象的方式实现各处理器核心的编译任务的相互独立处理与资源隔离,针对每个处理器核心都可以按照上述过程,生成各处理器核心分别对应的编译任务规则文件、中间文件及目标文件,从而实现了多核系统编译任务的自动化构建及编译,有效提高编译效率,进而提高验证工作效率。在实际应用中,多核系统还可以包括其他子系统,比如视觉子系统、消息网络,等等,本公开不做限定。
51.本公开提供的编译构建方法不仅仅适用于任意的芯片验证场景,在其他任何需要进行编译的场景都可以基于本公开的编译构建方法实现编译任务的自动化构建进而进行编译,具体应用场景可以根据实际需求设置,本公开不做限定。
52.示例性方法
53.图2是本公开一示例性实施例提供的编译构建方法的流程示意图。本实施例可应用在电子设备上,具体比如服务器和终端,如图2所示,包括如下步骤:
54.步骤201,确定编译任务参数信息,编译任务参数信息包括至少一个处理器核心对应的编译任务参数。
55.其中,编译任务参数信息可以包括工程文件信息(比如工程文件标识、位置)、编译任务的位置(即位于哪个目录下,工作目录)、编译主函数位置、编译的处理器核心信息(比如处理器核心架构、编号、类型等)及其他相关的描述信息,比如还可以包括仿真代码用例信息(比如仿真代码用例名称),具体可以根据实际需求设置。其中,工程文件是描述待构建的多核系统或子系统的目标架构平台的工程信息的文件,比如可以是基于另一种标记语言(yaml ain't markup language,简称:yaml)的文件,包括宏信息、静态库信息、头文件信息、启动汇编函数信息等,工程文件需要用户根据自己的实际需求准备,具体不做限定。编译任务参数信息可以包括一个或多个处理器核心对应的编译任务参数,对于包括多个处理器核心对应的编译任务参数的情况,该多个处理器核心可以是同构的也可以是异构的,具体不做限定。
56.编译任务参数信息可以是用户根据自己实际需求预先准备,并在需要进行编译构建时通过一定方式提交到本公开的编译构建装置,该编译构建装置则可以根据用户提交的内容确定编译任务参数信息。用户的具体提交方式不做限定,比如,可以通过编译任务命令列表传入到该编译构建装置。
57.步骤202,基于编译任务参数信息,生成处理器核心对应的编译任务规则文件。
58.其中,编译任务规则文件与makefile类似,是定义一系列规则来指定哪些文件需要先编译、哪些文件需要后编译以及哪些文件需要重新编译等的脚本,编译任务规则文件可以是任意可实施的脚本文件,比如,可以采用基于任意语言的组织编译工具库与模板工具库生成的编译任务规则脚本文件,用来控制编译流程。例如,对于一些自动化构建工具,本公开用来替代make实现复杂的类makefile,从而自动生成编译任务规则文件。
59.示例性的,可以基于面向对象的工厂模式,预先创建用于生成各种类型的处理器核心分别对应的编译任务规则文件的类,在实际进行编译构建时,根据各处理器核心分别对应的编译任务参数实例化各处理器核心分别对应的对象,每个处理器核心都可以实例化自己对应的对象,基于各处理器核心分别对应的对象相互独立地生成各处理器核心分别对应的编译任务规则文件,从而将各处理器核心的编译任务实现相互独立的处理与资源隔离。
60.步骤203,基于处理器核心对应的编译类对象,运行编译任务规则文件,生成处理器核心对应的中间文件。
61.其中,编译类对象也是根据各处理器核心分别对应的编译任务参数对预先创建的编译类进行实例化的对象,每个处理器核心的编译任务可以对应一个独立的编译类对象,实现各处理器核心的相互独立处理和资源隔离。基于编译类对象运行编译任务规则文件可以是通过编译类对象访问其中的成员函数,比如首先执行自动化构建工具函数,运行编译任务规则文件,生成对应的中间文件。一个处理器核心的编译任务对应一个工程,可以包括一个或多个源文件,源文件即指待编译的源语言程序文件,在运行编译任务规则文件后,每个源文件可以对应生成一个中间文件。比如运行编译任务规则文件生成中间文件,该中间文件是二进制代码文件(.o),在不同的构建工具下表示方式可能不同,本公开不做限定。
62.步骤204,基于处理器核心对应的中间文件,生成处理器核心对应的目标文件。
63.其中,目标文件可以是可执行文件(.so)、反汇编文件(.as)、二进制代码文件(.bin)、十六进制代码文件(.hex)中的至少一种,由于中间文件是包括每个源文件分别对应的中间文件,在生成了中间文件之后,还需要对中间文件进行链接操作、反编译操作、文件分析操作等,以获得对应的可执行文件、反汇编文件、二进制代码文件、十六进制代码文件,具体编译过程原理在此不再赘述。
64.本实施例提供的编译构建方法,可以针对同构多核或异构多核,自动化生成每个处理器核心对应的用于控制编译的编译任务规则文件,进而基于各处理器核心分别对应的编译任务规则文件生成分别对应的中间文件,再基于中间文件生成对应的目标文件,从而实现对多个处理器核心的编译工作,无需相关人员针对各处理器核心开发对应的makefile脚本,大大减少了相关工作量,有效提高编译效率。
65.在一个可选示例中,图3是本公开一个示例性实施例提供的步骤202的流程示意图,在本示例中,步骤202具体可以包括以下步骤:
66.步骤2021,基于编译任务参数信息,确定处理器核心对应的配置工厂类对象。
67.其中,配置工厂类对象是基于编译任务参数信息对预先建立的配置工厂类实例化确定的对象,每种类型的处理器核心可以具有至少一个对应的配置工厂类,该配置工厂类可以是配置基类(configure base类)的衍生子类,该配置工厂类中包含了处理对应类型的处理器核心配置文件、工程文件、以及编译任务参数的所有成员,包括成员函数、成员变量
等,配置工厂类对编译任务参数、配置文件、工程文件执行反序列化,其中,配置基类的构造函数根据编译任务参数所描述的处理器核心类型对成员类以工厂模式进行实例化,生成对应的配置工厂类对象。处理器核心配置文件是用于描述该处理器核心交叉工具链信息的文件,比如yaml文件,交叉编译是在a机器上编译生成,运行在b机器上,两个机器可以有不同的机器指令,工具链则一般由编译器、链接器、解释器、调试器等组成。比如,在嵌入式开发过程中有宿主机和目标机的角色之分,宿主机是执行编译、链接嵌入式软件的计算机,目标机是运行嵌入式软件的硬件平台。因此,工具链信息包括编译器、汇编器、链接器、反汇编工具、代码转换工具等工具的名称,以及相关参数描述(比如编译参数、链接脚本文件等的描述)。编译器是将一种语言翻译为另一种语言的程序或工具,比如将高级语言翻译为低级语言。链接器是将一个或多个由编译器或汇编器生成的中间文件外加库链接为可执行文件。中间文件是包括机器码和链接器可用信息的程序。链接脚本是程序链接时的参考文件,主要目的是描述如何把输入文件中的段(section)映射到输出文件中,并控制输出文件的存储布局。交叉编译工具链的各工具的具体功能原理在此不再赘述。
68.工厂模式是一种在面向对象语言实现的设计模式,属于创建型模式,提供了一种创建对象的最佳模式,在工厂模式中,在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象,通常在工厂模式中定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,基于此,实现不同处理器核心的编译构建可以实例化不同的工厂类对象,从而实现不同处理器核心的编译任务之间相互独立及资源隔离。具体工厂模式的原理在此不再赘述。
69.步骤2022,基于配置工厂类对象,确定处理器核心对应的参数配置类对象。
70.其中,参数配置类对象是基于配置工厂类对象调用其成员函数执行参数解析过程,获得该处理器核心对应的工具链信息、工程目录信息、源文件信息等参数,并将获取到的工具链信息、工程目录信息、源文件信息等参数进行封装获得。也即一个处理器核心对应的参数配置类对象中封装有该处理器核心对应的工具链信息、工程目录信息、源文件信息等参数,用于后续的编译准备阶段生成编译任务规则文件。其中,工具链信息可以是读取处理器核心配置文件获得、工程目录信息及源文件信息可以是读取工程文件获得。
71.步骤2023,基于编译任务参数信息,确定处理器核心对应的生成工厂类对象。
72.其中,生成工厂类对象是基于编译任务参数信息对生成工厂类实例化的对象,与配置工厂类类似,每种类型的处理器核心可以具有一个对应的生成工厂类,该生成工厂类可以是生成基类(generator base类)的衍生子类,生成工厂类中包含了根据参数配置类对象中封装的配置参数生成对应处理器核心工程目录及对应的编译任务规则文件(比如一种自动化构建工具下的脚本文件)的所有成员函数。生成基类的成员构造函数根据对应的编译任务参数中所描述的处理器核心的类型对其成员类以工厂模式进行实例化,得到生成工厂类对象。
73.步骤2022和步骤2023可以不分先后顺序。
74.步骤2024,基于生成工厂类对象及参数配置类对象,生成处理器核心对应的编译任务规则文件。
75.由于生成工厂类中包含了根据参数配置类对象中封装的配置参数生成对应处理器核心工程目录及对应的编译任务规则文件(比如一种自动化构建工具下的脚本文件)的
所有成员函数,因此,在确定了生成工厂类对象后,可基于生成工厂类对象访问其成员,实现处理器核心对应的工程目录的创建,以及在工程目录下生成对应的编译任务规则文件。
76.示例性的,基于生成工厂类对象访问其生成工程目录的成员函数,通过执行该成员函数可以根据参数配置类对象中封装的工程目录信息创建处理器核心对应的工程目录,进而基于处理器核心对应的工程目录信息和源文件信息在该工程目录下创建对应源文件的符号链接,进而根据参数配置类对象封装的配置参数及模板文件在该工程目录下生成对应的编译任务规则文件。比如,模板文件是基于任意可实施的模板引擎规则的模板生成文件,实现执行内容和规则的分离,通过模板引擎将参数配置类对象封装的配置参数对模板文件进行填充,生成对应的编译任务规则文件。
77.本公开基于面向对象的工厂模式,实现了处理器核心的编译任务对应的编译任务规则文件的自动化生成,且实现了多个处理器核心的编译任务的相互独立的处理及资源隔离,不同处理器核心的编译任务相互不会影响,有效解决了现有技术多核系统编译任务中多套makefile调用逻辑非常繁琐的问题,进一步提高编译效率,并且本公开的面向对象的工厂模式使得编译构建具有更好的可扩展性,当用户想要对新类型的处理器核心进行编译构建时,可以方便地通过各工厂基类衍生对应新类型处理器核心的工厂类即可实现对新类型处理器核心编译任务的支持,大大方便了相关人员工作,提高工作效率。
78.在一个可选示例中,图4是本公开一示例性实施例提供的步骤2021的流程示意图。在本示例中,步骤2021的基于编译任务参数信息,确定处理器核心对应的配置工厂类对象,包括:
79.步骤20211a,基于编译任务参数信息,确定处理器核心对应的类型。
80.其中,处理器核心对应的类型是指处理器核心构架(或架构)类型,多核系统中若所有处理器核心具有相同的构架则称为同构多核,若多个处理器核心构架不同,则称为异构多核。编译任务参数信息中包括至少一个处理器核心对应的编译任务参数,一个处理器核心对应的编译任务参数中包括了该处理器核心的类型及编号,以及其他相关信息,因此可以基于编译任务参数信息确定各处理器核心分别对应的类型,还可以确定各处理器核心分别对应的编号及其他相关信息。
81.步骤20212a,基于处理器核心对应的类型,确定处理器核心对应的配置工厂类对象。
82.对于异构多核来说,由于处理器核心类型不同,因此通过处理器核心的类型即可确定处理器核心对应的各种工厂类对象,比如配置工厂类对象、生成工厂类对象、编译工厂类对象,等。当然也可以结合类型和编号来确定对应的配置工厂类对象、生成工厂类对象、编译工厂类对象,具体可以根据实际需求设置。比如,对于分别属于类型a和类型b的两个处理器核心的编译任务,预先创建有类型a对应的至少一套工厂类a(配置工厂类a、生成工厂类a、编译工厂类a,等)来支持类型a的编译构建,还创建有类型b对应的至少一套工厂类b来支持类型b的编译构建,则在需要编译构建时,对于类型a的处理器核心编译任务,可以根据其对应的类型a从至少一套工厂类a中默认选择一套进行实例化,也可以结合类型a及用户指定的编号确定一套工厂类a进行实例化,确定出对应的工厂类对象,类型b与类型a同理,在此不再赘述。
83.在一个可选示例中,图5是本公开另一示例性实施例提供的步骤2021的流程示意
图。在本示例中,步骤2021的基于编译任务参数信息,确定处理器核心对应的配置工厂类对象,包括:
84.步骤20211b,基于编译任务参数信息,确定处理器核心对应的类型和编号。
85.步骤20212b,基于处理器核心对应的类型和编号,确定处理器核心对应的配置工厂类对象。
86.对于同构多核来说,多套工厂类可以是相同的,因此可以结合类型和编号来确定实例化哪个工厂类以确定对应的工厂类对象。比如,创建了8个支持同一类型处理器核心(比如类型c)的配置工厂类c及对应的8个生成工厂类c和8个编译工厂类c等,也即每个处理器核心的编译任务会有一套工厂类(包括配置工厂类、生成工厂类、编译工厂类等)支持实现。8套工厂类c通过编号(比如1-8)区分,用户在需要进行编译构建时,对于该类型c的处理器核心的编译任务,可以通过编号来选择实例化哪套工厂类c来实现该处理器核心的编译构建。比如用户可以选择编号2,当有多个该类型c的处理器核心的编译任务时,可以分别为每个处理器核心确定一个编号。具体可以根据实际需求设置。
87.在一个可选示例中,对于同一套工厂类,还可以根据实际需求细分不同的处理方式,以满足用户对同一处理器核心的不同编译需求,具体细分可以根据实际需求设置,本公开不做限定。比如对于同一套工厂类,可以通过不同的成员函数实现生成不同的编译任务规则文件,进而生成不同的目标文件。通过更细粒度的处理方式的实现,可以有效提高用户体验。
88.在一个可选示例中,图6是本公开一示例性实施例提供的步骤203的流程示意图。在本示例中,步骤203的基于处理器核心对应的编译类对象,运行编译任务规则文件,生成处理器核心对应的中间文件,包括:
89.步骤2031,基于处理器核心对应的类型和编号,确定处理器核心对应的编译工厂类对象。
90.其中,编译工厂类对象是基于工厂模式实例化的编译类对象,与配置工厂类对象类似,每种类型的处理器核心可以创建有至少一个对应的编译工厂类,该编译工厂类可以是编译基类(compiler base类)的衍生子类,编译工厂类中包含了描述对应类型处理器核心编译构建行为的所有成员函数,编译基类的成员构造函数根据编译任务参数所描述的处理器核心类型和编号对成员类以工厂模式进行实例化,确定该处理器核心对应的编译工厂类对象。
91.步骤2032,基于处理器核心对应的编译工厂类对象,运行编译任务规则文件,生成处理器核心对应的中间文件。
92.示例性的,基于处理器核心对应的编译工厂类对象,首先执行工具函数,运行编译任务规则文件,生成对应的中间文件。
93.本公开基于工厂模式实例化的编译工厂类对象运行编译任务规则文件生成对应的中间文件,实现编译阶段各处理器核心编译任务的相互独立处理及资源隔离。
94.在一个可选示例中,图7是本公开一示例性实施例提供的步骤2022的流程示意图。在本示例中,步骤2022的基于配置工厂类对象,确定处理器核心对应的参数配置类对象,包括:
95.步骤20221,基于配置工厂类对象,获取处理器核心对应的工具链信息、工程目录
信息及源文件信息。
96.其中,处理器核心对应的工具链信息包括编译器、汇编器、连接器、反汇编工具、代码转换工具等工具的名称及相关参数描述,比如编译参数、链接脚本文件等的描述。工程目录信息包括为执行编译任务需要在用例仿真目标下创建的工程目录相关信息。源文件信息即待编译的源程序文件相关信息,比如包括源文件名称、位置等信息。其中,工具链信息可以通过配置工厂类对象读取处理器核心对应的配置文件获得,配置文件是用于描述该处理器核心交叉工具链信息的文件,比如可以是yaml的配置文件,配置文件是预先针对处理器核心准备好的,不同类型的处理器核心对应不同的配置文件。yaml是"yaml ain't a markup language"(yaml不是一种标记语言)的递归缩写。在开发的这种语言时,yaml的意思其实是:"yet another markup language"(仍是一种标记语言)。yaml的语法和其他高级语言类似,并且可以简单表达清单、散列表,标量等数据形态。它使用空白符号缩进和大量依赖外观的特色,特别适合用来表达或编辑数据结构、各种配置文件、倾印调试内容、文件大纲(例如:许多电子邮件标题格式和yaml非常接近)。yaml的配置文件后缀为.yml,比如runoob.yml。具体根据实际需求设置。工程目录信息和源文件信息可以通过配置工厂类对象读取工程文件获得。工程文件是描述待构建的多核系统或子系统的目标架构平台的工程信息的文件,比如可以是yaml的工程文件。工程文件中包括宏信息、静态库信息、头文件信息、启动汇编函数信息等,工程文件需要用户根据自己的编译构建工程实际需求准备。
97.步骤20222,将处理器核心对应的工具链信息、工程目录信息及源文件信息进行封装,获得处理器核心对应的参数配置类对象。
98.具体的,将处理器核心对应的工具链信息、工程目录信息及源文件信息封装成参数配置类对象,便于后续流程的调用,用于生成编译任务规则文件。
99.在一个可选示例中,图8是本公开一示例性实施例提供的步骤2024的流程示意图。在本示例中,步骤2024的基于生成工厂类对象及参数配置类对象,生成处理器核心对应的编译任务规则文件,包括:
100.步骤20241,基于生成工厂类对象,创建处理器核心对应的工程目录。
101.其中,生成工厂类对象调用其用于创建工程目录的成员函数按照处理器核心类型和编号为该处理器核心的编译任务在执行编译的目录下添加构建独立的工程目录。比如在验证场景下,则在用例仿真目录下添加构建独立的工程目录。
102.示例性的,创建工程目录的代码如下:
103.[lisan@login03 hvbs]$cd ri5cy_0
[0104]
bootfiles dir3 obj sconscript.ri5cy_0tc.c
[0105]
步骤20242,基于处理器核心对应的工程目录信息和源文件信息,在工程目录下创建处理器核心对应的源文件的符号链接。
[0106]
其中,符号链接是一种软链接,是一类特殊的文件,其包含有一条以绝对路径或者相对路径的形式指向其它文件或者目录的引用,符号链接的操作是透明的,对符号链接文件进行读写的程序会表现为直接对符号链接文件对应的目的文件(本公开中即为源文件)进行操作。某些需要特别处理符号链接的程序(如备份程序)可能会识别并直接对其进行操作,一个符号链接文件仅包含有一个文本字符串,其被操作系统解释为一条指向另一个文件(目的文件)或者目录的路径。它是一个独立文件,其存在并不依赖于目的文件。如果删除
一个符号链接,它指向的目的文件不受影响。如果目的文件被移动、重命名或者删除,任何指向它的符号链接仍然存在,但是它们将会指向一个不复存在的文件。具体符号链接的创建原理不再赘述。
[0107]
步骤20243,根据参数配置类对象、及对应的模板文件,在工程目录下生成处理器核心对应的编译任务规则文件。
[0108]
其中,模板文件是是基于任意可实施的模板引擎规则的模板生成文件,实现执行内容和规则的分离,本公开中即是用于生成编译任务规则文件的模板,是预先针对不同处理器核心的编译任务规则文件的生成过程进行自动化,将需要根据不同处理器核心变化的内容进行参数化,从而实现通过参数与模板结合实现不同处理器核心的编译任务规则文件的自动生成。其中,参数即通过参数配置类对象提供,按照预设填充规则对模板文件进行参数填充处理,即可生成对应的编译任务规则文件。具体可以通过模板引擎将参数配置类对象封装的配置参数对模板文件进行填充。模板引擎是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档。
[0109]
示例性的,在工程目录下创建源文件的符号链接后,启动模板引擎,按照参数配置类对象中封装的参数,在工程目录下生成各源文件对应的编译任务规则文件。
[0110]
本公开基于参数配置类对象与模板文件结合,有效实现编译任务规则文件的自动化生成,大大降低相关工作人员的开发工作量,进一步提高编译效率。
[0111]
图9是本公开另一示例性实施例提供的编译构建方法的流程示意图。
[0112]
在一个可选示例中,在本示例中,步骤204的基于处理器核心对应的中间文件,生成处理器核心对应的目标文件,包括:
[0113]
步骤2041,对中间文件进行链接操作,获得处理器核心对应的可执行文件。
[0114]
具体的,可以通过编译类对象或编译工厂类对象调用编译工具链中的链接器对中间文件进行链接操作,获得对应的可执行文件,具体链接操作的原理不再赘述。
[0115]
步骤2042,对可执行文件进行反编译操作,获得对应的反汇编文件。
[0116]
具体的,可以通过编译类对象或编译工厂类对象调用编译工具链中的反汇编工具对可执行文件进行反编译操作,获得对应的反汇编文件,具体原理不再赘述。
[0117]
步骤2043,对可执行文件进行文件分析操作,获得对应的二进制代码文件和/或十六进制代码文件。
[0118]
具体的,可以通过编译类对象或编译工厂类对象调用编译工具链中的文件分析工具对可执行文件进行文件分析操作,获得对应的二进制代码文件和/或十六进制代码文件,具体原理不再赘述。
[0119]
步骤2044,将可执行文件、反汇编文件、二进制代码文件和十六进制代码文件中的至少一种作为目标文件。
[0120]
示例性的,可以将可执行文件、反汇编文件、二进制代码文件和十六进制代码文件作为目标文件,具体可以根据实际需求设置。
[0121]
在一个可选示例中,为了本公开编译构建方法的实现,在具体的应用场景中,在步骤201之前还需要按照自动化构建工具的要求在执行编译的目录(比如仿真工具目录)下创建本公开的编译构建装置的编译任务规则文件的符号链接,以便于执行异步路径编译组织工作,实现多核异构系统的各处理器核心的编译任务之间的相互独立处理和资源隔离。对
于不同的自动化构建工具,生成的编译任务规则文件可以包括一级或多级规则文件,具体不做限定。
[0122]
在一个可选示例中,本公开的方法还包括:
[0123]
步骤301,接收用户的工厂类注册请求,工厂类注册请求包括用户待添加的用于支持新类型的处理器核心的编译构建的各工厂类信息。
[0124]
当用户需要增加对新类型的处理器核心的编译构建的支持时,可以按照上述内容中需要针对该新类型的处理器核心的需求预先准备的内容准备好各相关的文件或数据,比如创建该新类型对应的一套工厂类(配置工厂类、生成工厂类、编译工厂类),该套工厂类可以通过相应的基类衍生获得,因此,用户的开发工作相对较少,再比如准备该新类型对应的配置文件,用于描述该新类型对应的交叉编译工具链的相关信息,该新类型对应的模板文件,等等,具体可以根据实际需求设置。当用户准备好后可以通过终端或其他方式将该新类型的支持内容进行注册,以实现编译构建装置对该新类型处理器核心的编译任务的支持。工厂类注册请求即可包括上述需要用户准备的内容,不限于工厂类信息,具体可以根据实际需求设置。
[0125]
步骤302,响应于工厂类注册请求,将用户的各工厂类信息进行注册。
[0126]
在接收到用户的工厂类注册请求后,则可以响应用户的请求,将用户的各工厂类信息进行注册,比如将配置工厂类、生成工厂类、编译工厂类分别添加到相应的位置,将配置文件存储到对应的位置,以使后续应用中能够实现如上述处理流程的功能。具体的注册操作可以根据实际需求设置,本公开不做限定。
[0127]
本公开通过为用户提供新类型注册功能,实现了编译构建的可扩展性,进一步方便开发人员工作,进一步提高工作效率。
[0128]
在一个可选示例中,步骤201的确定编译任务参数信息,包括:
[0129]
步骤2011,获取字符串形式的编译任务参数列表。
[0130]
具体的,用户准备的编译任务参数列表可以是字典数据结构,以处理器核心为单位,以字典形式构建,比如以任意自动化构建工具的字典形式构建,每个指定处理器核心的编译任务参数封装成一个独立的字典数据结构,通过自动化构建工具脚本的命令行参数形式输入到编译构建装置,在以命令行参数形式输入时,字典数据结构是以字符串形式传入到编译构建装置,多个核心编译任务的字典数据结构各自独立,编译构建装置获取到的即为字符串形式的编译任务参数列表。
[0131]
可选地,编译构建装置获取到编译任务参数列表后,需要按照自动化构建工具的要求在仿真工具目录下创建编译任务规则文件的符号链接以便于后续执行异步路径编译构建工作。
[0132]
步骤2012,对编译任务参数列表进行反序列化,获得至少一个处理器核心对应的字典数据结构,作为编译任务参数信息。
[0133]
其中,反序列化即将字符串形式的编译任务参数列表重新变成字典数据结构。
[0134]
示例性的,当编译构建装置接收到外部传入的字符串形式的编译任务参数列表后,将首先启动字符串信息的反序列化,将字符串形式的编译任务参数列表重新变成字典数据结构,多个编译任务(每个处理器核心对应一个编译任务)将以列表形式存在,列表成员即为描述每个处理器核心编译任务参数的字典数据结构。编译构建装置则依次从列表中
提取各字典,分别进入后续的处理流程。每个编译任务都对应独立的对象,以此实现不同编译任务工作环境的资源隔离。
[0135]
本公开上述任一实施例或可选示例可以单独实施,也可以在不冲突的情况下以任意方式结合实施,本公开不做限定。
[0136]
在一个可选示例中,图10是本公开再一示例性实施例提供的编译构建方法的流程示意图,本示例中,以验证场景的仿真用例为例,执行本公开编译构建方法的编译构建装置简称为hvbs(horizon verification build system),该编译构建方法具体包括:
[0137]
1、准备hvbs编译任务参数列表。
[0138]
2、在仿真用例目录下创建hvbs的编译任务规则文件的符号链接。
[0139]
3、向hvbs传入字符串形式的编译任务参数列表。
[0140]
4、hvbs对字符串形式的编译任务参数列表执行反序列化。
[0141]
5、从一组编译任务参数中获取处理器核心信息。
[0142]
其中,处理器核心信息可以根据实际需求设置为类型,或者类型和编号。一组编译任务参数是指一个编译任务对应的参数,也即一个处理器核心对应的参数。
[0143]
6、根据处理器核心信息确定配置工厂类对象。
[0144]
7、基于配置工厂类对象读取配置文件获得编译工具链信息。
[0145]
示例性的,配置文件按照yaml语言格式构成。hvbs使用基于yaml格式的config(配置)文件定义特定处理器架构的编译相关配置,其中利用yaml的锚点和别名功能实现信息的继承。config文件中,以标签(tags)节点作为组织编译参数组的基本单元,标签节点可以包含工具链,调用库目录,宏定义,编译参数,链接脚本,汇编启动文件等信息。在config文件中默认具有base(无需定义)标签,支持用户添加新的标签容器,新定义的标签可以通过继承方式获得config表格中定义的任意一级节点容器的信息。配置文件为半固定配置,用于添加新的处理器架构或对扩充现有架构的编译信息,所有配置文件可以位于hvbs/config目录下,具体可以根据实际需求设置。
[0146]
8、基于配置工厂类对象读取工程文件获得工程目录信息及源文件信息。
[0147]
示例性的,工程文件按照yaml语言格式构成,工程文件为用户自行定义工程信息的yaml配置表格,用户可在该工程文件中定义源文件、头函数文件、汇编启动函数、静态库、宏定义等相关信息。工程文件可以通过命令行传参的方式传入到hvbs中。同样地用户可以在工程文件使用yaml格式的锚点特性,对部分配置实现信息继承。
[0148]
9、基于配置工厂类对象将获得的编译工具链信息、工程目录信息及源文件信息封装成参数配置类对象。
[0149]
10、是否存在其他编译任务。若是则返回步骤5,继续下一编译任务的处理,直至完成编译任务参数列表中的所有编译任务,若否则继续步骤11。
[0150]
11、根据处理器核心信息确定生成工厂类对象。
[0151]
其中,针对每个编译任务,根据该编译任务的处理器核心信息来确定对应的生成工厂类对象。
[0152]
12、基于生成工厂类对象以“处理器核心架构_编号”为名创建工程目录。
[0153]
13、基于生成工厂类对象根据源文件信息和工程目录信息在工程目录下创建源文件的符号链接。
[0154]
14、基于生成工厂类对象根据参数配置类对象封装的配置参数在工程目录下启动模板引擎生成编译任务规则文件。
[0155]
15、是否存在其他编译任务。若是则返回步骤11继续处理下一编译任务;若否则继续步骤16。
[0156]
16、根据处理器核心信息确定编译工厂类对象。
[0157]
该步骤同样是针对每个编译任务的处理器核心信息来确定编译工厂类对象。
[0158]
17、基于编译工厂类对象在对应工程目录启动对应的编译任务规则文件,生成对应的中间文件。
[0159]
18、基于编译工厂类对象执行链接操作生成对应的可执行文件。
[0160]
19、基于编译工厂类对象调用反汇编工具生成反汇编文件。
[0161]
20、基于编译工厂类对象调用文件分析工具生成对应的二进制文件或十六进制文件。
[0162]
21、是否存在其他编译任务。若是则返回步骤16继续下一编译任务,若否则继续步骤22。
[0163]
22、结束hvbs。
[0164]
上述步骤1-22各步骤的具体操作参见前述内容,在此不再一一赘述。
[0165]
可选地,上述步骤的工作流程可归结为三个阶段,包括参数解析阶段、编译准备阶段和编译操作阶段。参数解析阶段可以包括上述步骤5-9的处理阶段,编译准备阶段可以包括上述步骤11-14的处理阶段,编译操作阶段可以包括步骤16-20的处理阶段。对于多核系统的多个编译任务,每个阶段需要处理完所有编译任务再进入下一阶段,具体可以根据实际需求设置。
[0166]
本公开的hvbs支持仿真过程中多架构多核的联合编译,每一组传递到hvbs的param参数字典字符串代表一个核心(即处理器核心)的编译任务,每个编译任务的配置工厂类、生成工厂类以及编译工厂类都是独立的对象,从而实现编译任务流程及资源的隔离,同时,由于每个编译任务都可以独立指定工程文件针对不同的源文件进行编译构建,在编译结果的处理上,每个核心的编译任务各自位于独立的工程文件夹中,因此,hvbs可以适应异构多核、同构多核、amp(非对称多进程)、smp(对称多进程)等多种编译任务的需求。
[0167]
本公开的hvbs基于面向对象的继承模式,其中所使用的各种类基于面向对象的工厂模式构建,每种类都可以根据不同的架构衍生出不同的工作子类,从而可以针对不同的架构定义独立的编译处理流程。每种类都可以定义一种基类,以编译类为例,存在基础类compiler base(编译基类),在类中生命类的静态成员_pool,在类的构造函数中,通过初次构建将子类(比如编译工厂类)原型存放在父类(编译基类)的静态成员列表中,并可以通过处理器核心的相关信息(架构、类型、编号等)确定出对应的正确子类对象,若无法通过处理器核心的相关信息确定子类对象,则可以默认使用父类构造对象,具体可以根据实际需求设置。基于此,用户可以利用类的继承特性,在各模块注册或添加自己相应的处理器核心类型对应的类,并改写相应的构造函数即可,函数名称除已调用的函数外,其余可自行重命名、重定义流程。新扩展类的初次实例化,可以由hvbs在调用时自动完成,用户需要注意新定义类要遵循已存在子类的名称规范。
[0168]
示例性的,本公开的hvbs的整体软件方案可以是基于任意可实施的语言实现,比
如,可以基于任意语言的自动化构建工具二次开发,并使用任意可实施的模板引擎自动化生成具体的编译任务规则文件,工程文件、配置文件等配置表格采用yaml表格,本公开的hvbs构建工具不依赖具体的操作系统,具体可以根据实际需求设置,比如,可以是基于linux系统开发,也可以是基于windows系统开发,具体不做限定。
[0169]
本公开实施例提供的任一种编译构建方法可以由任意适当的具有数据处理能力的设备执行,包括但不限于:终端设备和服务器等。或者,本公开实施例提供的任一种编译构建方法可以由处理器执行,如处理器通过调用存储器存储的相应指令来执行本公开实施例提及的任一种编译构建方法。下文不再赘述。
[0170]
示例性装置
[0171]
图11是本公开一示例性实施例提供的编译构建装置的结构示意图。该实施例的装置可用于实现本公开相应的方法实施例,如图11所示的装置包括:第一确定模块501、第一处理模块502、第二处理模块503和第三处理模块504。
[0172]
第一确定模块501,用于确定编译任务参数信息,编译任务参数信息包括至少一个处理器核心对应的编译任务参数;第一处理模块502,用于基于第一确定模块501确定的编译任务参数信息,生成处理器核心对应的编译任务规则文件;第二处理模块503,用于基于处理器核心对应的编译类对象,运行第一处理模块502生成的编译任务规则文件,生成处理器核心对应的中间文件;第三处理模块504,用于基于第二处理模块503生成的处理器核心对应的中间文件,生成处理器核心对应的目标文件。
[0173]
在一个可选示例中,图12是本公开一示例性实施例提供的第一处理模块502的结构示意图。本示例中,第一处理模块502包括:第一确定单元5021、第二确定单元5022、第三确定单元5023和第一生成单元5024。
[0174]
第一确定单元5021,用于基于第一确定模块501确定的编译任务参数信息,确定处理器核心对应的配置工厂类对象;第二确定单元5022,用于基于第一确定单元5021确定的配置工厂类对象,确定处理器核心对应的参数配置类对象;第三确定单元5023,用于基于第一确定模块501确定的编译任务参数信息,确定处理器核心对应的生成工厂类对象;第一生成单元5024,用于基于第三确定单元5023确定的生成工厂类对象及第二确定单元5022确定的参数配置类对象,生成处理器核心对应的编译任务规则文件。
[0175]
在一个可选示例中,图13是本公开一示例性实施例提供的第一确定单元5021的结构示意图。在本示例中,第一确定单元5021包括:第一确定子单元50211a和第二确定子单元50212a。
[0176]
第一确定子单元50211a,用于基于编译任务参数信息,确定处理器核心对应的类型;第二确定子单元50212a,用于基于处理器核心对应的类型,确定处理器核心对应的配置工厂类对象。
[0177]
在一个可选示例中,图14是本公开另一示例性实施例提供的第一确定单元5021的结构示意图。在本示例中,第一确定单元5021包括:第三确定子单元50211b和第四确定子单元50212b。
[0178]
第三确定子单元50211b,用于基于编译任务参数信息,确定处理器核心对应的类型和编号;第四确定子单元50212b,用于基于处理器核心对应的类型和编号,确定处理器核心对应的配置工厂类对象。
[0179]
在一个可选示例中,图15是本公开一示例性实施例提供的第二处理模块503的结构示意图。本示例中,第二处理模块503包括:第一处理单元5031和第二处理单元5032。
[0180]
第一处理单元5031,用于基于处理器核心对应的类型和编号,确定处理器核心对应的编译工厂类对象;第二处理单元5032,用于基于第一处理单元5031确定的处理器核心对应的编译工厂类对象,运行编译任务规则文件,生成处理器核心对应的中间文件。
[0181]
在一个可选示例中,图16是本公开一示例性实施例提供的第二确定单元5022的结构示意图。在本示例中,第二确定单元5022包括:第一获取子单元50221和封装子单元50222。
[0182]
第一获取子单元50221,用于基于配置工厂类对象,获取处理器核心对应的工具链信息、工程目录信息及源文件信息;封装子单元50222,用于将第一获取子单元50221获取到的处理器核心对应的工具链信息、工程目录信息及源文件信息进行封装,获得处理器核心对应的参数配置类对象。
[0183]
在一个可选示例中,图17是本公开一示例性实施例提供的第一生成单元5024的结构示意图。在本示例中,第一生成单元5024包括:第一创建子单元50241、第二创建子单元50242和生成子单元50243。
[0184]
第一创建子单元50241,用于基于生成工厂类对象,创建处理器核心对应的工程目录;第二创建子单元50242,用于基于处理器核心对应的工程目录信息和源文件信息,在工程目录下创建处理器核心对应的源文件的符号链接;生成子单元50243,用于根据参数配置类对象、及对应的模板文件,在工程目录下生成处理器核心对应的编译任务规则文件。
[0185]
在一个可选示例中,图18是本公开一示例性实施例提供的第三处理模块504的结构示意图。在本示例中,第三处理模块504包括:链接单元5041、反编译单元5042、分析单元5043和第三处理单元5044。
[0186]
链接单元5041,用于对中间文件进行链接操作,获得处理器核心对应的可执行文件;反编译单元5042,用于对可执行文件进行反编译操作,获得对应的反汇编文件;分析单元5043,用于对可执行文件进行文件分析操作,获得对应的二进制代码文件和/或十六进制代码文件;第三处理单元5044,用于将可执行文件、反汇编文件、二进制代码文件和十六进制代码文件中的至少一种作为目标文件。
[0187]
在一个可选示例中,图19是本公开另一示例性实施例提供的编译构建装置的结构示意图。在本示例中,本公开的装置还包括:接收模块505和第四处理模块506。
[0188]
接收模块505,用于接收用户的工厂类注册请求,工厂类注册请求包括用户待添加的用于支持新类型的处理器核心的编译构建的各工厂类信息;第四处理模块506,用于响应于工厂类注册请求,将用户的各工厂类信息进行注册。
[0189]
在一个可选示例中,图20是本公开一示例性实施例提供的第一确定模块501的结构示意图。在本示例中,第一确定模块501包括:获取单元5011和第四处理单元5012。
[0190]
获取单元5011,用于获取字符串形式的编译任务参数列表;第四处理单元5012,用于对编译任务参数列表进行反序列化,获得至少一个处理器核心对应的字典数据结构,作为编译任务参数信息。
[0191]
在一个可选示例中,本公开的编译构建装置还可以按照其他方式进行功能模块划分,图21是本公开再一示例性实施例提供的编译构建装置的结构示意图。在本示例中,本公
开的编译构建装置可以包括配置模块、生成模块和编译模块,其中,配置模块用于执行参数解析阶段的流程,生成参数配置类对象;生成模块用于执行编译准备阶段的流程,生成编译任务规则文件,编译模块用于执行编译操作阶段的流程,生成目标文件。具体各模块的操作参见前述内容,在此不再一一赘述。
[0192]
在一个可选示例中,以芯片验证场景为例,本公开的hvbs(horizon verification build system)按功能可以包括配置模块(由configuration base class及其衍生子类等一系列类构成)、生成模块(由generator base class及其衍生子类等一系列python类构成)、编译模块(由compiler base class及其衍生子类等一系列python类构成)、配置文件(config yaml)、工程文件(project yaml)、模块库文件(即模板文件)、及包含编译任务规则文件的外壳程序。各功能模块使用基于任意可实施的语言的自动化构建工具二次开发,并使用模板引擎自动化生成具体的编译任务规则文件,工程文件、配置文件等配置表格采用yaml表格。本示例的hvbs还包括包含编译任务规则文件的外壳程序,外壳程序是用于组织编译任务工作流程的顶层文件,按照自动化构建工具的关于执行工程异地编译的要求,需要将编译任务规则文件在仿真用例的工作目录中生成符号链接。基于自动化构建工具运行生成的编译任务规则文件,生成对应的中间文件,进而通过链接操作、反汇编操作、文件分析操作获得目标文件(.bin、.hex、.as、.so),目标文件用于芯片系统或子系统的验证。
[0193]
示例性电子设备
[0194]
本公开实施例还提供了一种电子设备,包括:存储器,用于存储计算机程序;
[0195]
处理器,用于执行所述存储器中存储的计算机程序,且所述计算机程序被执行时,实现本公开上述任一实施例所述的方法。
[0196]
图22是本公开电子设备一个应用实施例的结构示意图。本实施例中,该电子设备10包括一个或多个处理器11和存储器12。
[0197]
处理器11可以是中央处理单元(cpu)或者具有数据处理能力和/或指令执行能力的其他形式的处理单元,并且可以控制电子设备10中的其他组件以执行期望的功能。
[0198]
存储器12可以包括一个或多个计算机程序产品,所述计算机程序产品可以包括各种形式的计算机可读存储介质,例如易失性存储器和/或非易失性存储器。所述易失性存储器例如可以包括随机存取存储器(ram)和/或高速缓冲存储器(cache)等。所述非易失性存储器例如可以包括只读存储器(rom)、硬盘、闪存等。在所述计算机可读存储介质上可以存储一个或多个计算机程序指令,处理器11可以运行所述程序指令,以实现上文所述的本公开的各个实施例的方法以及/或者其他期望的功能。在所述计算机可读存储介质中还可以存储诸如输入信号、信号分量、噪声分量等各种内容。
[0199]
在一个示例中,电子设备10还可以包括:输入装置13和输出装置14,这些组件通过总线系统和/或其他形式的连接机构(未示出)互连。
[0200]
例如,该输入装置13可以是上述的麦克风或麦克风阵列,用于捕捉声源的输入信号。
[0201]
此外,该输入装置13还可以包括例如键盘、鼠标等等。
[0202]
该输出装置14可以向外部输出各种信息,包括确定出的距离信息、方向信息等。该输出装置14可以包括例如显示器、扬声器、打印机、以及通信网络及其所连接的远程输出设备等等。
[0203]
当然,为了简化,图22中仅示出了该电子设备10中与本公开有关的组件中的一些,省略了诸如总线、输入/输出接口等等的组件。除此之外,根据具体应用情况,电子设备10还可以包括任何其他适当的组件。
[0204]
示例性计算机程序产品和计算机可读存储介质
[0205]
除了上述方法和设备以外,本公开的实施例还可以是计算机程序产品,其包括计算机程序指令,所述计算机程序指令在被处理器运行时使得所述处理器执行本说明书上述“示例性方法”部分中描述的根据本公开各种实施例的方法中的步骤。
[0206]
所述计算机程序产品可以以一种或多种程序设计语言的任意组合来编写用于执行本公开实施例操作的程序代码,所述程序设计语言包括面向对象的程序设计语言,诸如java、c++等,还包括常规的过程式程序设计语言,诸如“c”语言或类似的程序设计语言。程序代码可以完全地在用户计算设备上执行、部分地在用户设备上执行、作为一个独立的软件包执行、部分在用户计算设备上部分在远程计算设备上执行、或者完全在远程计算设备或服务器上执行。
[0207]
此外,本公开的实施例还可以是计算机可读存储介质,其上存储有计算机程序指令,所述计算机程序指令在被处理器运行时使得所述处理器执行本说明书上述“示例性方法”部分中描述的根据本公开各种实施例的方法中的步骤。
[0208]
所述计算机可读存储介质可以采用一个或多个可读介质的任意组合。可读介质可以是可读信号介质或者可读存储介质。可读存储介质例如可以包括但不限于电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。可读存储介质的更具体的例子(非穷举的列表)包括:具有一个或多个导线的电连接、便携式盘、硬盘、随机存取存储器(ram)、只读存储器(rom)、可擦式可编程只读存储器(eprom或闪存)、光纤、便携式紧凑盘只读存储器(cd-rom)、光存储器件、磁存储器件、或者上述的任意合适的组合。
[0209]
以上结合具体实施例描述了本公开的基本原理,但是,需要指出的是,在本公开中提及的优点、优势、效果等仅是示例而非限制,不能认为这些优点、优势、效果等是本公开的各个实施例必须具备的。另外,上述公开的具体细节仅是为了示例的作用和便于理解的作用,而非限制,上述细节并不限制本公开为必须采用上述具体的细节来实现。
[0210]
本说明书中各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其它实施例的不同之处,各个实施例之间相同或相似的部分相互参见即可。对于系统实施例而言,由于其与方法实施例基本对应,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
[0211]
本公开中涉及的器件、装置、设备、系统的方框图仅作为例示性的例子并且不意图要求或暗示必须按照方框图示出的方式进行连接、布置、配置。如本领域技术人员将认识到的,可以按任意方式连接、布置、配置这些器件、装置、设备、系统。诸如“包括”、“包含”、“具有”等等的词语是开放性词汇,指“包括但不限于”,且可与其互换使用。这里所使用的词汇“或”和“和”指词汇“和/或”,且可与其互换使用,除非上下文明确指示不是如此。这里所使用的词汇“诸如”指词组“诸如但不限于”,且可与其互换使用。
[0212]
可能以许多方式来实现本公开的方法和装置。例如,可通过软件、硬件、固件或者软件、硬件、固件的任何组合来实现本公开的方法和装置。用于所述方法的步骤的上述顺序仅是为了进行说明,本公开的方法的步骤不限于以上具体描述的顺序,除非以其它方式特
别说明。此外,在一些实施例中,还可将本公开实施为记录在记录介质中的程序,这些程序包括用于实现根据本公开的方法的机器可读指令。因而,本公开还覆盖存储用于执行根据本公开的方法的程序的记录介质。
[0213]
还需要指出的是,在本公开的装置、设备和方法中,各部件或各步骤是可以分解和/或重新组合的。这些分解和/或重新组合应视为本公开的等效方案。
[0214]
提供所公开的方面的以上描述以使本领域的任何技术人员能够做出或者使用本公开。对这些方面的各种修改对于本领域技术人员而言是非常显而易见的,并且在此定义的一般原理可以应用于其他方面而不脱离本公开的范围。因此,本公开不意图被限制到在此示出的方面,而是按照与在此公开的原理和新颖的特征一致的最宽范围。
[0215]
为了例示和描述的目的已经给出了以上描述。此外,此描述不意图将本公开的实施例限制到在此公开的形式。尽管以上已经讨论了多个示例方面和实施例,但是本领域技术人员将认识到其某些变型、修改、改变、添加和子组合。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1