打印

51的软件仿真和硬件仿真结果不一样!

[复制链接]
6464|31
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
快乐小小鱼|  楼主 | 2012-7-26 18:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
快乐小小鱼|  楼主 | 2012-7-26 19:58 | 只看该作者
void ArrayHEXtoBCD (uint8 *address,uint32 tdat,uint8 num)
{
   switch (num)
   {
      case 5:
         *(address+4) = HEXtoBCD(tdat/100000000l);
      case 4:
         tdat %= 100000000;
         *(address+3) = HEXtoBCD(tdat/1000000l);
      case 3:
         tdat %= 1000000;
         *(address+2) = HEXtoBCD(tdat/10000l);
      case 2:
         tdat %= 10000;
         *(address+1) = HEXtoBCD(tdat/100);
      case 1:
         tdat %= 100;
         *address = HEXtoBCD(tdat);
         break;
      default:
         break;
   }
}

uint32 ArrayBCDtoHEX (uint8 *addr,uint8 num)
{
   uint32 ww=0;
   uint32 jj=0;
   
   switch (num)
   {
      case 5:
             jj=BCDtoHEX(*(addr+4));
         jj=jj*100000000;
         ww=jj;
      case 4:
         jj=BCDtoHEX(*(addr+3));
         jj=jj*1000000;
         ww=ww+jj;
      case 3:
         jj=BCDtoHEX(*(addr+2));
         jj=jj*10000;
         ww=ww+jj;
      case 2:
         jj=BCDtoHEX(*(addr+1));
         jj=jj*100;
         ww=ww+jj;
      case 1:
         ww=ww+BCDtoHEX(*addr);
      default:break;
   }
   return ww;
}

void main(void)
{
uint8 cur_val[4];
ArrayHEXtoBCD(cur_val,Currentval,4);
}
就是上面的代码,软仿真和实际仿真结果不一样,大家帮我看看!呵呵,或许不应该让单片机做这么复杂的运算,但是是别人的程序,自己也不想改动,找找毛病吧!

使用特权

评论回复
板凳
快乐小小鱼|  楼主 | 2012-7-26 19:59 | 只看该作者
还落下了一个函数,是这个
uint8 HEXtoBCD(uint8 tdat)
{
   return ((tdat/10)*16 + tdat%10);
}

使用特权

评论回复
地板
快乐小小鱼|  楼主 | 2012-7-26 20:03 | 只看该作者
这段程序是这样的,如果Currentval = 123456,这样十进制的数据,要两位组合,把12变成0x12保存到cur_val[2]中,把34变成0x34保存到cur_val[1]中,把56变成0x56保存到cur_val[0]中!
软件仿真结果是对的,但是硬件实际仿真结果却不是这样的!

使用特权

评论回复
5
NE5532| | 2012-7-26 20:05 | 只看该作者
办法就是不要仿真,直接跑了看结果。
从楼主这个程序看,应该是纯软件算法,应该相信软件仿真。
这个故事也告诉我们,仿真是卵的,实际跑的才是王道。

使用特权

评论回复
6
快乐小小鱼|  楼主 | 2012-7-26 21:33 | 只看该作者
void ArrayHEXtoBCD (uint8 *address,uint32 tdat,uint8 num)
{
   switch (num)
   {
      case 5:
         *(address+4) = HEXtoBCD(tdat/100000000l);
      case 4:
         tdat %= 100000000;
         *(address+3) = HEXtoBCD(tdat/1000000l);
      case 3:
         tdat %= 1000000;
         *(address+2) = HEXtoBCD(tdat/10000l);
      case 2:
         tdat %= 10000;
         *(address+1) = HEXtoBCD(tdat/100);
      case 1:
         tdat %= 100;
         *address = HEXtoBCD(tdat);
         break;
      default:
         break;
   }
}

硬件仿真发现这段程序没有被执行,一进去,就到最后的结束大括号了,软仿真结果是对的,不知道怎么回事,很奇怪,是不是哪里没有设置好!

使用特权

评论回复
7
aihe| | 2012-7-26 21:59 | 只看该作者
看编译后的汇编文件,和单步调试

使用特权

评论回复
8
快乐小小鱼|  楼主 | 2012-7-26 22:32 | 只看该作者
ArrayHEXtoBCD(cur_val,Currentval,4);
这个函数是传递的4进去,但是进入switch (num)后,看num =0x35,也就是传递进去的4没有被传递进去,怎么还有这样的事情呢?

使用特权

评论回复
9
快乐小小鱼|  楼主 | 2012-7-26 22:33 | 只看该作者
谢谢aihe,目前还不会看汇编文件找问题!

使用特权

评论回复
10
不起眼| | 2012-7-26 22:34 | 只看该作者
每个case都应该有break
      再试试

使用特权

评论回复
11
快乐小小鱼|  楼主 | 2012-7-26 22:43 | 只看该作者
ArrayHEXtoBCD(cur_val,Currentval,4);
这个函数是传递的4进去,但是进入switch (num)后,看num =0x35,也就是传递进去的4没有被传递进去,怎么还有这样的事情呢?

是这个原因,函数参数没有传递进去,这个是什么引起的呢?该从哪些方面分析原因呢?
是代码优化选择错误呢?还是堆栈出问题呢?

使用特权

评论回复
12
2009gxs| | 2012-7-27 08:15 | 只看该作者
参考10#的说法试试

另外 多试一些数据 以便找到更多的信息。

使用特权

评论回复
13
快乐小小鱼|  楼主 | 2012-7-27 09:02 | 只看该作者
不要break,就是要从上面往下执行的!case根本进不去,因为我传递的参数没有被写入,这是我仿真单步调试发现的!呵呵,很奇怪吧!

使用特权

评论回复
14
dlyt_test001| | 2012-7-27 09:59 | 只看该作者
10楼和12楼已经告诉你问题点了,你不去做,才叫“很奇怪”!

使用特权

评论回复
15
yiucing| | 2012-7-27 10:18 | 只看该作者
10楼和12楼已经告诉你问题点了,你不去做,才叫“很奇怪”!
dlyt_test001 发表于 2012-7-27 09:59

楼主没错啊
本来就不应加break

使用特权

评论回复
16
快乐小小鱼|  楼主 | 2012-7-27 11:27 | 只看该作者
原因找到了,是我设置错了,我用的是64K的flash,在keill的target选项中选择的memory model:compact variables in pdata,在code run size:选择的是 compact 2K function,64k rom,
现在把这两个选项都改成 large的那个选项就可以了!

使用特权

评论回复
17
快乐小小鱼|  楼主 | 2012-7-27 11:28 | 只看该作者
谢谢大家的回复,我结贴了!希望大家不要像我一样,没有设置好keill而犯错!

使用特权

评论回复
18
fjzzclc| | 2012-7-27 11:48 | 只看该作者
学习了

使用特权

评论回复
19
hp34401a| | 2012-7-27 12:27 | 只看该作者
顶17楼,吸取经验,才能少走弯路。

使用特权

评论回复
20
NE5532| | 2012-7-27 12:51 | 只看该作者
谢谢大家的回复,我结贴了!希望大家不要像我一样,没有设置好keill而犯错!
快乐小小鱼 发表于 2012-7-27 11:28


我觉得你总结错了,应该是不用仿真就没这当子事了。

使用特权

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

本版积分规则

14

主题

190

帖子

8

粉丝