Keil C51集成开发环境下编译代码后生成的.map文件包含许多有用的信息,而笔者在近日通过查看.map文件来查看各部分代码的空间使用的情况的时候,在.map文件中看到了一些奇怪的符号:
咦,编译器在编译代码的时候竟然链接了这些看起来是“库”的文件,那这些文件又是谁调用的呢?为什么编译器会调用这些库呢?要解答这些疑问,我们需要再仔细看看这些.map文件提供的信息。
从底部往上查看.map文件,我们会发现一连串的变量左侧都有这个VALUE值,而且看起来这个数值很有规律像是统一存放在一个地方的,那我们不妨猜测这个就是编译器编译后模块和指令存放的地址。现在需要的就是想办法证实这一个观点:
点击DEBUG->在反汇编窗口中找到对应的地址,以如下库为例进行查找:
寻找地址0x07B
果然,我们在0x07B的地址上找到了这个库的调用,说明.map文件中的那个value的值确实是对应的地址,而想要知道到底在哪里有调用这个库就需要再进一步的跟进:
1、首先我们需要打开Call Stack窗口
2、在刚刚查到的地址上设下断点
3、run!让程序跑起来,直到到达断点处停止运行后再查看Call Stack窗口
这是示例代码中停在断点位置后的栈的情况,由这个图我们可以知道在调用这个库之前执行了cal_bat_cap(),battery_handle_100ms,ui_handle_100ms这3个函数,并且发现cal_bat_cap()函数这里有个“+”号,我们点开来看看:
看来在这几个函数里面,就这个函数内有变量的操作,再加上C?UIDIV是除法库,那答案已经呼之欲出了,我们顺藤摸瓜,找到这个函数看看
可以看到里面确实有进行除法操作,且使用的是无符号类型的变量,所以这个C?UIDIV是无符号的除法库。到此,我们找到了这个库在代码里的调用位置。
当我们知道代码里哪里有使用这些库后,我们就可以通过修改代码来减少这些库的调用,比如无符号除法库和有符号除法库是两个库,是否可以节省一个;是否可以去掉指针的操作来节省指针调用库….从而达到优化代码空间的地步。
原创文章,转发请注明出处。昇生微电子,www.sinhmicro.com。