📄 drv_errbook.c
字号:
#include "typedef.h"
#include "config.h"
#include "bsp.h"
#include "Drv_crc.h"
#include "Drv_ErrBook.h"
extern void BSP_GetTimeDetail(_U32 *ulTick, _U32 *ulUsec);
_U32 myTestCount = 10;
void testme()
{
_U32 i;
for (i = 0; i < myTestCount;i++)
{
Drv_ErrBookToFile(100,100,100,100);
}
}
/* 每次启动最大记录256条,超过的部分不覆盖前面的。
一共记录10次启动记录,超过的部分覆盖前面的。
每条记录占用40个BYTEs,一共占用
256*10*40 = 102400 = 100k!
记录的管理头部占用 52个BYTEs。*/
#if 0
void Drv_ErrBookToFile(_U32 ulLine, _U32 ulErrNo, _U32 Param1, _U32 Param2)
{
//调试时先不用此功能
}
#endif
#if 1
void Drv_ErrBookToFile(_U32 ulLine, _U32 ulErrNo, _U32 Param1, _U32 Param2)
{
Drv_ErrLogStruct_S stErr;
Drv_ErrLogManageStruct_S stManage;
static _U32 BspErrLogStart = 0;
_U32 ulAddr;
BSP_GetTimeDetail(&(stErr.ulTickCnt), &(stErr.ulUsec));
stErr.ulErrNo = ulErrNo;
stErr.ulLineNo = ulLine;
stErr.ulParam1 = Param1;
stErr.ulParam2 = Param2;
BSP_GetCallersPC(stErr.ulPc, 4);
Drv_Print("\r\n Err : 0x%x, line : %d, tick : %d, usec : %d, p1 : 0x%x, p2 : 0x%x",
stErr.ulErrNo,stErr.ulLineNo,stErr.ulTickCnt,stErr.ulUsec, stErr.ulParam1, stErr.ulParam2);
Drv_Print("\r\n pc1 : 0x%x pc2 : 0x%x, pc3 : 0x%x pc4 : 0x%x",
stErr.ulPc[0],stErr.ulPc[1],stErr.ulPc[2],stErr.ulPc[3]);
(void)Drv_ReadFlash(DRV_ERROR_LOG_HEAD_ADDRESS, sizeof(Drv_ErrLogManageStruct_S),
(_U32)&stManage);
if (stManage.Crc != CalcCrc((_U8*)&stManage, sizeof(Drv_ErrLogManageStruct_S) - 4))
{
memset((void *)(&stManage), 0, sizeof(Drv_ErrLogManageStruct_S));
}
if (BspErrLogStart == 0)
{
BspErrLogStart++;
stManage.ulCurLogNo = 0;
stManage.ulCurPartNo++;
if (stManage.ulCurPartNo >= 10 ) /* 0 ~ 9 共10次*/
{
stManage.ulCurPartNo = 0;
stManage.ulMaxLogNoPerPart[stManage.ulCurPartNo] = 1;
}
}
else
{
stManage.ulCurLogNo++;
stManage.ulMaxLogNoPerPart[stManage.ulCurPartNo] = stManage.ulCurLogNo + 1;
if (stManage.ulCurLogNo >= DRV_ERR_MAX_LOG_PER_BLOCK )
{
return;
}
}
stManage.Crc = CalcCrc((_U8*)&stManage, sizeof(Drv_ErrLogManageStruct_S) - 4);
Drv_Print("\r\n ulCurLogNo : %d, ulCurPartNo : %d", stManage.ulCurLogNo,stManage.ulCurPartNo);
(void)Drv_WriteFlash(DRV_ERROR_LOG_HEAD_ADDRESS,
sizeof(Drv_ErrLogManageStruct_S), (_U32)&stManage);
Drv_Print("\r\n Write head to flash in address : 0x%x", DRV_ERROR_LOG_HEAD_ADDRESS);
ulAddr = DRV_ERROR_LOG_ADDRESS +
(stManage.ulCurPartNo * DRV_ERR_MAX_LOG_PER_BLOCK + stManage.ulCurLogNo) * sizeof(Drv_ErrLogStruct_S);
(void)Drv_WriteFlash(ulAddr, sizeof(Drv_ErrLogStruct_S), (_U32)&stErr);
Drv_Print("\r\n Write content to flash in address : 0x%x ", ulAddr);
}
#endif
_U32 Drv_ErrGetLog(char *pData)
{
Drv_ErrLogManageStruct_S stManage;
Drv_ErrLogStruct_S *pLogAddr, stOutLog;
_U32 i;
pData[0] = 0;
(void)Drv_ReadFlash(DRV_ERROR_LOG_HEAD_ADDRESS, sizeof(Drv_ErrLogManageStruct_S),
(_U32)&stManage);
sprintf(pData,"\r\n Current error log recorded in block %ld, total %ld errors:\r\n",
stManage.ulCurPartNo, stManage.ulCurLogNo);
pLogAddr = (Drv_ErrLogStruct_S *)(DRV_ERROR_LOG_ADDRESS
+ (stManage.ulCurPartNo * DRV_ERR_MAX_LOG_PER_BLOCK)
* sizeof(Drv_ErrLogStruct_S));
for (i = 0; i < stManage.ulCurLogNo; i++)
{
Drv_Print("\r\n Read log Addr is 0x%x",(_U32)pLogAddr);
(void)Drv_ReadFlash((_U32)pLogAddr, sizeof(Drv_ErrLogStruct_S), (_U32)&stOutLog);
sprintf(pData + strlen(pData),
"\r\n <%3ld>: Error 0x%-8lx, occured in line %-4ld at %ld ticks %ld microsecond.",
i, stOutLog.ulErrNo, stOutLog.ulLineNo, stOutLog.ulTickCnt, stOutLog.ulUsec);
sprintf(pData + strlen(pData),
"\r\n Call PC pointer is 0x%lx, 0x%lx, 0x%lx, 0x%lx",
stOutLog.ulPc[0], stOutLog.ulPc[1], stOutLog.ulPc[2], stOutLog.ulPc[3]);
switch(stOutLog.ulErrNo)
{
case DRV_ERR_ETNERNET_MALLOC_FAIL:
sprintf(pData + strlen(pData),
"\r\n Ethernet alloc 2048 memory return NULL!");
break;
case DRV_ERR_ETNERNET_FREE_FUNC_IS_NULL:
sprintf(pData + strlen(pData),
"\r\n Ethernet buffer free function is NULL, buffer is 0x%lx!",
stOutLog.ulParam1);
break;
case DRV_ERR_ETNERNET_RXBD_INIT_FAIL:
sprintf(pData + strlen(pData),
"\r\n Ethernet receive bd init failed!");
break;
case DRV_ERR_ETNERNET_TXBD_INIT_FAIL:
sprintf(pData + strlen(pData),
"\r\n Ethernet transmit bd init failed!");
break;
case DRV_ERR_ETNERNET_BD_INIT_FAIL:
sprintf(pData + strlen(pData),
"\r\n Ethernet bd init failed!");
break;
case DRV_ERR_ETNERNET_REG_INIT_FAIL:
sprintf(pData + strlen(pData),
"\r\n Ethernet register init failed!");
break;
case DRV_ERR_ETNERNET_INIT_FAIL:
sprintf(pData + strlen(pData),
"\r\n Ethernet init failed!");
break;
case DRV_ERR_ETNERNET_SEND_BUF_TOO_LONG:
sprintf(pData + strlen(pData),
"\r\n Ethernet send packet too long, buffer(free) is 0x%lx, length is %ld!",
stOutLog.ulParam1, stOutLog.ulParam2);
break;
case DRV_ERR_ETNERNET_DRVINFO_IS_NULL:
sprintf(pData + strlen(pData),
"\r\n Ethernet DrvInfo structure is NULL!");
break;
case DRV_ERR_ETNERNET_SEND_ADDRESS_IS_NULL:
sprintf(pData + strlen(pData),
"\r\n Ethernet send buffer address is NULL!");
break;
case DRV_ERR_ETNERNET_SEND_LENGTH_IS_0:
sprintf(pData + strlen(pData),
"\r\n Ethernet send buffer length is 0!");
break;
case DRV_ERR_ETNERNET_SEND_DATA_LOWER_FREE:
sprintf(pData + strlen(pData),
"\r\n Ethernet send data lower free address, data is 0x%lx, free is 0x%lx!",
stOutLog.ulParam1, stOutLog.ulParam2);
break;
default:
break;
}
pLogAddr++;
}
return SUCCESS;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -