搜索
bottom↓
回复: 6

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

[复制链接]

出0入0汤圆

发表于 2014-2-12 22:37:50 | 显示全部楼层 |阅读模式
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[iIndex] );
        ucCRCHi = pgm_read_byte( &aucCRCLo[iIndex] );;
    }
    return ucCRCHi << 8 | ucCRCLo;
}

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

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

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2014-2-12 23:06:18 | 显示全部楼层
既然是表格,为何不放在code中?

出0入0汤圆

 楼主| 发表于 2014-2-12 23:16:55 | 显示全部楼层
KongQuan 发表于 2014-2-12 23:06
既然是表格,为何不放在code中?

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

出0入0汤圆

发表于 2014-2-12 23:28:46 | 显示全部楼层
keil c51 对const处理还是放到ram里
放到rom里需要使用code  

出0入0汤圆

发表于 2014-2-13 09:16:24 | 显示全部楼层
有些模块如USB,会自动占用XDATA空间……你查找确认一下。
逐个模块屏蔽,直到只保留一个main和计算CRC的函数,反复计算……

出0入0汤圆

发表于 2014-2-13 09:33:31 | 显示全部楼层
有没有溢出?有没有数组越界?

出0入0汤圆

 楼主| 发表于 2014-2-13 17:02:02 | 显示全部楼层
最后还是使用code关键字,把它放在flash中解决了,xdata具体原因也不想找了,还是放在code中合理一点
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 12:30

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表