本文主要探讨的是MDK开发工具中One ELF Section per Function选项对于代码优化的作用及其实现的机制。

这里以EK-STM32F开发板的LCDDemo实验例程为例进行说明:

1)在MDK的Project -> Options for Target -> Target选项卡下,在Code Generation 中选中Use MicroLIB,选择使用微库。在User选项卡Run User Programs After Build/Rebuild中,勾选Run #1,同时在文本框中输入命令C:/Keil/ARM/BIN31/fromelf.exe --bin -o  ./output/LCDDemo.bin ./output/

LCDDemo_MDK.axf用于生成.bin文件。

2)在选项卡C/C++中选择优化等级2,同时不选中任何的优化选项。保存,编译链接,下载运行程序,查看output中LCDDemo.bin文件的大小为4728Byte。

3)在图3所示的界面中,将One ELF Section per Function选项选中,保存,编译链接,下载运行程序,查看output中LCDDemo.bin文件的大小为3700Byte。

可以从以上的操作看出, 在其他条件相同的情况下,选项One ELF Section per Function可以将LCDDemo最后生成的.bin文件的大小减少1028Byte,这对于存储资源有限的嵌入式设备来说,还是具有很大的吸引力的。

那么,选项One ELF Section per Function是如何对C程序代码进行优化呢?为此,笔者特别设计了一个方案用于验证选项One ELF Section per Function的优化功能。

首先在LCDDemo工程的main.c文件中加入如下的代码:

void unuse()

{

int i,j = 0;

for (i=0; i<0xfffff; i++) j++;

for (j=0; j<0xfffff; j++) i++;

}

unuse()函数仅是为了测试用而加入的一个函数,该函数为被其他任何的函数所调用。下面分别查看使用选项One ELF Section per Function和不使用选项One ELF Section per Function的区别。

A,              如之前的步骤2)所示操作,生成的LCDDemo.bin的大小为7396Byte。同时,笔者采用反汇编过程进一步验证,找到了unuse()的反汇编代码。可以看出,确实因为添加了unuse()这个函数,而使得最后生成的LCDDemo.bin文件的变大。.

B,              如之前的步骤3)所示操作,生成的LCDDemo.bin的大小为3700Byte。同时,笔者采用反汇编过程进一步验证,未找到unuse()的反汇编代码。可以看出,使用选项. One ELF Section per Function后,即使添加了未使用的函数unuse(),也对于最后生成的LCDDemo.bin文件没有任何的影响。

因此,可以得出,选项One ELF Section per Function的主要功能是对冗余函数的优化。通过这个选项,可以在最后生成的二进制文件中将冗余函数排除掉(虽然其所在的文件已经参与了编译链接),以便最大程度地优化最后生成的二进制代码。

而该选项实现的机制是将每一个函数作为一个优化的单元,而并非整个文件作为参与优化的单元。

选项One ELF Section per Function所具有的这种优化功能特别重要,尤其是在对于生成的二进制文件大小有严格要求的场合。人们习惯将一系列接口函数放在一个文件里,然后将其整个包含在工程中,即使这个文件将只有一个函数被用到。这样,最后生成的二进制文件中就有可能包含众多的冗余函数,造成了宝贵存储空间的浪费。

选项One ELF Section per Function对于一个大工程的优化效果尤其突出,有时候甚至可以达到减半的效果。当然,对于小工程或是少有冗余函数的工程来说,其优化效果就没有那么明显了

