【调试经验】Keil C51环境下查询哪里调用了库函数

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。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值