发现Keil软件的一个小bug,已经核实无误!
Keil软件模拟运行时,其中ATMEL公司的AT89C51SND1这款芯片的两个内部寄存器地址定义错误,将BRL、BDRCON寄存器地址错误的定义成了0x9A、0x9B,正确地址应该是0x91、0x92.
导致在软件模拟仿真时凡是涉及这两个寄存器的操作都将无效,并且由于错误可能还会出现误操作。
现在还没找到可行的解决办法,仔细看了Keil的系统文件,似乎并没有开放更改此地址的接口,但应该可以通过更改系统的二进制文件实现,不过我还没找到究竟应该改哪里!
现在的一个解决方法是将错就错,将这两个寄存器的地址定义改为错误的0x9A、0x9B即可,待实际下载运行时再更正过来!
如果有可以直接更正的方法,望一定赐教!
配置文件可以这样写,方便开发工作的进行: #ifndef keil_debug Sfr (BRL , 0x91); // 正确的定义 Sfr (BDRCON , 0x92); #else Sfr (BRL , 0x9A); // 这是错误的地址定义,仅调试时用,Keil的仿真文件错了 Sfr (BDRCON , 0x9B); #endif
在电脑上模拟运行时,增加一行: #define keil_debug 实际下载前再次编译,并取消此定义即可。
本人不才,这个问题我差不多花了一整天的时间才给找出来,实在太难找了,尤其当你使用内部专用的波特率发生器并且使用printf函数时,仿真时将必死无疑!就死在这个printf函数里!而且最让你郁闷的事情是,模拟运行不行,但实际运行却正确无误!如果你对自己的代码不确信,总相信电脑,一直想让它能仿真通过的话,那不知要浪费多少时间了!所以,千万别迷信电脑,也不能迷信大名鼎鼎的Keil!
我所知道的受影响版本至少是8.02和8.16A版,其它版本我没试了!
我也搜索到有人因为此问题发帖,希望对你有用,有用留个言啊^_^ 最郁闷的时候发的贴:https://bbs.21ic.com/club/bbs/ShowAnnounce.asp?id=3257336这里谢谢三位朋友的回复,就是这个问题,终于找到了! |