打印

发现Keil软件的一个小bug,想用51造MP3的要看!

[复制链接]
2520|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cnchip|  楼主 | 2009-3-11 22:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
发现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这里谢谢三位朋友的回复,就是这个问题,终于找到了!

相关帖子

沙发
jerkoh| | 2009-3-11 22:36 | 只看该作者

re

这个必须顶起!

使用特权

评论回复
板凳
computer00| | 2009-3-11 22:47 | 只看该作者

嘿嘿,俺都是不仿真,直接烧hex文件进去试的,所以没问题

使用特权

评论回复
地板
未来是梦| | 2009-3-12 01:49 | 只看该作者

re

keil 调试时可以用printf;
但实际运行.我从来不用printf 这个东西;
据说要用printf,就必须设置timer和uart的模式.否则在用模拟调试时serial windows上看不到字;

看了你的代码.
其实你在用printf之前加一句
TMOD |= 0x20;   /* TMOD: timer 1, mode 2, 8-bit reload        */
软件模拟就没问题了,但实际运行就不敢保证了.因为我不知道你以后的代码是否还要用timer1做别的用途?

使用特权

评论回复
5
georgekin203| | 2009-3-12 09:20 | 只看该作者

肯定有bug

传说中的那个补丁你没打吧?就是那个带铅笔的图标的那个

使用特权

评论回复
6
cnchip|  楼主 | 2009-3-12 09:26 | 只看该作者

谢谢未来是梦兄

这个片子内部增加了一个专用的波特率发生器,因此可以不用Time1作为串口的波特率发生器!ATMEL应该也是想把Time1省出来,所以就增加了这个专用的寄存器。

因此我的那个测试程序中是不应该有TR1 = 1;这行代码的,这段程序很早前调试过,当时没仔细检查,所以就有了这行代码。
不好意思,是我的错误!

printf这个函数使用非常方便!
这个函数就是从串口输出的,所以你必须事先设置串口,设置为工作模式1的8-bit UART即可(那个什么9-bit的想必是没有人用的,也没试验过),同时调用printf前把TI置1,printf函数内部实时查询这个位,并实现不定长的数据输出。

谢谢回帖啦。

使用特权

评论回复
7
cnchip|  楼主 | 2009-3-12 09:28 | 只看该作者

那个是中文半字的bug补丁,这个是俺新发现的,嘿嘿。。。

使用特权

评论回复
8
computer00| | 2009-3-12 09:51 | 只看该作者

像这样对于不同芯片的bug多了去了,应该不是keil本身的bug

而是对应的那个芯片的数据库的bug。

我昨天调试AT91SAM7S64芯片时,有些寄存器仿真时说不可写,也有些不可读...

使用特权

评论回复
9
未来是梦| | 2009-3-12 12:59 | 只看该作者

re

算不上bug;
keil不可能对那么多芯片的差异都有对应printf.
比如,printf用到uart,而你的芯片却用专门的波特率发生器而不是timer1或timer2.
我的意思是,printf是按标准内核实现的.只能用timer1.所以会这样.

使用特权

评论回复
10
vrgood| | 2009-3-12 13:10 | 只看该作者

如果只是DEBUG作用,其实波率和串口模式不需要设置的


程序一开始先执行 SBUF=0x00;
以后的printf就正常了。

使用特权

评论回复
11
ayb_ice| | 2009-3-12 20:39 | 只看该作者

如果只是寄存器定义错误

改过来即可,其实各个芯片的头文件一般是由是原厂提供的.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

214

主题

1375

帖子

1

粉丝