/***************************************************************************** Function : vos_FidTask Description: the process entry of every FID Input : ulQueueID -- the queue of the FID : the ID of the FID Return : VOS_VOID *****************************************************************************/ VOS_VOID vos_FidTask( VOS_UINT32 ulQueueID, VOS_UINT32 FID_value, VOS_UINT32 Para1, VOS_UINT32 Para2 ) { MSG_CB *pMsg; VOS_UINT32 iThePid; VOS_UINT32 Msg_Address; for ( ; ; ) { if ( VOS_ERR == VOS_FixedQueueRead(ulQueueID, &Msg_Address)) { Print1("# FID fetch message error. the Q ID is %ld.\r\n", (VOS_INT)ulQueueID); continue; } Msg_Address += VOS_MSG_BLK_HEAD_LEN; pMsg = (MSG_CB *)Msg_Address; iThePid = pMsg->uwReceiverPid; if(!VOS_PidCheck(iThePid)) { Print("# vos_FidTask Pid too big.\r\n"); VOS_FreeMsg( iThePid, pMsg ); continue; } if( VOS_ID_PID_BELONG_TO_FID == vos_FidCtrlBlk[FID_value].PidsBelong[VOS_PidIdx(iThePid)] ) { /* 接收消息时调用hook */ if ( VOS_NULL_PTR != g_pfVosHookFuncTable[OS_HOOK_TYPE_MSG_GET] ) { ((VOS_MSG_HOOK_FUNC)g_pfVosHookFuncTable[OS_HOOK_TYPE_MSG_GET])(pMsg); } (vos_PidRecords[VOS_PidIdx(iThePid)].MsgFunction)(pMsg); } else { Print("# vos_FidTask Pid not belong the Fid.\r\n"); } VOS_FreeMsg( iThePid, pMsg ); } }
/***************************************************************************** Function : VOS_ResetFidsTask Description: Resume tasks of all FIDs Input : VOS_VOID : VOS_VOID Return : VOS_OK on success or errno on failure *****************************************************************************/ VOS_UINT32 VOS_ResetFidsTask(VOS_FID ulFid) { VOS_CPU_SR CpuLockLevel; VOS_UINT32 iThePid; VOS_UINT32 Msg_Address; MSG_CB *pMsg; if( (ulFid >= VOS_FID_BUTT) || (ulFid < VOS_FID_DOPRAEND) ) { return VOS_ERR; } CpuLockLevel = VOS_SplIMP(); if ( VOS_OK != VOS_FixedQueueClean(vos_FidCtrlBlk[ulFid].Qid, &Msg_Address) ) { VOS_Splx(CpuLockLevel); return VOS_ERR; } if ( VOS_OK != VOS_ResetTask(vos_FidCtrlBlk[ulFid].Tid) ) { VOS_Splx(CpuLockLevel); return VOS_ERR; } if ( FALSE == VOS_IsMemUsed(Msg_Address) ) { VOS_Splx(CpuLockLevel); return VOS_OK; } Msg_Address += VOS_MSG_BLK_HEAD_LEN; pMsg = (MSG_CB *)Msg_Address; iThePid = pMsg->uwReceiverPid; if(!VOS_PidCheck(iThePid)) { VOS_Splx(CpuLockLevel); return VOS_ERR; } if( VOS_ID_PID_BELONG_TO_FID == vos_FidCtrlBlk[ulFid].PidsBelong[iThePid - VOS_PID_DOPRAEND] ) { VOS_FreeMsg( iThePid, pMsg ); } VOS_Splx(CpuLockLevel); return VOS_OK; }
VOS_VOID Aging_FreeMem(VOS_VOID) { MODEM_ID_ENUM_UINT16 enModemID; if (VOS_NULL_PTR != g_pstOmAgingTestNV) { VOS_MemFree(WUEPS_PID_AGING, g_pstOmAgingTestNV); } for (enModemID = MODEM_ID_0; enModemID < MODEM_ID_BUTT; enModemID++) { if (VOS_NULL_PTR != g_apstGAgingTestMsg[enModemID]) { VOS_FreeMsg(WUEPS_PID_AGING, g_apstGAgingTestMsg[enModemID]); } } if (VOS_NULL_PTR != g_pstOmAgingTestNV) { VOS_FreeMsg(WUEPS_PID_AGING, g_pstWAgingTestMsg); } return; }
/***************************************************************************** 函 数 名 : MNTN_ErrorLog 功能描述 : 将错误信息记录到ERRORLOG中 输入参数 : cFileName: 调用函数处的文件名 ulFileId: 调用函数处的文件ID ulLine: 调用函数处在文件中行号 ulErrNo: 错误号索引 pRecord: 记录存放位置 ulLen: 记录整个pRecord的长度,包括记录头,单位:字节 输出参数 : VOID 返 回 值 : VOS_ERR:函数执行过程中出现错误 VOS_OK:函数执行正常 修改历史 : 1.日 期 : 2011年7月1日 作 者 : g47350 修改内容 : 新生成函数 *****************************************************************************/ unsigned int MNTN_ErrorLog(char * cFileName, unsigned int ulFileId, unsigned int ulLine, unsigned int ulErrNo, void *pRecord, unsigned int ulLen) { ERRORLOG_REQ_STRU *pstErrorLogReq; ERRORLOG_CNF_STRU *pstErrorLogCnf; VOS_UINT32 ulResult; /* 参数检测 */ if ((VOS_NULL_PTR == cFileName) || (VOS_NULL_PTR == pRecord)) { return OM_ACPU_PARA_ERR; } #if (VOS_OS_VER == VOS_LINUX) if( in_interrupt() ) { return OM_ACPU_RUN_IRQ; } #endif pstErrorLogReq = (ERRORLOG_REQ_STRU*)VOS_AllocMsg(ACPU_PID_OMAGENT, ERRORLOG_HEAD_LEN + ulLen); /* 分配消息失败 */ if (VOS_NULL_PTR == pstErrorLogReq) { return OM_ACPU_ALLOC_FAIL; } pstErrorLogReq->ulReceiverPid = CCPU_PID_OMAGENT; pstErrorLogReq->usPrimId = ERRORLOG_REQ; pstErrorLogReq->ulFileId = ulFileId; pstErrorLogReq->ulLine = ulLine; pstErrorLogReq->ulErrNo = ulErrNo; pstErrorLogReq->ulLen = ulLen; /* 为了确保aucFileName最后字节为'\0',拷贝长度需要加1 */ VOS_MemCpy(pstErrorLogReq->aucFileName, cFileName, VOS_StrLen(cFileName) + 1); VOS_MemCpy(pstErrorLogReq->aucData, pRecord, ulLen); /* 如果有任务正在进行中,需要等待其完成 */ if (VOS_OK != VOS_SmP(g_ulOmAcpuSyncSem, 0)) { VOS_FreeMsg(ACPU_PID_OMAGENT, pstErrorLogReq); return OM_ACPU_SYNC_TIMEOUT; } /* 将请求消息发送给CCPU */ if (VOS_OK != VOS_SendMsg(ACPU_PID_OMAGENT, pstErrorLogReq)) { VOS_SmV(g_ulOmAcpuSyncSem); return OM_ACPU_SEND_FAIL; } /* 等待CCPU的回复 */ if (VOS_OK != VOS_SmP(g_ulOmAcpuCnfSem, WAITING_CNF_TIMEOUT_LEN)) { VOS_SmV(g_ulOmAcpuSyncSem); return OM_ACPU_CNF_TIMEOUT; } pstErrorLogCnf = (ERRORLOG_CNF_STRU*)g_pstOmAcpuCnfMsg; /* 判断回复消息内容是否正确 */ if (ERRORLOG_CNF != pstErrorLogCnf->usPrimId) { VOS_FreeReservedMsg(ACPU_PID_OMAGENT, g_pstOmAcpuCnfMsg); VOS_SmV(g_ulOmAcpuSyncSem); return OM_ACPU_CNF_ERR; } ulResult = (VOS_UINT32)pstErrorLogCnf->usResult; VOS_FreeReservedMsg(ACPU_PID_OMAGENT, g_pstOmAcpuCnfMsg); VOS_SmV(g_ulOmAcpuSyncSem); return ulResult; }
/***************************************************************************** Function : vos_FidTask Description: the process entry of every FID Input : ulQueueID -- the queue of the FID : the ID of the FID Return : void *****************************************************************************/ VOS_VOID vos_FidTask( VOS_UINT32 ulQueueID, VOS_UINT32 FID_value, VOS_UINT32 Para1, VOS_UINT32 Para2 ) { MSG_CB *pMsg; VOS_UINT32 *pulMsgAddr; VOS_UINT32 iThePid; VOS_UINT32 Msg_Address; for(;;) { if ( VOS_ERR == VOS_FixedQueueRead(ulQueueID, 0, &Msg_Address, VOS_FID_MAX_MSG_LENGTH)) { LogPrint1("# FID fetch message error. the Q ID is %d.\r\n", (int)ulQueueID); continue; } Msg_Address += VOS_MSG_BLK_HEAD_LEN; pMsg = (MSG_CB *)Msg_Address; iThePid = pMsg->ulReceiverPid; if(iThePid >= VOS_PID_BUTT) { LogPrint("# vos_FidTask Pid too big.\r\n"); pulMsgAddr = (VOS_UINT32 *)pMsg; LogPrint4("# Msg :S pid %08X R Pid %08X Length %08X Name %08X.\r\n", *(pulMsgAddr + 1), *(pulMsgAddr + 3), *(pulMsgAddr + 4), *(pulMsgAddr + 5)); VOS_FreeMsg( iThePid, pMsg ); continue; } if( FID_value == vos_PidRecords[iThePid-VOS_PID_DOPRAEND].Fid ) { if ( VOS_NULL_PTR != vos_MsgHook ) { (vos_MsgHook)(pMsg); } (vos_PidRecords[iThePid-VOS_PID_DOPRAEND].MsgFunction)(pMsg); } else { LogPrint("# vos_FidTask Pid not belong the Fid.\r\n"); pulMsgAddr = (VOS_UINT32 *)pMsg; LogPrint4("# Msg :S pid %08X R Pid %08X Length %08X Name %08X.\r\n", *(pulMsgAddr + 1), *(pulMsgAddr + 3), *(pulMsgAddr + 4), *(pulMsgAddr + 5)); } VOS_FreeMsg( iThePid, pMsg ); } }
/****************************************************************************** 函数名 :OM_GetData 功能描述:OM Ccpu接收各组件上报工程模式数据 输入参数:enProjectModule :组建编号 pData :发送数据 ulLen :发送数据长度 输出参数:NA 返回值 :VOS_OK/VOS_ERR 修改历史: 1. 日期 :2014年1月2日 作者 : 修改内容:新生成函数 说明:pData从OMHeader的MsgType域开始。相当于调用组件预先申请Header部分,其中Header部分的SN字段由COMM填写 *****************************************************************************/ VOS_UINT32 OM_GetData(OM_ERR_LOG_MOUDLE_ID_ENUM_UINT32 enProjectModule, VOS_VOID *pData, VOS_UINT32 ulLen) { OM_ALARM_MSG_HEAD_STRU *pstOmHead; OM_FTM_REPROT_IND_STRU *pstOmFtmReportInd; VOS_UINT32 ulAddr; VOS_UINT32 ulIndex; for (ulIndex=0; ulIndex<(sizeof(g_astFTMCallBackFuncCtx) / sizeof(g_astFTMCallBackFuncCtx[0])); ulIndex++) { /* 上报消息时,如果该组件没有注册过回调函数,就不传递他的消息 */ if ( (g_astFTMCallBackFuncCtx[ulIndex].enProjectModule == enProjectModule) && (g_astFTMCallBackFuncCtx[ulIndex].pSendUlAtFunc != VOS_NULL_PTR) ) { break; } } if ((sizeof(g_astFTMCallBackFuncCtx) / sizeof(g_astFTMCallBackFuncCtx[0])) <= ulIndex) { OM_CCPU_ERR_LOG1("OM_GetData:ModuleID is error %d\r\n", enProjectModule); return OM_APP_MSG_MODULE_ID_ERR; } if ((VOS_NULL_PTR == pData) || ((sizeof(OM_ALARM_MSG_HEAD_STRU) + sizeof(OM_FTM_HEADER_STRU)) > ulLen)) { OM_CCPU_ERR_LOG2("\r\n OM_GetData: Module ID is %d, Send data is NULL or len is error:%d\n", enProjectModule, ulLen); return OM_APP_MSG_LENGTH_ERR; } /*lint -e40*/ OM_CCPU_DEBUG_TRACE((VOS_UINT8*)pData, ulLen, OM_CCPU_ERRLOG_RCV); /*lint +e40*/ /* 工程模式相关消息上报给OM */ pstOmFtmReportInd = (OM_FTM_REPROT_IND_STRU*)VOS_AllocMsg(WUEPS_PID_OM_CALLBACK, (ulLen + sizeof(VOS_UINT32))); if (VOS_NULL_PTR == pstOmFtmReportInd) { OM_CCPU_ERR_LOG1("OM_GetData:Module ID is %d, malloc msg is fail\r\n", enProjectModule); return OM_APP_OMCCPU_ALLOC_MSG_ERR; } pstOmFtmReportInd->ulReceiverPid = ACPU_PID_OM; pstOmHead = (OM_ALARM_MSG_HEAD_STRU*)pData; /* 消息TYPE简单判断*/ if (OM_ERR_LOG_MSG_FTM_REPORT == pstOmHead->ulMsgType) { pstOmFtmReportInd->ulMsgName = ID_OM_FTM_REPROT_IND; } else if (OM_ERR_LOG_MSG_FTM_CNF == pstOmHead->ulMsgType) { pstOmFtmReportInd->ulMsgName = ID_OM_FTM_REQUIRE_CNF; } else { OM_CCPU_ERR_LOG2("OM_GetData:Module ID is %d, Msg Type is Err %d\r\n", enProjectModule, pstOmHead->ulMsgType); VOS_FreeMsg(WUEPS_PID_OM_CALLBACK, pstOmFtmReportInd); return OM_APP_MSG_TYPE_ERR; } /* make pclint happy begin */ ulAddr = (VOS_UINT32)(&pstOmFtmReportInd->ulMsgType); VOS_MemCpy((VOS_VOID *)ulAddr, (VOS_VOID*)pData, ulLen); /* make pclint happy end */ (VOS_VOID)VOS_SendMsg(WUEPS_PID_OM_CALLBACK, pstOmFtmReportInd); return OM_APP_MSG_OK; }