CN112905180A - 指令优化方法及装置 - Google Patents

指令优化方法及装置 Download PDF

Info

Publication number
CN112905180A
CN112905180A CN201911133520.9A CN201911133520A CN112905180A CN 112905180 A CN112905180 A CN 112905180A CN 201911133520 A CN201911133520 A CN 201911133520A CN 112905180 A CN112905180 A CN 112905180A
Authority
CN
China
Prior art keywords
function
source program
functions
executable file
null
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.)
Pending
Application number
CN201911133520.9A
Other languages
English (en)
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.)
Alibaba Group Holding Ltd
Original Assignee
Alibaba Group Holding Ltd
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 Alibaba Group Holding Ltd filed Critical Alibaba Group Holding Ltd
Priority to CN201911133520.9A priority Critical patent/CN112905180A/zh
Publication of CN112905180A publication Critical patent/CN112905180A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/443Optimisation
    • G06F8/4434Reducing the memory space required by the program code

Landscapes

  • Engineering & Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Stored Programmes (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

本发明公开了一种指令优化方法,适于减少源程序的可执行文件中的代码段所占用的存储空间,该方法包括步骤:对源程序进行编译,以得到该源程序的可执行文件,可执行文件包括多个函数占用的存储区域信息;将可执行文件中包括的在源程序中未被调用的函数作为冗余函数;以及在源程序中将冗余函数定义为空函数。本发明一并公开了相应的装置。

Description

指令优化方法及装置
技术领域
本发明涉及嵌入式开发技术领域,尤其涉及一种指令优化方法、计算设备及片上系统。
背景技术
随着网络通信技术的发展,当今社会已进入物联网(Internet of Things,IoT)时代。嵌入式技术是物联网得以实现的基础。开发者在PC(Personal Computer)端完成程序的开发、调试后,将程序烧写至嵌入式芯片的存储器中,并将嵌入式芯片集成于智能设备。当嵌入式芯片的处理器运行该程序时,使得智能设备能够启动工作并实现相应功能。
智能设备多种多样,嵌入式芯片的硬件资源配置会根据智能设备应用场景的不同而存在较大差异。在低成本、低功耗需求的应用场景(例如工业应用场景)中,通常会对嵌入式芯片的运行内存的容量进行压缩。因此,烧写至存储器中的程序指令需要有较高的集成度,尽可能减少冗余,以节省运行时所占用的内存空间。
发明内容
为此,本发明提供一种指令优化方法及装置,以力图解决或至少缓解上面存在的问题。
根据本发明的第一个方面,提供一种指令优化方法,适于减少源程序的可执行文件中的代码段所占用的存储空间,该方法包括步骤:对源程序进行编译,以得到该源程序的可执行文件,可执行文件包括多个函数占用的存储区域信息;将可执行文件中包括的在源程序中未被调用的函数作为冗余函数;以及在源程序中将冗余函数定义为空函数。
可选地,在根据本发明的指令优化方法中,存储空间为用于物联网设备的片上系统的只读存储空间。
可选地,在根据本发明的指令优化方法中,源程序包括至少一个用于程序调试的调试函数,在对源程序进行编译的步骤之前,还包括步骤:通过在源程序中定义调试常量来区分源程序的编译模式,编译模式包括调试模式和发行模式;在发行模式下,定义调试函数为空,以删除调试函数。
可选地,在根据本发明的指令优化方法中,对源程序进行编译的步骤包括:在发行模式下对源程序进行编译。
可选地,在根据本发明的指令优化方法中,在源程序中将冗余函数定义为空函数的步骤包括:确定冗余函数的定义格式,定义格式包括返回值类型、函数名、参数类型;按照定义格式,将冗余函数定义为空函数。
可选地,在根据本发明的指令优化方法中,采用编译器对源程序进行编译,冗余函数为编译器引入的标准库函数。
可选地,在根据本发明的指令优化方法中,冗余函数为编译器引入的文件输入输出类函数。
可选地,在根据本发明的指令优化方法中,在源程序中将冗余函数定义为空函数的步骤包括:确定文件输入输出类中的根函数,文件输入输出类中的其他函数均为根函数的子函数;将根函数定义为空函数。
可选地,在根据本发明的指令优化方法中,将根函数定义为空函数的步骤包括:确定根函数的定义格式;按照定义格式,将根函数定义为空函数。
可选地,在根据本发明的指令优化方法中,还包括步骤:当可执行文件中包括两个功能相同但参数精度不同的函数时,将两个函数的参数调整为同一精度。
可选地,在根据本发明的指令优化方法中,在在源程序中将冗余函数定义为空函数的步骤之后,还包括步骤:再次对源程序进行编译,以得到源程序的可执行文件。
根据本发明的第二个方面,提供一种计算设备,包括:至少一个处理器;以及存储有程序指令的存储器,当该程序指令被处理器读取并执行时,使得该计算设备执行上述指令优化方法。
根据本发明的第三个方面,提供一种存储有程序指令的可读存储介质,当该程序指令被计算设备读取并执行时,使得计算设备执行上述指令优化方法。
根据本发明的第四个方面,提供一种片上系统,包括:至少一个处理器;以及只读存储器,只读存储器中存储有按照上述指令优化方法优化后的源程序的可执行文件。
根据本发明的第五个方面,提供一种智能设备,包括上述片上系统。
根据本发明的技术方案,对源程序进行编译以得到源程序的可执行文件,通过对比可执行文件中的函数与源程序中的函数,将可执行文件中包括的,但在源程序中未被调用的函数作为冗余函数,并在源程序中将冗余函数定义为空函数。冗余函数通常为编译器在编译源程序时自行引入的库函数,通过将冗余函数定义为空函数,编译器将优先调用自定义的空函数,而不会再去调用标准库中的同名函数,从而减少了可执行文件中的代码段所占用的存储空间。
进一步地,当冗余函数为编译器引入的文件输入输出类函数时,通过确定文件输入输出类中的根函数,并将根函数定义为空函数,可以便捷地避免引入文件输入输出类中的所有函数。
此外,本发明的技术方案还实现了源程序的条件编译。在调试(Debug)模式下,对源程序中的调试函数正常编译,得到调试版本的可执行文件,调试版本的可执行文件中包括调试函数的代码段。而在发行模式(Release)下,定义调试函数为空,以删除调试函数,使发行版本的可执行文件中不包括调试函数的代码段,从而减少了可执行文件中的代码段所占用的存储空间。
上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的具体实施方式。
附图说明
为了实现上述以及相关目的,本文结合下面的描述和附图来描述某些说明性方面,这些方面指示了可以实践本文所公开的原理的各种方式,并且所有方面及其等效方面旨在落入所要求保护的主题的范围内。通过结合附图阅读下面的详细描述,本公开的上述以及其它目的、特征和优势将变得更加明显。遍及本公开,相同的附图标记通常指代相同的部件或元素。
图1示出了根据本发明一个实施例的片上系统100的示意图;
图2示出了根据本发明一个实施例的计算设备200的示意图;
图3示出了根据本发明一个实施例的烧写系统300的示意图;
图4示出了根据本发明一个实施例的指令优化方法400的流程图;
图5示出了根据本发明一个实施例的编译生成的可执行文件的代码段的示意图;
图6示出了根据本发明另一个实施例的编译生成的可执行文件的代码段的示意图;
图7示出了根据本发明另一个实施例的指令优化方法700的流程图;
图8示出了根据本发明一个实施例的两个功能相同但参数精度不同的函数的示意图。
具体实施方式
下面将参照附图更详细地描述本公开的示例性实施例。虽然附图中显示了本公开的示例性实施例,然而应当理解,可以以各种形式实现本公开而不应被这里阐述的实施例所限制。相反,提供这些实施例是为了能够更透彻地理解本公开,并且能够将本公开的范围完整的传达给本领域的技术人员。
图1示出了根据本发明一个实施例的片上系统(System on Chip,SoC)100的示意图。如图1所示,片上系统100包括处理器110、总线120、只读存储器(ROM,Read-OnlyMemory)130和随机存取存储器(RAM,Random Access Memory)140。处理器110通过总线120分别与只读存储器130、随机存取存储器140耦接。
处理器110例如可以是单核处理器、多核处理器、多核处理器中的处理器核、或者电子系统中的处理元件等,但不限于此。总线120例如包括用于指定存储地址的地址总线和用于进行数据传输的数据总线。
只读存储器130例如可以是FLASH存储器(即闪存,包括NAND FLASH、NOR FLASH等)、可编程只读存储器(Programmable ROM,PROM)、可编程可擦除只读存储器(ErasableProgrammable ROM,EPROM)、带电可擦除可编程存储器(Electrically ErasableProgrammable ROM,EEPROM)等,但不限于此。
随机存取存储器140例如可以是静态随机存储器(Static RAM,SRAM)、动态随机存储器(Dynamic RAM,DRAM)等,但不限于此。
处理器110用于从只读存储器130、随机存取存储器140、高速缓存(Cache,图1中未示出)或其他源中获取指令并执行,以及从随机存取存储器140、高速缓存或其他源接收数据输入并向它们生成数据输出。
只读存储器130中存储有程序的可执行文件,可执行文件通常包括代码段(text段)、数据段(data段)和bss段。代码段用于存放程序指令,其中包括多个函数所占用的存储区域信息;数据段用于存放在编译时就可确定的数据,例如常量和已赋初值的变量等;bss段用于存放未赋初值的变量。在程序运行时,通常需要将可执行文件的代码段和数据段拷贝至随机存取存储器140中(在某些情况中,也可能仅将数据段拷贝至随机存取存储器140,而不拷贝代码段),并将随机存取存储器140中对应于bss段的存储区域清零。然后处理器110从随机存取存储器140中(或者从只读存储器130中)获取、执行代码段中的指令,并对数据段、bss段进行读写。
上面描述的片上系统100可以包含在智能设备中,以便在智能设备中实现相应的功能,包括但不限于执行相关控制程序、进行数据分析、运算和处理、网络通信、控制智能设备中的外设等。
这样的智能设备包括专门的智能设备,如移动终端和个人数字终端等,这些设备中包括根据本发明的一个或者多个片上系统来进行数据处理,或者对设备中的外设进行控制。
这样的智能设备还包括为了实现特定功能而构造的专门设备,例如智能音箱、和智能显示设备等。这些设备中包括根据本发明的片上系统来对音箱和显示设备进行控制,从而赋予音箱和显示设备额外的通信、感知和数据处理等功能。
这样的智能设备还包括各种IoT和AIoT(AI+IoT,智联网)设备。这些设备中包括根据本发明的片上系统进行数据处理,例如进行AI运算、数据通信和传输等,从而实现了更加密集且更加智能的设备分布。
这样的智能设备还可以在车辆中使用,例如可以实现为车载设备、或者可以嵌入到车辆中,从而为车辆的智能驾驶提供数据处理能力。
这样的智能设备还可以用于家庭和娱乐领域,例如可以实现为智能音箱、智能空调、智能冰箱、智能显示设备等。这些设备包括根据本发明的片上系统来进行数据处理和外设控制,从而实现了家庭和娱乐设备的智能化。
另外,这样的智能设备还可以用于工业领域,例如可以实现为工控设备、感测设备、IoT设备,AIoT设备和制动设备等。这些设备中包括根据本发明的片上系统来进行数据处理和外设控制,从而实现了工业设备的智能化。
片上系统100可以应用于多种智能设备中,其硬件配置,例如处理器110的选型、数据总线/地址总线的位数、只读存储器130/随机存取存储器140的容量大小等,会根据智能设备应用场景的不同而存在较大差异。在低成本、低功耗需求的物联网应用场景(例如工业应用场景)中,通常会对片上系统100的存储器的容量,尤其是随机存取存储器140的容量进行压缩。这要求只读存储器130中存储的程序指令有较高的集成度,尽可能减少冗余,以节省运行时所占用的随机存取存储器140的空间。
在本发明的实施例中,只读存储器130中存储有源程序的可执行文件,可执行文件包括代码段(text段)、数据段(data段)和bss段。其中,data段和bss段用于存放程序中涉及的常量及变量,其冗余程度较低,优化空间不大。而text段根据开发者的编码习惯、编译器的编译效率等因素,可能存在不同程度的冗余,优化空间较大。因此,本发明提供一种指令优化方法,能够对源程序中的代码指令进行优化,以减少源程序的可执行文件中的代码段所占用的存储空间。优化后的源程序经过编译,生成可执行文件,然后再将可执行文件烧写至片上系统100的只读存储器130中。如图1所示,经过烧写,片上系统100的只读存储器130中存储有优化后的源程序的可执行文件。
需要说明的是,为了使附图更加简洁,便于理解本发明的处理器与存储器的连接关系、存储器中存储的程序内容以及程序的运行过程,图1中仅示出了处理器110、总线120、只读存储器130和随机存取存储器140,省略了片上系统中的其他结构。本领域技术人员可以理解,除了图1中所示出的结构之外,片上系统100中还包括其他结构,例如协处理器、总线控制器、用于与外部输入输出设备进行耦接的接口等。本发明对于片上系统所包括的其他结构的种类、数量以及连接关系等均不做限制,任意存储有按照本发明的指令优化方法优化后的源程序的可执行文件的片上系统均在本发明的保护范围之内。
此外,以上对智能设备的描述仅仅是示意性的,根据本发明的智能设备不受限于此,所有可以利用根据本发明的片上系统进行数据处理的智能设备均在本发明的保护范围之内。
本发明的指令优化方法在计算设备中执行。计算设备可以是任意具有存储和计算能力的设备,其例如可以是桌面计算机、笔记本计算机等个人配置的计算机;也可以是诸如手机、平板电脑、多媒体设备、可穿戴设备等移动终端;还可以是应用于家庭、工业等领域的智能音箱、智能空调、智能门禁、工控设备、感测设备、IoT设备等智能设备,但不限于此。
图2示出了根据本发明一个实施例的计算设备200的示意图。如图2所示,计算设备200包括处理器210和存储器220。存储器220中存储有程序指令,存储器220所存储的程序指令包括集成开发环境(Integrated Development Environment,IDE)222。集成开发环境222中集成有文本编辑器、编译器、解释器等模块,用于嵌入式程序的开发及调试。例如,开发者可以在集成开发环境222中进行相应操作,来编写嵌入式程序,并对该程序进行编译,生成可执行文件。
集成开发环境222例如可以是CDS开发环境、CEVA-X Toolbox开发环境、TensilicaHiFi3的Xtensa开发环境等,但不限于此。
在本发明的实施例中,存储器220所存储的程序指令中还包括用于执行本发明的指令优化方法的指令优化装置(指令优化装置未在图2中示出)。当指令优化装置被处理器210读取并执行时,使得计算设备200执行本发明的指令优化方法,对源程序进行优化。指令优化装置可以实现为集成开发环境222中的功能模块,或者实现为一个独立的软件,本发明对指令优化装置的实现方式不做限制。
当计算设备200按照本发明的指令优化方法,完成对源程序的优化后,对优化后的源程序进行编译,得到源程序的可执行文件。随后,采用烧录工具(烧录工具可以集成于集成开发环境222中,也可以实现为独立于集成开发环境222的另外的软件)将可执行文件烧写至片上系统的只读存储器中。
图3示出了根据本发明一个实施例的烧写系统300的示意图。如图3所示,烧写系统300包括片上系统100、计算设备200和调试器310。调试器310分别与计算设备200和片上系统100相连,用于在二者之间形成数据传输通道,以实现数据的传输。调试器310例如可以是JTAG调试器,其分别通过USB接口、JTAG接口与计算设备200、片上系统100相连。
计算设备200按照本发明的指令优化方法完成对源程序的优化后,对优化后的源程序进行编译,得到源程序的可执行文件。随后,采用烧录工具,通过调试器310将可执行文件烧写至片上系统100中。具体地,如图1所示,烧写至片上系统100的只读存储器130中。片上系统100的处理器110可以运行只读存储器130中的可执行文件,以实现相应功能。
图4示出了根据本发明一个实施例的指令优化方法400的流程图。方法400在计算设备(例如前述计算设备200)中执行,用于对源程序进行优化,以减少源程序的可执行文件中的代码段所占用的存储空间。如图4所示,方法400始于步骤S410。
在步骤S410中,对源程序进行编译,以得到源程序的可执行文件,可执行文件包括多个函数占用的存储区域信息。
源程序指的是未编译的,按照一定的程序设计语言规范书写的文本文件。源程序通常采用高级语言编写,是人类可读的计算机语言指令。在嵌入式开发领域,源程序通常采用C语言编写。
在步骤S410中,采用编译器对源程序进行编译,编译器通常集成于集成开发环境222中。经过编译,可以得到源程序的可执行文件。如前所述,源程序的可执行文件包括代码段、数据段和bss段,代码段中进一步包括多个函数占用的存储区域信息。存储区域信息例如可以是各个函数(section)所占用的内存逻辑地址范围和内存区域的大小,但不限于此。
需要说明的是,可执行文件中的代码段所包括的函数通常与源程序中定义的函数不完全一致。编译器在对源程序进行编译的过程中,会引入一些函数,使得生成的可执行文件所包括的函数的数量多于源程序中所定义的函数的数量。
根据一种实施例,在C语言中,编译器在编译阶段引入的函数包括标准库函数,也可能会引入一些由编译器默认产生的函数。
C标准库(C Standard library)为ANSI C标准定义的、所有编译器均支持的库,例如stdio库、stdlib库、math库等。每个标准库中分别包括若干个函数,标准库中的函数即标准库函数。
开发者在编写源程序时,可以通过引入标准库的头文件的方式来调用标准库中的库函数,而无需在源程序中对库函数进行定义。例如,开发者可以通过代码#include<stdio.h>来引入stdio库,并调用stdio库中的printf、fopen等库函数。在编译阶段,编译器会自行将源程序中调用的库函数链接至可执行文件中,使可执行文件中包括库函数对应的代码段。
在编译阶段,编译器除了会引入源程序中调用的库函数之外,还可能会自行引入源程序中未调用的函数(可能是库函数,也可能是其他函数)。是否会引入源程序中未调用的函数、以及引入的未调用的函数的数量多少由编译器本身的性能来决定。
图5示出了根据本发明一个实施例的编译生成的可执行文件的代码段的示意图。如图5所示,代码段进一步被划分为多个代码片(section),每个代码片具有对应的存储区域信息,存储区域信息包括代码片所占用的内存逻辑地址范围和所占用的内存区域的大小。例如,代码片initConfigRegs_section所占用的内存逻辑地址范围为bdee~bdff,共0x12个字节。
图5中的.text为源程序的代码本身,其他section为源程序中调用的标准库函数(例如fopen_section、fprintf_section等),或者源程序中未调用的、由编译器自行产生的函数(例如initConfigRegs_section等)。
在步骤S410的编译过程中,编译器可能会引入源程序中未被调用的函数。编译器引入的这些函数增加了可执行文件中代码段的内容,从而增加了可执行文件所占用的存储空间。但是,由于源程序中并未调用这些函数,因此编译器所引入的这些函数不会影响源程序的运行,其对于源程序来说是冗余的。为了减少可执行文件中的代码段所占用的存储空间,需要执行后续步骤S420和步骤S430,尽量减少或消除编译器引入的、源程序中未调用的函数所占用的存储空间。
在步骤S420中,将可执行文件中包括的在源程序中未被调用的函数作为冗余函数。
如前所述,可执行文件中包括的、但在源程序中未被调用的函数不会影响源程序的正常运行,其对于源程序来说是冗余的。因此,在步骤S420中,将可执行文件中包括的源程序中未被调用的函数作为冗余函数,在后续步骤S430中针对冗余函数进行处理,以尽量减少或消除编译器引入的冗余函数所占用的存储空间。
在步骤S430中,在源程序中将冗余函数定义为空函数。
根据一种实施例,若冗余函数为标准库函数,在步骤S430中除了将冗余函数定义为空函数之外,还需要删除对相应标准库的引用,即删除源程序中用于引入标准库的头文件的代码。例如,冗余函数为stdio库中的函数,则除了需要将冗余函数定义为空函数之外,还需要删除源程序中的#include<stdio.h>的代码。
根据一种实施例,步骤S420中确定了多个冗余函数,在步骤S430中,将这多个冗余函数一一定义为空函数。具体地,首先,确定冗余函数的定义格式,定义格式包括返回值类型、函数名、参数类型。冗余函数的定义格式例如可以通过查询编译器的帮助文档来确定。随后,按照已确定的定义格式,将冗余函数定义为空函数。重定义的冗余函数与原冗余函数的返回值类型、函数名和参数类型均相同,仅函数体不同。原冗余函数的函数体中包括用于实现相应功能的代码指令,而重定义的冗余函数的函数体不包括任何功能性的代码指令,仅包括一个用于返回空值的返回指令,例如return,return 0,或者return null。
例如,在步骤S420中,确定fprintf库函数为冗余函数。通过查找帮助文档,确定fprintf的定义格式如下:
int fprintf(FILE*pStream,const char*pFormat,…){
函数体;
}
即,该函数的返回值类型为int,函数名为printf,参数类型为(FILE*pStream,const char*pFormat,…)。
按照上述定义格式,将fprintf重新定义为空函数,重定义后的空函数如下:
int fprintf(FILE*pStream,const char*pFormat,…){
return 0;
}
在步骤S430中,通过将冗余函数重定义为空函数,编译器将优先调用自定义的空函数,而不会再去调用标准库中的同名函数。自定义的空函数相对于标准库中的同名函数来说,函数体中的代码指令大大减少,从而减少了可执行文件中对应于该函数的代码段所占用的存储空间,即,减少了可执行文件中的代码段所占用的存储空间。
根据另一种实施例,步骤S420中所确定的冗余函数为编译器引入的与文件输入输出(file-io)相关的库函数,简称为文件输入输出类函数。这种情况下,在步骤S430中,可以通过文件输入输出类中的根函数定义为空函数的方式,来将所引入的文件输入输出类中的所有冗余函数定义为空函数。具体地,首先,确定文件输入输出类中的根函数,文件输入输出类中的其他函数均为根函数的子函数。文件输入输出类的根函数的设置与编译器有关,不同编译器的文件输入输出类的根函数可能存在差异。文件输入输出类的根函数可以通过查询相应编译器的帮助文档,或者通过试验来确定。
在确定了输入输出库中的根函数后,将根函数定义为空函数。将根函数定义为空函数的步骤与前述将单个冗余函数定义为空函数的步骤相同,即:首先,确定根函数的定义格式,定义格式包括返回值类型、函数名、参数类型。根函数的定义格式例如可以通过查询编译器的帮助文档来确定。随后,按照已确定的定义格式,将根函数重定义为空函数。重定义的根函数与原根函数的返回值类型、函数名和参数类型均相同,仅函数体不同。原根函数的函数体中包括用于实现相应功能的代码指令,而重定义的根函数的函数体不包括任何功能性的代码指令,仅包括一个用于返回空值的返回指令,例如return,return 0,或者return null。
例如,图6示出了根据本发明一个实施例的采用CEVA-X Toolbox开发环境编译生成的可执行文件的代码段的示意图。图6中,fcloseall、fclose、_stdio_close、_stdout_write、_stdio_seek、_stdio_read、_stdio_write、fflush均为编译器引入的冗余函数,且均为文件输入输出相关的函数。通过试验,确定在CEVA-X Toolbox开发环境中,文件输入输出类的根函数为initFileIo和fcloseall,其他文件输入输出类函数均为这两个函数的子函数,或者通过调用这两个函数的子函数而产生。通过查找CEVA-X Toolbox的帮助文档,确定initFileIo和fcloseall的定义格式如下:
Figure BDA0002278985450000121
按照上述定义格式,将initFileIo、fcloseall重定义为空函数,重定义后的空函数如下:
Figure BDA0002278985450000122
Figure BDA0002278985450000131
通过将根函数重定义为空函数,编译器将优先调用自定义的空函数,而不会再去调用文件输入输出类中的同名函数。由于文件输入输出类中的其他函数均为根函数的子函数,或由根函数的子函数而调用产生,将根函数定义为空函数后,文件输入输出类中的其他函数也丧失了调用基础,不会再被编译器引入,从而减少了可执行文件中的代码段所占用的存储空间。
以上以CEVA-X Toolbox开发环境为例,说明了将文件输入输出类的根函数定义为空函数的优化方式。需要说明的是,将文件输入输出类中的根函数定义为空函数的优化方式在其他开发环境中同样适用,只不过在其他开发环境中,根函数的定义格式(包括返回值类型、函数名等)可能与CEVA-X Toolbox开发环境中不同。
需要说明的是,当步骤S420中所确定的多个冗余函数为编译器引入的文件输入输出类函数时,将文件输入输出类的根函数定义为空函数,是将所有多个函数定义为空函数的快捷方式。即,当步骤S420中所确定的多个冗余函数为编译器引入的输入输出库函数时,有两种方式将这多个冗余函数定义为空函数。第一种方式是,将这多个冗余函数一一定义为空函数;第二种方式是,将文件输入输出类的根函数定义为空函数。本领域技术人员可以理解,当冗余函数的数量较多时,第二种方式更加便捷,效率更高。
图7示出了根据本发明另一个实施例的指令优化方法700的流程图。方法700在计算设备(例如前述计算设备200)中执行。如图7所示,方法700始于步骤S710。
在步骤S710中,通过在源程序中定义调试常量来区分源程序的编译模式,编译模式包括调试模式和发行模式。在发行模式下,定义调试函数为空,以删除调试函数。
为了便于调试,源程序中通常包括一个或多个调试函数。比较常见的调试函数为printf函数,其用于在默认的输出设备(通常为本机的显示器)上打印出代码中开发者预先设定的log(日志)信息,便于问题区间的定位。此外,log信息的呈现及存储方式存在差异,除了像printf函数一样采用串口将log信息直接输出至显示器上之外,还可以将log信息保存至某块内存区间,或者保存至指定文件中,相应地,调试函数还可以是fopen,fwrite,fprintf,fclose等文件输入输出类的函数。
源程序中的调试函数仅用于程序调试,不会影响程序本身的功能。在程序的最终发行版本中,调试函数没有存在的必要。因此,在步骤S710中,通过在源程序中定义调试常量来区分源程序的编译模式,编译模式包括调试模式(Debug)和发行模式(Release)。即,通过定义调试常量来实现条件编译。在调试模式下,保留源程序中的调试函数,调试函数正常编译,得到调试版本的可执行文件,调试版本的可执行文件中包括调试函数的代码段。而在发行模式下,定义调试函数为空,以删除调试函数,使编译生成的发行版本的可执行文件中不包括调试函数的代码段,从而减少了可执行文件中的代码段所占用的存储空间。
例如,源程序中的调试函数为printf函数,可以在源程序中添加以下代码来将发行模式下的调试函数定义为空:
Figure BDA0002278985450000141
在上述代码中,DEBUG为调试常量。若源程序中定义了调试常量DEBUG(例如,在#ifDEBUG语句之前添加#define DEBUG语句来定义调试常量DEBUG),则编译器将采用调试模式对源程序进行编译,在调试模式下,用字符串dbg_printf来替代printf函数名,printf函数被正常编译。若源程序中未定义调试常量DEBUG(例如,在#if DEBUG语句之前没有#defineDEBUG语句),则编译器将采用发行模式对源程序进行编译,在发行模式下,字符串dbg_printf为空字符串,而不再像调试模式一样代表printf函数,因此printf函数被删除,使编译生成的发行版本的可执行文件中不包括printf函数的代码段,从而减少了可执行文件中的代码段所占用的存储空间。
在将发行模式下的调试函数定义为空后,执行步骤S720。
在步骤S720中,在发行模式下对源程序进行编译,以得到源程序的可执行文件,可执行文件包括多个函数占用的存储区域信息。
由于步骤S710中将发行模式下的调试函数定义为空,因此在步骤S720中,在发行模式下对源程序进行编译所得到的可执行文件中不包括调试函数的代码段。
具体的编译过程可以参考前述步骤S410的相关描述,此处不再赘述。
随后,在步骤S730中,将可执行文件中包括的在源程序中未被调用的函数作为冗余函数。
随后,在步骤S740中,在源程序中将冗余函数定义为空函数。
步骤S730、S740与前述步骤S420、S430相同,其具体实施过程可以参考前述步骤S420、S430的相关描述,此处不再赘述。
以下给出方法700的一个实施例:
源程序采用C语言编写,源程序中的调试函数为printf函数。编译器采用CEVA-XToolbox开发环境。
首先,在源程序中采用DEBUG常量来区分Debug和Release两种编译模式。在Debug模式下,保留源程序中的调试函数printf;在Release模式下,将调试函数printf定义为空。相关代码如下:
#if DEBUG
#define PRINTF(x)printf x
#include<stdio.h>
#include<stdlib.h>
#else
#define PRINTF(x)((void)0)
随后,在Release模式下编译源程序,得到源程序的可执行文件,可执行文件中包括多个函数占用的存储区域信息。
随后,将可执行文件中包括的在源程序中未被调用的函数作为冗余函数。例如,冗余函数为文件输入输出相关的库函数。
随后,通过将文件输入输出类的根函数定义为空函数的方式,来将冗余函数定义为空函数。在CEVA-X Toolbox开发环境中,文件输入输出类的根函数为initFileIo和fcloseall,因此,在源程序中将这两个函数重定义为空函数。
相关代码如下:
Figure BDA0002278985450000161
在Release模式下删除调试函数,并且将冗余函数定义为空函数后,即完成了源程序的优化。随后,在Release模式下对优化后的源程序进行编译,以得到优化后的源程序的可执行文件,将可执行文件烧写至片上系统的只读存储器中。根据选用的编译器(开发环境)的不同,优化后的源程序的可执行文件所占用的存储空间相对于优化前的可执行文件所占用的存储空间将有不同程度的减少。
下表示出了本发明的指令优化方法700在不同开发环境上的优化效果。
Figure BDA0002278985450000162
由上表可见,在采用本发明的指令优化方法700后,针对上述各种开发环境,编译后产生的可执行文件的代码段所占用的存储空间有不同程度的减少。
根据一种实施例,指令优化方法400或700中还可以包括以下步骤(该步骤未在图4或图7中示出):当可执行文件中包括两个功能相同但参数精度不同的函数时,将两个函数的参数调整为同一精度。
例如,如图8所示,可执行文件的代码段中包括sqrt函数和sqrtf函数。这两个函数的功能相同,均用于求平方根,但二者的参数精度不同,sqrt函数的参数精度为双精度浮点(double),sqrtf函数的参数精度为单精度浮点(float)。通过将两个函数的参数调整为同一精度,可以删除其中一个函数对应的代码段,从而减少可执行文件中代码段所占用的存储空间。本领域技术人员可以理解,并非当可执行文件中包括两个功能相同但参数精度不同的函数时,均需要将两个函数的参数调整为同一精度。在某些情况下,两个功能相同但参数精度不同的函数确有同时存在的必要,此时则需要同时保留两个函数,不需要调整二者的参数精度。
根据一种实施例,除了在发行模式下删除调试函数、将冗余函数定义为空函数、以及将功能相同但参数精度不同的函数的参数调整为同一精度之外,还可以通过采用其他方法(例如自定义某些函数)来替代库函数的方式,来减少库函数的调用,从而减少代码段占用的存储空间。例如,malloc是用于内存空间管理的库函数,本领域技术人员可以采用其他方法替代该函数的功能,从而去掉可执行文件中malloc函数对应的代码段,节省存储空间。
这里描述的各种技术可结合硬件或软件,或者它们的组合一起实现。从而,本发明的方法和设备,或者本发明的方法和设备的某些方面或部分可采取嵌入有形媒介,例如可移动硬盘、U盘、软盘、CD-ROM或者其它任意机器可读的存储介质中的程序代码(即指令)的形式,其中当程序被载入诸如计算机之类的机器,并被所述机器执行时,所述机器变成实践本发明的设备。
在程序代码在可编程计算机上执行的情况下,计算设备一般包括处理器、处理器可读的存储介质(包括易失性和非易失性存储器和/或存储元件),至少一个输入装置,和至少一个输出装置。其中,存储器被配置用于存储程序代码;处理器被配置用于根据该存储器中存储的所述程序代码中的指令,执行本发明的指令优化方法。
以示例而非限制的方式,可读介质包括可读存储介质和通信介质。可读存储介质存储诸如计算机可读指令、数据结构、程序模块或其它数据等信息。通信介质一般以诸如载波或其它传输机制等已调制数据信号来体现计算机可读指令、数据结构、程序模块或其它数据,并且包括任何信息传递介质。以上的任一种的组合也包括在可读介质的范围之内。
在此处所提供的说明书中,算法和显示不与任何特定计算机、虚拟系统或者其它设备固有相关。各种通用系统也可以与本发明的示例一起使用。根据上面的描述,构造这类系统所要求的结构是显而易见的。此外,本发明也不针对任何特定编程语言。应当明白,可以利用各种编程语言实现在此描述的本发明的内容,并且上面对特定语言所做的描述是为了披露本发明的最佳实施方式。
在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本发明的实施例可以在没有这些具体细节的情况下被实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。
类似地,应当理解,为了精简本公开并帮助理解各个发明方面中的一个或多个,在上面对本发明的示例性实施例的描述中,本发明的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释成反映如下意图:即所要求保护的本发明要求比在每个权利要求中所明确记载的特征更多特征。更确切地说,如下面的权利要求书所反映的那样,发明方面在于少于前面公开的单个实施例的所有特征。因此,遵循具体实施方式的权利要求书由此明确地并入该具体实施方式,其中每个权利要求本身都作为本发明的单独实施例。
本领域那些技术人员应当理解在本文所公开的示例中的设备的模块或单元或组件可以布置在如该实施例中所描述的设备中,或者可替换地可以定位在与该示例中的设备不同的一个或多个设备中。前述示例中的模块可以组合为一个模块或者此外可以分成多个子模块。
本领域那些技术人员可以理解,可以对实施例中的设备中的模块进行自适应性地改变并且把它们设置在与该实施例不同的一个或多个设备中。可以把实施例中的模块或单元或组件组合成一个模块或单元或组件,以及此外可以把它们分成多个子模块或子单元或子组件。除了这样的特征和/或过程或者单元中的至少一些是相互排斥之外,可以采用任何组合对本说明书(包括伴随的权利要求、摘要和附图)中公开的所有特征以及如此公开的任何方法或者设备的所有过程或单元进行组合。除非另外明确陈述,本说明书(包括伴随的权利要求、摘要和附图)中公开的每个特征可以由提供相同、等同或相似目的的替代特征来代替。
此外,本领域的技术人员能够理解,尽管在此所述的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本发明的范围之内并且形成不同的实施例。例如,在下面的权利要求书中,所要求保护的实施例的任意之一都可以以任意的组合方式来使用。
此外,所述实施例中的一些在此被描述成可以由计算机系统的处理器或者由执行所述功能的其它装置实施的方法或方法元素的组合。因此,具有用于实施所述方法或方法元素的必要指令的处理器形成用于实施该方法或方法元素的装置。此外,装置实施例的在此所述的元素是如下装置的例子:该装置用于实施由为了实施该发明的目的的元素所执行的功能。
如在此所使用的那样,除非另行规定,使用序数词“第一”、“第二”、“第三”等等来描述普通对象仅仅表示涉及类似对象的不同实例,并且并不意图暗示这样被描述的对象必须具有时间上、空间上、排序方面或者以任意其它方式的给定顺序。
尽管根据有限数量的实施例描述了本发明,但是受益于上面的描述,本技术领域内的技术人员明白,在由此描述的本发明的范围内,可以设想其它实施例。此外,应当注意,本说明书中使用的语言主要是为了可读性和教导的目的而选择的,而不是为了解释或者限定本发明的主题而选择的。因此,在不偏离所附权利要求书的范围和精神的情况下,对于本技术领域的普通技术人员来说许多修改和变更都是显而易见的。对于本发明的范围,对本发明所做的公开是说明性的而非限制性的,本发明的范围由所附权利要求书限定。

Claims (15)

1.一种指令优化方法,适于减少源程序的可执行文件中的代码段所占用的存储空间,所述方法包括步骤:
对源程序进行编译,以得到所述源程序的可执行文件,所述可执行文件包括多个函数占用的存储区域信息;
将所述可执行文件中包括的在所述源程序中未被调用的函数作为冗余函数;以及
在所述源程序中将所述冗余函数定义为空函数。
2.如权利要求1所述的方法,其中,所述存储空间为用于物联网设备的片上系统的只读存储空间。
3.如权利要求1所述的方法,其中,所述源程序包括至少一个用于程序调试的调试函数,在所述对源程序进行编译的步骤之前,还包括步骤:
通过在源程序中定义调试常量来区分所述源程序的编译模式,所述编译模式包括调试模式和发行模式;
在发行模式下,定义所述调试函数为空,以删除所述调试函数。
4.如权利要求3所述的方法,其中,所述对源程序进行编译的步骤包括:
在发行模式下对源程序进行编译。
5.如权利要求1-4中任一项所述的方法,其中,所述在所述源程序中将所述冗余函数定义为空函数的步骤包括:
确定所述冗余函数的定义格式,所述定义格式包括返回值类型、函数名、参数类型;
按照所述定义格式,将所述冗余函数定义为空函数。
6.如权利要求1-4中任一项所述的方法,其中,采用编译器对源程序进行编译,所述冗余函数为编译器引入的标准库函数。
7.如权利要求6所述的方法,其中,所述冗余函数为编译器引入的文件输入输出类函数。
8.如权利要求7所述的方法,其中,所述在所述源程序中将所述冗余函数定义为空函数的步骤包括:
确定所述文件输入输出类中的根函数,所述文件输入输出类中的其他函数均为所述根函数的子函数;
将所述根函数定义为空函数。
9.如权利要求8所述的方法,其中,所述将所述根函数定义为空函数的步骤包括:
确定所述根函数的定义格式;
按照所述定义格式,将所述根函数定义为空函数。
10.如权利要求1-9中任一项所述的方法,其中,还包括步骤:
当可执行文件中包括两个功能相同但参数精度不同的函数时,将两个函数的参数调整为同一精度。
11.如权利要求1-10中一项所述的方法,其中,在所述在所述源程序中将所述冗余函数定义为空函数的步骤之后,还包括步骤:
再次对源程序进行编译,以得到所述源程序的可执行文件。
12.一种计算设备,包括:
至少一个处理器;以及
存储有程序指令的存储器,当所述程序指令被所述处理器读取并执行时,使得所述计算设备执行如权利要求1-11中任一项所述的方法。
13.一种存储有程序指令的可读存储介质,当所述程序指令被计算设备读取并执行时,使得所述计算设备执行如权利要求1-11中任一项所述的方法。
14.一种片上系统,包括:
至少一个处理器;以及
只读存储器,所述只读存储器中存储有按照权利要求1-11中任一项所述的指令优化方法优化后的源程序的可执行文件。
15.一种智能设备,包括如权利要求14所述的片上系统。
CN201911133520.9A 2019-11-19 2019-11-19 指令优化方法及装置 Pending CN112905180A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201911133520.9A CN112905180A (zh) 2019-11-19 2019-11-19 指令优化方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201911133520.9A CN112905180A (zh) 2019-11-19 2019-11-19 指令优化方法及装置

Publications (1)

Publication Number Publication Date
CN112905180A true CN112905180A (zh) 2021-06-04

Family

ID=76103361

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201911133520.9A Pending CN112905180A (zh) 2019-11-19 2019-11-19 指令优化方法及装置

Country Status (1)

Country Link
CN (1) CN112905180A (zh)

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113987379A (zh) * 2021-10-19 2022-01-28 山东百盟信息技术有限公司 网页渲染引擎中日志模块Histogram的优化方法和装置
CN114003834A (zh) * 2021-10-19 2022-02-01 山东百盟信息技术有限公司 网页渲染引擎中日志模块Trace_Log的优化方法和装置
CN117454817A (zh) * 2023-12-25 2024-01-26 芯能量集成电路(上海)有限公司 一种基于fpga的工程处理方法、装置、电子设备及存储介质

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113987379A (zh) * 2021-10-19 2022-01-28 山东百盟信息技术有限公司 网页渲染引擎中日志模块Histogram的优化方法和装置
CN114003834A (zh) * 2021-10-19 2022-02-01 山东百盟信息技术有限公司 网页渲染引擎中日志模块Trace_Log的优化方法和装置
CN117454817A (zh) * 2023-12-25 2024-01-26 芯能量集成电路(上海)有限公司 一种基于fpga的工程处理方法、装置、电子设备及存储介质
CN117454817B (zh) * 2023-12-25 2024-04-12 芯能量集成电路(上海)有限公司 一种基于fpga的工程处理方法、装置、电子设备及存储介质

Similar Documents

Publication Publication Date Title
US9471291B2 (en) Multi-processor code for modification for storage areas
CN112905180A (zh) 指令优化方法及装置
US9424009B2 (en) Handling pointers in program code in a system that supports multiple address spaces
US8570333B2 (en) Method and system for enabling managed code-based application program to access graphics processing unit
US20060064576A1 (en) Boot systems and methods
US8650537B2 (en) Optimizing an object-oriented program by transforming invocations of synthetic accessor methods
CN102985908A (zh) 在计算平台中分布工作负荷
US6738966B1 (en) Compiling device, computer-readable recording medium on which a compiling program is recorded and a compiling method
US8436862B2 (en) Method and system for enabling managed code-based application program to access graphics processing unit
JP2000347872A (ja) 例外を正規制御フローとして処理する方法及び装置
WO2012047447A1 (en) Compile-time bounds checking for user-defined types
US20070245326A1 (en) Software/hardware partitioning program and method
CN113296786B (zh) 数据处理方法、装置、电子设备及存储介质
US20200183669A1 (en) Improving emulation and tracing performance using compiler-generated emulation optimization metadata
US20230289187A1 (en) Method and apparatus for rectifying weak memory ordering problem
US20090019266A1 (en) Information processing apparatus and information processing system
US6301652B1 (en) Instruction cache alignment mechanism for branch targets based on predicted execution frequencies
CN114296951A (zh) 一种进程间数据共享的方法、系统、终端以及存储介质
KR101826828B1 (ko) 로그 데이터 관리 시스템 및 방법
US7240341B2 (en) Global constant pool to allow deletion of constant pool entries
US20090019225A1 (en) Information processing apparatus and information processing system
CN111984329B (zh) 一种boot引导软件标准化生成、执行方法及系统
CN115543331A (zh) 虚拟线性内存的硬件、软件协同扩展方法及电子设备
JP3264901B2 (ja) コンパイル装置及びコンパイル方法
CN113835686A (zh) 代码处理方法和装置

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