Keil 链接器指令(Linker Directive)之REMOVEUNUSED

在Keil中进行代码开发时,经常会遇到这样的情况:程序源代码中,有一些函数在应用工程中是调用不到的,这时Keil在编译链接生成代码时,就会弹出警告,举例如下:

*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
    SEGMENT: ?PR?_ADC_GET10BITRESULT?ADC_STC51_HAL
......
Program Size: data=237.5 xdata=2862 code=50260
这表示,生成的程序代码中,存在没有调用的代码段(uncalled segment)。如果要避免这种浪费问题,就需要对Keil开发环境添加一些自定义设置。

首先,在Project窗口,右键“”Option for Target...“”,在打开的对话框中,选择"Device"选项栏,在右边勾选使用LX51链接器来代替BL51,具体如下图所示:

Keil 链接器指令(Linker Directive)之REMOVEUNUSED_第1张图片

然后同样在该窗口的“LX51 Misc”选项栏的Misc controls中填入命令:"REMOVEUNUSED",具体如下图所示:

Keil 链接器指令(Linker Directive)之REMOVEUNUSED_第2张图片

之后点击OK按钮,保存设置选项,再生成可执行代码,Keil就不会再弹出这类警告了,并且生成的代码量和之前有明显差别:

Program Size: data=84.4 xdata=2862 const=12970 code=33381
之前的代码段大小是:50260bytes,现在的代码段大小是:12970+33381=46351bytes,减少了约4Kbytes的代码量。之前的数据量:data = 237.5bytes,现在的数据量:84.4bytes,减少了约150bytes的数据量。所以这样做确实可以去掉应用工程中调用不到的代码,精简体积。

接下来具体研究下链接器命令“”REMOVEUNUSED“”,通过查询Keil->uVision Help手册,在主题为"REMOVEUNUSED"的文章中,有其详细介绍:

The REMOVEUNUSED directive removes unused program and data segments provided that Data Overlaying is enabled. When you apply this directive unused functions along with the related data segments are deleted in the final executable program.(该指令用于在生成可执行代码时,移除没有使用到的程序和数据段,并使能数据覆盖功能)

使用方式:无参数,直接输入;输入位置:Options — LX51 Misc — Misc Controls.

综上所述,总结归纳如下:

1、在Keil代码中,未调用到的函数和变量默认会添加到生成的可执行程序,这样导致程序更大,并且对MCU的存储空间大小要求更高;

2、在Keil中,设定使用LX51链接器,并使用指令"REMOVEUNUSED",可以在生成可执行代码时,移除没有用到的代码和数据,有效地缩减了生成代码的大小;

3、使用该指令,会使能数据覆盖(Data Overlaying)功能【待研究】


官方链接:http://www.keil.com/support/man/docs/lx51/lx51_removeunused.htm




你可能感兴趣的:(Keil)