MDK内的KEEP关键字以及$$Base $$Limit

摘要:
如果符号有多个定义,armlink将生成错误消息。例如,您可以使用--keep=int_handler从上面的链接脚本中,我们可以知道VSymTab段位于FSymTab段之后。

使用mdk编程,假如有一个有用的函数你定义了但是没有显式的调用,mdk在默认方式下,将会把这个函数从整个程序总删除掉,以节省ROM.

比如,你在ROM的0x00002000处定位了一个函数,假设为void test(void),然后使用函数指针来调用它:

void (*UserProgram)();          //函数指针

UserProgram = (void (*)()) (0x00002000);//定位到指定的入口地址0x00002000

(*UserProgram)();//调用test()函数

这样做的本意是调用test()函数,但编译器并不知情,它仍会按照默认的指令将test函数给整个优化掉,因为它觉得test()函数根本没有被调用,这个时候,虽然(*UserProgram)();仍会执行,但内容与初衷已经大相径庭.

能否让编译器不自动优化test这个函数?

当然有,就是使用链接器命令:--keep=section_id   此选项指定删除未使用节时不能删除的输入节。

其中 section_id 是以下项之一:
symbol 指定在删除未使用节时保留定义 symbol 的输入节。 如果 symbol 存在多个定义,则 armlink 将生成一则错误消息。
           例如,您可能使用 --keep=int_handler。若要保留定义以 _handler 结尾的符号的所有节,请使用--keep=*_handler。
object(section)指定在删除未使用节时保留 object 中的 section。

例如,若要保留vectors.o 对象的 vect 节,请使用: --keep=vectors.o(vect)

若要保留 vectors.o 对象中节名称的前三个字母是 vec 的所有节,请使用:--keep=vectors.o(vec*)

由于我的程序test()函数是单独放在一个文件里(entry.c)的,所以我在linker标签栏下的Misc controls编辑框中输入--keep=entry.o

MDK内修改链接效果,防止优化某个段,下面是一参考博文:

https://blog.csdn.net/wuhenyouyuyouyu/article/details/71191225

下面是RTThread的链接脚本、以及其他部分源码的展示:

MDK内的KEEP关键字以及$$Base $$Limit第1张

                      这里应该还含有一层意思,定义了VSymTab段的具体位置,并且将这块位置命名为“VSymTab”段。  由上述链接脚本可以知道,VSymTab段位于FSymTab段之后。

MDK内的KEEP关键字以及$$Base $$Limit第2张

ARM MDK链接脚本参考

http://www.keil.com/support/man/docs/armlink/armlink_pge1362075498955.htm

MDK内的KEEP关键字以及$$Base $$Limit第3张

免责声明:文章转载自《MDK内的KEEP关键字以及$$Base $$Limit》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇angular-cli小白入门选集Web_php_unserialize(序列化与反序列化)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【转载】s3c2440裸机开发调试环境(MDK4.6,Jlink v8,mini2440)

    用于arm裸机程序开发的IDE基本有 以下3个:MDK,IAR,还有ADS。具体它们的具体情况在这里我就不多说了,百度一下就明白了。由于之前开发c51,stm32时候都使用了MDK开发环境,而且MDK的界面确实看起来舒服多了,所以我选择了MDK作为我的s3c2440裸机开发的IDE。以下主要介绍一下如何使用MDK配合J-link来调试基于s3c24...

KEIL MDK 5.12帮你快速建工程模板的技巧

KEIL 5帮你快速建工程模板的技巧 本人使用keil mdk 5.12有一段时间了,发现keil mdk 5.12里面驱动库比较方便。这个新功能可以节省我们的时间,也可以让初学者能尽快上手和掌握这个芯片。大家以后既就可以很方便的建自己的工程模板了,再也不会为了找芯片的驱动库而烦恼。 今天外我来教大家来怎么使用这个建工程的利器吧。 首先是新建工程吧,如下图...

STM32CubeMX自建MDK工程的基本步骤

    根据需要调节各总线频率     最下方选项,√去掉,不用实时更新库,选择自己库所在路径就好。   点击左侧, 选择"Code Generator", 选择.c 和 .h文件不分开 最后,点击"GENERATE CODE"生成项目代码。   打开生成的项目代码,如下图所示,进行简要说明 点击编译项目文件(通常"0 Error(s) , 0 W...

【STM32】MDK中寄存器地址名称映射分析

对于MCU,一切底层配置,最终都是在配置寄存器 51单片机访问地址 51单片机经常会引用一个reg51.h的头文件。下面看看它是怎么把名字和寄存器联系在一起的: 1 sfr p0=0x80; 2 p0=0x00; sfr是一种扩充数据类型,使用一个内存单位,值域为0-255.利用它可以访问51单片机内部所有的特殊功能寄存器。前一句“sfr p0=0x80”...

Keil MDK使用J-LINK分别在Sram,Nor Flash以及Sdram中调试代码的原理和方法

一、概述 MDK开发ARM裸机程序时,在调试阶段通常是先让程序在SDRAM中执行,以加快调试速度,也避免频繁烧写Nor Flash,因此需要知道如何指定程序在哪个位置执行。本文以realarm 2410开发板为例,进行描述。该开发板使用S3C2410A做为CPU,有2MB的 Nor Flash,以及64MB的SDRAM,4KB的SRAM。程序可直接在Nor...

2019-2020-1 20175302 201752314 20175316 实验二 固件程序设计

2019-2020-1 20175302 201752314 20175316 实验二 固件程序设计 实验二 固件程序设计-1-MDK 实验内容 0.注意不经老师允许不准烧写自己修改的代码 1.两人(个别三人)一组 2.参考云班课资源中“信息安全系统实验箱指导书.pdf “第一章,1.1-1.5安装MDK,JLink驱动,注意,要用系统管理员身分运行uVi...