VOS_VOID PS_Qnode_ResetGetFailProc
(
    VOS_UINT16                          usFileId,
    VOS_UINT16                          usLineId,
    VOS_UINT32                          ulPid
)
{
    PS_QNODE_RESET_STATISTIC_INFO_STRU  *pstResetStatInfo;

    pstResetStatInfo    = &g_stPsQnodeResetStatInfo;

    TTF_LOG3(ulPid, DIAG_MODE_COMM, PS_PRINT_INFO,
                        "PS_Qnode_ResetGetFailProc,stat info, enStartStat %d, usAllocFailCnt %d, usAllocTotolCnt %d! \n",
                        (VOS_INT32)pstResetStatInfo->enStartStat,
                        (VOS_INT32)pstResetStatInfo->usFailCnt,
                        (VOS_INT32)pstResetStatInfo->usTotalStatCnt);

    /* 第一次申请失败且复位使能打开,则开始统计 */
    if ((PS_FALSE == pstResetStatInfo->enStartStat) && (PS_TRUE == PS_QNODE_RESET_SWITCH))
    {
        pstResetStatInfo->enStartStat    = PS_TRUE;
    }

    if (PS_TRUE == pstResetStatInfo->enStartStat)
    {
        pstResetStatInfo->usFailCnt++;
        pstResetStatInfo->usTotalStatCnt++;

        if (PS_QNODE_RESET_TOTAL_STAT_CNT <= pstResetStatInfo->usTotalStatCnt)
        {
            if ((((VOS_UINT32)pstResetStatInfo->usFailCnt * 100 / pstResetStatInfo->usTotalStatCnt ) >=  PS_QNODE_RESET_THRESHOLD)
                    && (PS_TRUE  == PS_QNODE_RESET_SWITCH))
            {
                mdrv_om_system_error(PS_QNODE_GET_SYSTEM_ERROR_ID, usFileId, usLineId, VOS_NULL_PTR, 0);
            }
            else
            {
                TTF_LOG2(ulPid, DIAG_MODE_COMM, PS_PRINT_INFO,
                        "PS_Qnode_ResetGetFailProc,do not rst, usAllocFailCnt %d, usAllocTotolCnt %d! \n",
                        (VOS_INT32)pstResetStatInfo->usFailCnt,
                        (VOS_INT32)pstResetStatInfo->usTotalStatCnt);

                PS_Qnode_ResetStatInfoInit();
            }
        }
    }

    return;

}
VOS_UINT32 NV_Init(VOS_VOID)
{
    VOS_UINT8           aucMagicNum[NV_MAGIC_NUM_LEN];
    VOS_UINT8           aucTemp[NV_MAGIC_NUM_LEN];
    BSP_DDR_SECT_INFO_S   stNVMemInfo;
    BSP_DDR_SECT_QUERY_S  stNVMemQuery;

    g_ulNVInitStartSlice = mdrv_timer_get_normal_timestamp();

    /*lint -e534*/
    VOS_MemSet(g_astNvFileHandle, 0, sizeof(g_astNvFileHandle));

    vos_printf("\r\n---------------------NV_Init Start-----------------------------\r\n");

    VOS_MemSet(aucMagicNum, NV_MAGIC_NUM, NV_MAGIC_NUM_LEN);
    /*lint +e534*/

    stNVMemQuery.enSectType = BSP_DDR_SECT_TYPE_NV;
    stNVMemQuery.ulSectSize = NV_BACKUP_BUFFER_SIZE;
    stNVMemQuery.enSectAttr = BSP_DDR_SECT_ATTR_NONCACHEABLE;

    if(MDRV_OK != mdrv_get_fix_ddr_addr(&stNVMemQuery, &stNVMemInfo))
    {
        /*lint -e534*/
        vos_printf("\r\nNV_Init: Acpu mdrv_get_fix_ddr_addr Failed\r\n");
        /*lint +e534*/

        mdrv_om_system_error(NV_INIT_ERROR, NV_GET_DRV_FIX_DDR_ADDR_FAIL,
                              0, (VOS_CHAR *)VOS_NULL_PTR, 0);

        return NV_INIT_FAIL;
    }

    g_ulNVMemAddr = (VOS_UINT_PTR)mdrv_phy_to_virt(MEM_DDR_MODE, stNVMemInfo.pSectPhysAddr);     /*上层使用虚地址*/

    /* 创建NV写操作保护信号量 */
    if(VOS_OK != VOS_SmMCreate("NV", VOS_SEMA4_PRIOR | VOS_SEMA4_INVERSION_SAFE,
                                &g_ulNVWriteSem))
    {
        return VOS_ERR;
    }

    if(MDRV_OK != mdrv_ipc_sem_create(IPC_SEM_NVIM))
    {
        NV_Printf("NV_Init: Acpu mdrv_ipc_sem_create Failed\r\n");

        return NV_INIT_FAIL;
    }

    /* 等待C 核NV初始化完毕 */
    (VOS_VOID)VOS_SmP(g_ulNVInitSem, 0);

    NV_MEMCPY(aucTemp, (VOS_VOID*)NV_MAGICNUM_ADDR, NV_MAGIC_NUM_LEN);  /*从share memory读取标志字节*/

    if(VOS_OK != VOS_MemCmp(aucMagicNum, aucTemp, NV_MAGIC_NUM_LEN))    /*Ccpu的Nv项已经初始化成功*/
    {
        /* 单板复位 */
        mdrv_om_system_error(NV_INIT_ERROR, NV_GET_CCORE_MAGIC_NUM_FAIL,
                             0, (VOS_CHAR *)VOS_NULL_PTR, 0);
    }

    NV_BuildGlobalVar();

    /*lint -e534*/
    vos_printf("\r\n---------------------NV_Init End-----------------------------\r\n");
    /*lint +e534*/

    g_ulNVInitEndSlice = mdrv_timer_get_normal_timestamp();

    DRV_MSP_PROC_REG(OM_READ_NV_PROC, (BSP_MspProc)NV_ReadEx);

    /* 检测是否开启NV写操作记录跟踪 */
    if (NV_OK != NV_ReadEx(MODEM_ID_0, en_NV_Item_Write_Slice_Record_Flag, (VOS_VOID*)&g_ulRecordNvFlag, sizeof(g_ulRecordNvFlag)))
    {
        g_ulRecordNvFlag = 0;
    }

    return NV_OK;
}
/*****************************************************************************
 Function Name   : diag_ReleaseLogMem
 Description     : 释放从缓冲区中分配连续的物理内存
 Input           :DIAG_BUF_CTRL_STRU *pstBufCtrl
                VOS_UINT8 *pAddr
                VOS_INT32 lLen
 Output          : None
 Return          : VOS_UINT32

 History         :
    1.w00182550      2012-12-18  Draft Enact

*****************************************************************************/
VOS_UINT32 diag_ReleaseLogMem(DIAG_BUF_CTRL_STRU *pstBufCtrl,VOS_UINT8 *pAddr, VOS_INT32 lLen)
{
    VOS_INT32                           lUsedSize;
    VOS_INT32                           lTmpRls;

    /* 如果当前处于中断上下文,则复位系统,诊断接口不允许在中断中使用*/
    if(VOS_FALSE != VOS_CheckInterrupt())
    {
        mdrv_om_system_error(DIAG_CALLED_IN_IRQ, MSP_FILE_ID_DIAG_BUF_CTRL_C, __LINE__, VOS_NULL, 0);/*lint !e569*/
    }
    /* 输入参数检测 */
    if ((VOS_NULL_PTR == pstBufCtrl) || (lLen >= pstBufCtrl->lBufSize))
    {
        diag_printf("diag_ReleaseLogMem:入参不对,lLen=%d!\n",lLen);
        return ERR_MSP_FAILURE;
    }

    /* 释放内存地址进行检测 */
    if ((pAddr != (pstBufCtrl->pucBuf + pstBufCtrl->lRelease))
        && (pAddr != pstBufCtrl->pucBuf))
    {
        diag_printf("diag_ReleaseLogMem:待释放地址不对!pAddr=%p,pstBufCtrl->pucBuf=%p,pstBufCtrl->lRelease=0x%x\n",
                    pAddr,pstBufCtrl->pucBuf,pstBufCtrl->lRelease);
        /*DRV_SYSTEM_ERROR(DIAG_REALSE_POINTER_ERROR, MSP_FILE_ID_DIAG_BUF_CTRL_C, __LINE__, VOS_NULL, 0);*//*lint !e569*/
    }

    /* 未回卷 */
    if (pstBufCtrl->lAlloc >= pstBufCtrl->lRelease)
    {
        lUsedSize = pstBufCtrl->lAlloc - pstBufCtrl->lRelease;

        /* 长度错误 */
        if (lUsedSize < lLen)
        {
            diag_printf("diag_ReleaseLogMem:使用长度小于待释放长度!lAlloc=0x%x,lRelease=0x%x,lLen=%d!\n",
                        pstBufCtrl->lAlloc,pstBufCtrl->lRelease,lLen);
            return ERR_MSP_FAILURE;
        }

        pstBufCtrl->lRelease = pAddr + lLen - pstBufCtrl->pucBuf;

        return ERR_MSP_SUCCESS;
    }

    if ((pAddr - pstBufCtrl->pucBuf + lLen) > pstBufCtrl->lBufSize)
    {
        lTmpRls = ((pAddr - pstBufCtrl->pucBuf + lLen) + pstBufCtrl->lPadding) % pstBufCtrl->lBufSize;
    }
    else
    {
        lTmpRls = (pAddr - pstBufCtrl->pucBuf + lLen) % pstBufCtrl->lBufSize;
    }

    /* 输入ulLen不正确 */
    if ((lTmpRls > pstBufCtrl->lAlloc) && (lTmpRls < pstBufCtrl->lRelease))
    {
        diag_printf("diag_ReleaseLogMem:有回卷情况,待释放地址不对!\n");
        return ERR_MSP_FAILURE;
    }

    /* 如果发生回卷则将Padding值归0 */
    if (lTmpRls <= pstBufCtrl->lAlloc)
    {
        pstBufCtrl->lPadding = 0;
    }

    pstBufCtrl->lRelease = lTmpRls;

    return ERR_MSP_SUCCESS;
}