yelang1124 发表于 2014-2-12 22:37:50

C8051F,在xdata中放CRC的常量数组数据会丢失,modbus CRC表数....

static const UCHAR aucCRCHi[] = {
    0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
    0x00, 0xC1, 0x81,
    0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81,
    0x40, 0x01, 0xC0,
    0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1,
    0x81, 0x40, 0x01,
    0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01,
    0xC0, 0x80, 0x41,
    0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
    0x00, 0xC1,
static const UCHAR aucCRCLo[] = {
    0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7,
    0x05, 0xC5, 0xC4,
    0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB,
    0x0B, 0xC9, 0x09,
    0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE,
    0xDF, 0x1F, 0xDD,
    0x1D, 0x1C, 0xDC, 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2,
    0x12, 0x13, 0xD3,
    0x11, 0xD1, 0xD0, 0x10, 0xF0,
USHORT
usMBCRC16( UCHAR * pucFrame, USHORT usLen )
{
    UCHAR         ucCRCHi = 0xFF;
    UCHAR         ucCRCLo = 0xFF;
    int             iIndex;

    while( usLen-- )
    {
      iIndex = ucCRCLo ^ *( pucFrame++ );
      ucCRCLo = ucCRCHi ^ pgm_read_byte( &aucCRCHi );
      ucCRCHi = pgm_read_byte( &aucCRCLo );;
    }
    return ucCRCHi << 8 | ucCRCLo;
}

我用的C8051F041,把上面两个常量数组表放在的xdata存储区。

但我发现,程序运行一段时间后,发现CRC校验出错,最终确认是aucCRCHi这个数组中的内容无缘无故被改变了,这个时候全局中断是关的啊,整个程序就在这里读一下,又没写的地方,数据怎么会改变了呢?

KongQuan 发表于 2014-2-12 23:06:18

既然是表格,为何不放在code中?

yelang1124 发表于 2014-2-12 23:16:55

KongQuan 发表于 2014-2-12 23:06
既然是表格,为何不放在code中?

请问C8051f 可以像51那样使用 uchar code aa[],这样的方式来把数组放在 flash中吗? 我这样定义了一下,发现还是在XDATA中,我用的large模式,我看C8051f 存在对FLASH的读写函数,难道必须用读写flash函数实现?

咖啡可乐 发表于 2014-2-12 23:28:46

keil c51 对const处理还是放到ram里
放到rom里需要使用code

mhw 发表于 2014-2-13 09:16:24

有些模块如USB,会自动占用XDATA空间……你查找确认一下。
逐个模块屏蔽,直到只保留一个main和计算CRC的函数,反复计算……

lnskngdc 发表于 2014-2-13 09:33:31

有没有溢出?有没有数组越界?

yelang1124 发表于 2014-2-13 17:02:02

最后还是使用code关键字,把它放在flash中解决了,xdata具体原因也不想找了,还是放在code中合理一点
页: [1]
查看完整版本: C8051F,在xdata中放CRC的常量数组数据会丢失,modbus CRC表数....