【MCS-51】【C51】C51中犯的低级错误的后果

         C51中犯的低级错误的后果

         其实程序是好几天前就写好的,程序下载运行都没有什么问题。

         程序原本的大部分操作都是在主函数Main中写的,为了让程序看起来更直观,于是就把其中的操作全部封装到一个函数中。封装好了之后,编译了下没有错误(不过有几个警告)。因为编译没有错误,所以就没有过多的关心其中的警告,也没有去把程序下载到开发板运行。

         在这几天内去学习其他的东西去了,一直到前天编程过程中查资料时,看到一种好方法可能适用于该程序,就赶紧拿出出错的程序(程序修改过后)对其改造。改造完成后,编译无错有警告。没有过多的注意警告直接下载运行,即没有得到想到中的效果,也没得得到最开始无错程序的结果A。怀疑是新方法的问题,遂修改了改造的部分为原错误程序。修改完后,下载了原错误程序的编译结果运行,还是一样没有显示正确结果。

         面对有错的程序,首先想到的是反编译看看汇编,明白大致后就用反汇编代码重建工程,编译运行后和前面一样。然后直接单步仿真调试发现汇编直接跳到一个表示为Q0296的位置,但是又找不到这个位置。于是前天晚上利用睡觉的时间详细看了汇编代码,发现“跳转到Q0296”前后的一段代码就是程序中建立的一些表(也就是汇编中的DB表)(这个是反汇编器反汇编的问题)。本以为是这些表嵌在程序代码中间对程序有干扰,于是直接修改HEX文件,将表全部移到程序的最后,但是下载运行还是一样的结果。

        昨天又看了几个小时,下载运行毫无起色。途中因为忙其他事情,没有继续看,知道今天早晨才接着看。 重新编译C的代码,就发现了如下问题(其实是老问题,只不过之前没有关注)。

         于是在网上搜索“reference made to unresolved external”警告,看到一条答案如下:(网址http://zhidao.baidu.com/question/233943406.html

         按照上面的提示,首先排除了extern声明的问题,然后直接搜索程序中“不存在的空函数”。很快就发现有个函数的函数名错误(函数名多了个字母,这个函数就是在无错程序上封装主函数中操作的函数),编译后无错无警告,下载运行正常。

 

        深思后发现,其实这次调试过程中,有很多次都可以判断出程序的问题。如,编译后直接软件仿真单步调试下程序,就可以发现程序只是一味的在初始化,根本就没有进入过程序的核心,而我只是盲目的下载程序到开发板。并且还一度以为是编译器的问题,曾换过几个编译器。就差找网友帮忙调试了。

       

总结:a.程序达不到运行效果,不要盲目修改下载,先单步调试通过后下载运行;b.程序无错达不到效果,多注意下警告提示。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值