⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 drv_errbook.c

📁 motorola mpc系列 mpc852cpu bsp
💻 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 + -