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


    使用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的链接脚本、以及其他部分源码的展示:

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

    ARM MDK链接脚本参考

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

    /************* 社会的有色眼光是:博士生、研究生、本科生、车间工人; 重点大学高材生、普通院校、二流院校、野鸡大学; 年薪百万、五十万、五万; 这些都只是帽子,可以失败千百次,但我和社会都觉得,人只要成功一次,就能换一顶帽子,只是社会看不见你之前的失败的帽子。 当然,换帽子决不是最终目的,走好自己的路就行。 杭州.大话西游 *******/
  • 相关阅读:
    Markdown语法
    IDEA常用快捷键及基本操作
    这一份MySQL书单,可以帮你搞定90%以上的面试题!
    你真的以为计算机网络不重要吗,这份书单帮你搞定相关面试题!
    学好程序员必知必会的数据结构,这一份书单你值得拥有!
    送你一份Redis书单,以后使用缓存的问题不用再问我啦!
    这本最适合夯实基础的经典 Java 书籍,可能80% 的 Java 程序员没有认真看过!
    荐书在精不在多,推荐一份夯实Java基础的必备书单!
    拿万元月薪必备的书单,学JAVA的程序员必看的5本书!
    8岁上海小学生B站教编程惊动苹果,库克亲送生日祝福
  • 原文地址:https://www.cnblogs.com/happybirthdaytoyou/p/12299992.html
Copyright © 2020-2023  润新知