请教一个非常奇怪的问题:程序中定义了一个数组mempool,指向该数组的指针MpIsrOut和结构体MInfo及指向该结构体的指针MpIsrInfo,这个结构体和数字都在xdata空间。程序在一个函数中是以该数组指针和结构体指针来访问这两个实体的,在这个函数里,出现了一个非常奇怪的现象:该函数内有以下语句: unsigned char nbytes; unsigned char cnt;
for (cnt = 0; cnt < nbytes; cnt++) { _WriteRawRC2(RegFIFOData, MpIsrOut[MInfo.nBytesSent]); //写数到片外一个地址 MInfo.nBytesSent++; //why???? } 当“MInfo.nBytesSent”用结构体进行访问的时候程序运行正常。 但如果: for (cnt = 0; cnt < nbytes; cnt++) { _WriteRawRC2(RegFIFOData, MpIsrOut[MpIsrInfo->nBytesSent]); //写数到片外一个地址 MpIsrInfo->nBytesSent++; //why???? } 就运行异常,得不到正确结果。其中MpIsrInfo就是指向MInfo的,设断点观察,指针取值没错,取出的数也没有错,但结果却是失败。 奇怪点如下: 1、该函数中其它的地方是用指针,没有问题,只要把这里改成下一方式就出错,改成上一方式就正确。 2、在这个地方就是使用该指针进行一个无关的操作也会带来错误的结果。 3、这里cnt和nbytes指定到xdata空间,前一种方式,也会出错。 4、指针的赋值和其指向确认是没有错的,这里操作不会数组溢出。 5、仿真,烧片结果都是这样。
真的不是我忽悠大家,情况确实如此,不知道我讲清楚没有,我们经理听我的讲述后第一反应是:不可能!我说我也觉得不可能,你去看看吧,然后
来琢磨了半个下午后,很苦恼的说:我也不知道是为什么。。。。 本人已经无奈了,确实看不出来是什么问题,烦请各位高人帮我猜一猜,问题可能出现在那里。
如果搞过mfrc500的人应该能看出这个代码是philip的rc500源码里的,这个语句在那个中断服务函数里,只不过我把它改成查询了,发送一个命令之后不是等待中断的发生,而是不停查询该函数。用上面的语句读卡器能正常寻卡、反碰撞、选卡、读、写,如果后一种方式寻卡都寻不到,该函数中每次都是超时退出,一个字都收不到。这里我单步跟踪了,直到_WriteRawRC2函数内的数都是正确的。 |