摘要
本专栏介绍在Proteus软件中使用汇编语言,8086作为控制器,实现电子时钟。以下是实现功能
这是第三篇,介绍开发过程中的BUG和解决思路
经验
- 保证框架的有效,开发过程中要严格按照框架来编写,这样出错你也不会担心是哪里PUSH还是POP错了,还是数据段定义有问题
- 找到BUG出现在哪里,你的问题就基本解决了,只要你可以把这个BUG表述出来(找到本质原因),基本上都可以找到资料。
- 找BUG不要钻牛角尖,要先广后深,先把每一步都检查一遍,尤其是要对照着原理图排查,有可能是接线与代码不匹配。
- 最好的办法还是去研究BUG产生的原因,而不是一直试试这里,试试那里。这样对学习也有帮助。
- 学会使用调试工具,这一点很重要,至少你要会看存储器数据怎么变化,寄存器存的是什么数据。
- 逐步开发,优先开发显示模块
- 相信你的判断
BUG1
其中有一个很简单的BUG,我想实现当时刻达到闹钟时刻,显示灯就亮这么一个功能,但显示灯怎么也不亮。
逐步排查,发现没有输出信号,看了几遍输出信号的代码,觉得没有问题,就开始研究显示模块。其实这浪费了很多时间。
本质就是我对自己的debug能力,对软件找问题的能力都没有自信,很担心这里出问题,那里出问题,应该对自己保持信心。
之后看输出代码怎么也找不到问题,最后看了一言原理图,发现问题很简单,PB3输出,代码中写的是PB5输出。
为什么出现这个BUG呢,因为数码管的高位在右,和数据是反的。
所以应该对照着原理图排查。
BUG2
最主要的一个BUG,困扰了我很久很久,实在解决不了,我已经换方法了。但最后还是搞清楚了问题所在。
BUG是这样的。我每次按下一个按键,他会触发中断,依次让时分秒开始闪烁,但是这个功能大部分情况下是正常的,有小概率按下以后就整个数码管显示乱码。并且这时候调试,发现CX数据是一个很大的数或者DS段地址居然变了。
这就很难理解,什么操作能让DS段地址改变,一度以为这是软件问题,我都有想法给开发公司提建议了。
总之我尝试了各种方法,包括把子程序的PUSH和POP写的更完整,在各种中断里开中断,关中断。在网上查到的资料说可能是堆栈段溢出,开始改变堆栈段位置,加大堆栈段存储量,但都无济于事。
后来一直尝试,终于发现出现乱码不是随机的。当时钟要进行加一操作(用定时中断)的同时按下这个按键就会出现这种情况。
经过测试发现不在中断里调用延时函数,就不会出现问题。因此这时候才算找到了本质原因。找到了问题,在网上一般可以搜到原因和解决方案。中断里不能延时太久,最好设置标志位,放到主循环里做延时。因为延时太久,会导致下一次的定时中断延误,如果延误到与下一次定时中断相撞,就会出现问题。