打印

KEIL的BUG??

[复制链接]
2451|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wimhy|  楼主 | 2007-6-29 10:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这两天看了论坛上CRC的相关帖子,自己也调了调,采用的是计算方法求CRC,使用KEIL的软件防真发现了以下问题:
(1)和(2)程序仅两条语句的先后顺序不同,最后观察的结果也不同,想了半天也没有搞懂,各位看看是什么原因啊?

(1)正常的的程序(运行最后结果result=0):
#include    "reg51.h"
#define         uchar    unsigned    char
#define         uint    unsigned     int
uchar        DataBuff [10] = { 0x10,0xff,0x05,0xf9,0x86,0x6d,0xd2,0xe3};
/************************************************************************
函数名称:GetCrc16
函数功能:计算方法得到16位CRC 
         生成多项式: G(X)=X^16 + X^12 + X^5 + 1
输入参数:计算CRC16数组的首地址;数据的长度;
输出参数:16位CRC结果
创建日期:2007.6.28
*************************************************************************/
uint     GetCrc16(uchar *ptr,uchar len) 
{
    uchar    i;
    uint    crc = 0;
    while(len--)
    {
        for(i=0x80; i!=0; i>>=1)
        {
        if((crc&0x8000)!=0) {crc<<=1; crc^=0x1021;} //1-1
        else crc<<=1;                                //1-2
        if((*ptr&i)!=0) crc^=0x1021;                 //1-3
        }
        ptr++;
    }
    return(crc);
}

void main(void)
{

    uint    result;
    result = GetCrc16(DataBuff,8);//求8个字节的CRC.

     DataBuff[9] = (result&0xff);   //CRC低位在后 !!!!!!!!!
    DataBuff[8] = (result>>8)&0xff;//CRC高位在前!!!!!!!!!!就这里和(2)的顺序不同.

    result = GetCrc16(DataBuff,10);

    while(1);
}
(2)有问题的程序(运行最后结果result=0xD100):

#include    "reg51.h"
#define         uchar    unsigned    char
#define         uint    unsigned     int
uchar        DataBuff [10] = { 0x10,0xff,0x05,0xf9,0x86,0x6d,0xd2,0xe3};
/************************************************************************
函数名称:GetCrc16
函数功能:计算方法得到16位CRC 
         生成多项式: G(X)=X^16 + X^12 + X^5 + 1
输入参数:计算CRC16数组的首地址;数据的长度;
输出参数:16位CRC结果
创建日期:2007.6.28
*************************************************************************/
uint     GetCrc16(uchar *ptr,uchar len) 
{
    uchar    i;
    uint    crc = 0;
    while(len--)
    {
        for(i=0x80; i!=0; i>>=1)
        {
        if((crc&0x8000)!=0) {crc<<=1; crc^=0x1021;} //1-1
        else crc<<=1;                                //1-2
        if((*ptr&i)!=0) crc^=0x1021;                 //1-3
        }
        ptr++;
    }
    return(crc);
}

void main(void)
{

    uint    result;
    result = GetCrc16(DataBuff,8);//求8个字节的CRC.

    DataBuff[8] = (result>>8)&0xff;//CRC高位在前  !!!!!!! 
    DataBuff[9] = (result&0xff);   //CRC低位在后  !!!!!!!就这里顺序和(1)不同.
    
    result = GetCrc16(DataBuff,10);

    while(1);
}

相关帖子

沙发
HQGBOY| | 2007-6-29 10:58 | 只看该作者

看汇编了.

使用特权

评论回复
板凳
computer00| | 2007-6-29 11:04 | 只看该作者

对,看看编译后的结果, 也许跟优化等有关。

使用特权

评论回复
地板
电子尘埃| | 2007-6-29 11:38 | 只看该作者

dddddddddd

使用特权

评论回复
5
HWM| | 2007-6-29 11:41 | 只看该作者

类型不一致,数据可能造成了覆盖。

使用特权

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

本版积分规则

16

主题

96

帖子

0

粉丝