疑难杂症之复位重启
代碼如下:
//讀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<rxLen; i++)
{
rxData[i] = appData[3+i];
}
for(i=0; i<txLen; 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做得有點垃圾,根本沒考慮全面,留下如此大坑??磥肀M量不要選用小廠的產品是明智的。有時間進一步研究一下。
memcpy(pData, buf, 4);
總結
- 上一篇: Prototype Pattern(原型
- 下一篇: 设计模式总结之Builder Patte