MDK中One ELF Section per Function选项功能探究【转载】的更多相关文章

  1. keil mdk中如何确保某一段程序不被优化掉(转)

    源:keil mdk中如何确保某一段程序不被优化掉 使用mdk编程,假如有一个有用的函数你定义了但是没有显式的调用,mdk在默认方式下,将会把这个函数从整个程序总删除掉,以节省ROM. 比如,你在RO ...

  2. 在MDK中怎样生成*.bin格式的文件?

    在Realview MDK的集成开发环境中.默认情况下能够生成*.axf格式的调试文件和*.hex格式的可运行文件. 尽管这两个格式的文件很有利于ULINK2仿真器的下载和调试,可是ADS的用户更习惯 ...

  3. 在Ubuntu 16.04 LTS上用g++和gcc编译C/C++代码错误提示“.../x86_64-linux-gnu/crt1.o: ELF section name out of range”

    (有一些图片我是直接从个人的CSDN博客上复制来的) 最近一个多月来,我曾经多次尝试在Ubuntu 16.04 LTS上使用g++和gcc(这俩好像合起来叫MinGW?)来编译C/C++代码,但是在解 ...

  4. arm-none-eabi/bin/ld: build/com.zubax.gnss.elf section `.text' will not fit in region `flash'

    出现如下错误: /arm-none-eabi/bin/ld: build/com.zubax.gnss.elf section `.text' will not fit in region `flas ...

  5. keil MDK中如何生成*.bin格式的文件

    在Realview MDK的集成开发环境中,默认情况下可以生成*.axf格式的调试文件和*.hex格式的可执行文件.虽然这两个格式的文件非常有利于ULINK2仿真器的下载和调试,但是ADS的用户更习惯 ...

  6. Keil MDK中使用pc-lint的详细方法

    keil MDK版本:V4.03 PC-lint版本:  V8.0 关于pc-lint的强大作用,网上有很多,这里不想再复述,只说一句:能通过pc-lint检验的程序不一定没有问题,但通过了pc-li ...

  7. [系统软件]Ubuntu 18.04中的Shutter禁用了“编辑”选项解决

    本文引用自linux公社, 原文请点击 : https://www.linuxidc.com/Linux/2018-04/151911.htm   在Ubuntu 18.04中安装了我最喜欢的截图工具 ...

  8. javascript中的立即执行函数(function(){…})()

    javascript中的立即执行函数(function(){…})() 深入理解javascript中的立即执行函数,立即执行函数也叫立即调用函数,通常它的写法是用(function(){…})()包 ...

  9. 获取AD域中SYSVOL和组策略首选项中的密码

    这种方法是最简单的,因为不需要特殊的“黑客”工具.所有的攻击必须做的是打开Windows资源管理器,并搜索域名为SYSVOL DFS共享的XML文件.在大多数情况下,以下XML文件将包含凭据:grou ...

随机推荐

  1. sqoop从hdfs 中导出数据到mysql

    bin/sqoop export \ --connect "jdbc:mysql://mini1:3306/study?useUnicode=true&characterEncodi ...

  2. ios-A+B经典问题

    // // main.m // a+b // #import <Foundation/Foundation.h> #import "Calcultor.h" int m ...

  3. 流媒体服务器开发笔记(2)--RTCP协议介绍

    http://blog.sina.com.cn/s/blog_53061af00100o2no.html ——————————————————————————————————————————————— ...

  4. nested exception is java.lang.VerifyError: Expecting a stackmap frame at bra

    Caused by: java.lang.VerifyError: Expecting a stackmap frame (2016-05-19 09:56:29) 转载▼ 标签: it 分类: Ja ...

  5. 【vijos】1781 同余方程(拓展欧几里得)

    https://vijos.org/p/1781 学习了下拓欧.. 求exgcd时,因为 a*x1+b*y1=a*x2+b*y2=b*x2+(a-b*[a/b])*y2 然后移项得 a*x1+b*y1 ...

  6. JavaScript------如何解决表单登录信息输入为空显示提示

    <form name="fname" method="post" action="../Home/Login" onsubmit=&q ...

  7. 数据库设计——E-R图

    一,复习下基础 1.弱实体 这样的实体须要依赖还有一个实体.若还有一个实体不存在了.它也随之消失.相对而言,它依赖的那个实体成为强实体. 2,特殊化 在数据库设计的过程中,我们会发现.一个实体能够依照 ...

  8. GIT 回退出错 Unlink of file 'xx' failed. Should I try again? (y/n) 解决办法

    发生过程 回退版本 如果回退版本时 里面有删除或者移动的文件 容易出这个问题 解决方法 git reset --hard 版本号  回退失败了  就 本地工作目录跟版本那个工作目录比较   然后还原修 ...

  9. Django - 请求与响应、表单、中间件、上下文处理器

    请求与响应篇 一.HttpRequest对象 服务器接收到http协议的请求后,会根据报文创建HttpRequest对象.视图函数的第一个参数(request)是HttpRequest对象在djang ...

  10. matplotlib图像中文乱码(python3.6)

    方法一:(在代码中添加如下代码) import matplotlib #指定默认字体 matplotlib.rcParams['font.sans-serif'] = ['SimHei'] matpl ...