找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3630|回复: 1
打印 上一主题 下一主题
收起左侧

keil c51单片机中调用一个已声明但未定义的函数,发生的一个奇怪的问题

[复制链接]
跳转到指定楼层
楼主
如题,今天在调单片机程序的时候(用的stc89c51),声明了很多函数,但有一个忘记写函数体,在主程序中调用,只报了警告,于是并没有上心,急急忙忙下程序到单片机,发现程序不能正常运行。。。抓耳挠腮了半个小时(点击警告不能定位),才发现有一个函数没有写函数体,写上函数体后,程序正常执行。索性来了兴趣,为什么程序会不正常执行,写了一段测试程序,如图: 仿真中运行发现编译器对于仅声明的函数,会将其地址指向0x0000,也就是主程序的入口main,每当程序执行到这个仅有声明的“函数”时,就会从0000从新开始。。。。貌似发现了新大陆?stc89c51的软复位?但其实我并不知道原理,也不是很了解汇编,为何会这样。。。。求大佬指点。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:387733 发表于 2018-10-15 07:10 | 只看该作者
软件编译有两个步骤,第一步对各个模块编译,因为编译过程中地址是无法定位的,过程中对于所有不能定位的地址,包括已经申明过的地址指向暂用“0000”占位。第二步是将各个编译好的模块连接定位,将编译时预留的“0000”用实际地址替换掉。如果只有声明,没有函数体,那么在连接时就无法定位实际地址,所以仍保留“0000”,这时系统会给出警告,因此对于有些警告必须重视,否则会引起麻烦。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表