疑难杂症之复位重启

代码如下:

//读addmax,delmax值和已读记录数
static U8 CmdDealFaceAndFingerSubReadAddDel(U8 *appData)
{
U8 i;
U8 txLen;
U8 rxLen;
U8 responseLen;
U8 rxData[16];
U8 txData[16];
U8 responseData[32];
U8 dataLen;


U8 offset;


txLen = 16;
rxLen = appData[1] - 4;
for(i=0; i {
rxData[i] = appData[3+i];
}
for(i=0; i {
txData[i] = 0xff;
}
dataLen = rxLen-1;//核心数据长度


offset = 3;
txData[0] = appData[offset+0];//功能号




FingerIdReadAddVal((U8 *)(&txData[0]));
FingerIdReadDelVal((U8 *)(&txData[4]));
FingerIdReadAlrNum((U8 *)(&txData[8]));


/*
这样写编译器会出问题
FingerIdReadAddVal((U8 *)(&txData[1]));
FingerIdReadDelVal((U8 *)(&txData[5]));
FingerIdReadAlrNum((U8 *)(&txData[9]));
*/


/*
这样写编译器会出问题
//FingerIdReadAddVal(txData+1);
//FingerIdReadDelVal(txData+5);
//FingerIdReadAlrNum(txData+9);

*/




进一步跟踪出问题的函数:

void FingerIdReadAddVal(U8 *pData)
{
Read_AddVal(FILE_3, (U8 *)pData);
}








void FingerIdReadDelVal(U8 *pData)
{
Read_DELVal(FILE_3, (U8 *)pData);

}


void Read_AddVal(u8 fileNo,u8 *pData)
{
     u16 ret;
     u16 addr;
     u8  buf[5];
     addr = ADDVAL_EEPROM_ADDR + fileNo*5;
     at24cxx_read(addr, buf, 5);
     if(!DeCkSum(buf, 4))
     {        
        memcpy(pData, buf, 4);
     }
     else
     {
        memset(pData,0,4);
     }
     log_debug(("Read Add Val %lx from EEPROM %x\n",*((u32 *)pData),addr));
     

}



根据经验:问题应该是出在这个库函数上。估计小厂的sdk做得有点垃圾,根本没考虑全面,留下如此大坑。看来尽量不要选用小厂的产品是明智的。有时间进一步研究一下。

memcpy(pData, buf, 4);

你可能感兴趣的:(Airoha1601)