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

[复制链接]
7589|31
 楼主| 快乐小小鱼 发表于 2012-7-26 18:34 | 显示全部楼层 |阅读模式
51程序的仿真,软仿真和硬仿真结果不一样,一般要从哪些方面找原因呢?
谢谢大家提意见!
 楼主| 快乐小小鱼 发表于 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]中!
软件仿真结果是对的,但是硬件实际仿真结果却不是这样的!
NE5532 发表于 2012-7-26 20:05 | 显示全部楼层
办法就是不要仿真,直接跑了看结果。
从楼主这个程序看,应该是纯软件算法,应该相信软件仿真。
这个故事也告诉我们,仿真是卵的,实际跑的才是王道。
 楼主| 快乐小小鱼 发表于 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;
   }
}

硬件仿真发现这段程序没有被执行,一进去,就到最后的结束大括号了,软仿真结果是对的,不知道怎么回事,很奇怪,是不是哪里没有设置好!
aihe 发表于 2012-7-26 21:59 | 显示全部楼层
看编译后的汇编文件,和单步调试
 楼主| 快乐小小鱼 发表于 2012-7-26 22:32 | 显示全部楼层
ArrayHEXtoBCD(cur_val,Currentval,4);
这个函数是传递的4进去,但是进入switch (num)后,看num =0x35,也就是传递进去的4没有被传递进去,怎么还有这样的事情呢?
 楼主| 快乐小小鱼 发表于 2012-7-26 22:33 | 显示全部楼层
谢谢aihe,目前还不会看汇编文件找问题!
不起眼 发表于 2012-7-26 22:34 | 显示全部楼层
每个case都应该有break
      再试试
 楼主| 快乐小小鱼 发表于 2012-7-26 22:43 | 显示全部楼层
ArrayHEXtoBCD(cur_val,Currentval,4);
这个函数是传递的4进去,但是进入switch (num)后,看num =0x35,也就是传递进去的4没有被传递进去,怎么还有这样的事情呢?

是这个原因,函数参数没有传递进去,这个是什么引起的呢?该从哪些方面分析原因呢?
是代码优化选择错误呢?还是堆栈出问题呢?
2009gxs 发表于 2012-7-27 08:15 | 显示全部楼层
参考10#的说法试试

另外 多试一些数据 以便找到更多的信息。
 楼主| 快乐小小鱼 发表于 2012-7-27 09:02 | 显示全部楼层
不要break,就是要从上面往下执行的!case根本进不去,因为我传递的参数没有被写入,这是我仿真单步调试发现的!呵呵,很奇怪吧!
dlyt_test001 发表于 2012-7-27 09:59 | 显示全部楼层
10楼和12楼已经告诉你问题点了,你不去做,才叫“很奇怪”!
yiucing 发表于 2012-7-27 10:18 | 显示全部楼层
10楼和12楼已经告诉你问题点了,你不去做,才叫“很奇怪”!
dlyt_test001 发表于 2012-7-27 09:59

楼主没错啊
本来就不应加break
 楼主| 快乐小小鱼 发表于 2012-7-27 11:27 | 显示全部楼层
原因找到了,是我设置错了,我用的是64K的flash,在keill的target选项中选择的memory model:compact variables in pdata,在code run size:选择的是 compact 2K function,64k rom,
现在把这两个选项都改成 large的那个选项就可以了!
 楼主| 快乐小小鱼 发表于 2012-7-27 11:28 | 显示全部楼层
谢谢大家的回复,我结贴了!希望大家不要像我一样,没有设置好keill而犯错!
fjzzclc 发表于 2012-7-27 11:48 | 显示全部楼层
学习了
hp34401a 发表于 2012-7-27 12:27 | 显示全部楼层
顶17楼,吸取经验,才能少走弯路。
NE5532 发表于 2012-7-27 12:51 | 显示全部楼层
谢谢大家的回复,我结贴了!希望大家不要像我一样,没有设置好keill而犯错!
快乐小小鱼 发表于 2012-7-27 11:28


我觉得你总结错了,应该是不用仿真就没这当子事了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

194

帖子

8

粉丝
快速回复 在线客服 返回列表 返回顶部