diff --git a/TSCP/src/MSCP/Arb/Arb.c b/TSCP/src/MSCP/Arb/Arb.c index 2baeea3..a68311a 100644 --- a/TSCP/src/MSCP/Arb/Arb.c +++ b/TSCP/src/MSCP/Arb/Arb.c @@ -43,7 +43,7 @@ static void s_Area_State_Req_Recv_Process(IN const STRU_AREA_WITH_ARB_STATE_PACK * @brief 处理校验通过的状态ACK帧 */ static void s_Area_State_Ack_Recv_Process(IN const STRU_AREA_WITH_ARB_STATE_PACK_T* state_pack, - IN CM_UINT32 local_sn, IN CM_UINT8 time_sync_flag); + IN CM_UINT32 local_sn); /** * @brief 仲裁处理 */ @@ -279,7 +279,6 @@ static void s_Area_State_Multi_Process(void) else { /**非主地主接收组播状态数据 */ - CM_Sleep(10u); /**等待10ms后接收组播数据 */ s_Area_State_Multi_Recv_Process(); } @@ -428,8 +427,9 @@ static void s_Area_State_Ack_Process(void) CM_UINT8 timeSyncFlag = AREA_FLAGS_CTRL_PTR->Time_Sync_Flag; CM_BOOL ack_flags[5] = {CM_FALSE, CM_FALSE, CM_FALSE, CM_FALSE, CM_FALSE}; + CM_UINT32 i = 0u; /**持续30ms */ - do + for(i = 0u;i<10;i++) { /**REQ与ACK共用一个FIFO,每条报文只读取一次并按类型分发。 */ do @@ -446,9 +446,7 @@ static void s_Area_State_Ack_Process(void) if((crc1 == state_pack.CRC1) && (crc2 == state_pack.CRC2) && ((AREA_ARB_STATE_PACK_LEN - 1u) == state_pack.Len) && - (state_pack.DstID == AREA_BASIC_CFG_PTR->BoardID) && - (srcID >= MSCP_AREA_A_BOARD_ID_A) && - (srcID <= MSCP_AREA_B_BOARD_ID_B)) + (state_pack.DstID == AREA_BASIC_CFG_PTR->BoardID)) { if(ENUM_AREA_MSG_STATE_REQ == state_pack.MsgType) { @@ -456,7 +454,7 @@ static void s_Area_State_Ack_Process(void) } else if(ENUM_AREA_MSG_STATE_ACK == state_pack.MsgType) { - s_Area_State_Ack_Recv_Process(&state_pack, localsn, timeSyncFlag); + s_Area_State_Ack_Recv_Process(&state_pack, localsn); } else { @@ -468,17 +466,12 @@ static void s_Area_State_Ack_Process(void) /**同步接收状态和本周期ACK目标,再统一回复。 */ s_Area_2oo2Sync_AfterStateRecv(ack_flags); - if((partner_id <= MSCP_AREA_B_BOARD_ID_B) && - (area_a_id <= MSCP_AREA_B_BOARD_ID_B) && - (area_b_id <= MSCP_AREA_B_BOARD_ID_B)) - { - s_Area_SendACK_After2oo2(ack_flags[partner_id], ack_flags[area_a_id], ack_flags[area_b_id]); - } + s_Area_SendACK_After2oo2(ack_flags[partner_id], ack_flags[area_a_id], ack_flags[area_b_id]); CM_Memset(ack_flags, 0, sizeof(ack_flags), sizeof(ack_flags)); CM_Sleep(2u); used_time = (CM_UINT32)(CM_GetTick() / CM_UNSIGNED_MILLION) - start_tick; - } while(used_time < 30u); + } } static void s_Area_State_Req_Recv_Process(IN const STRU_AREA_WITH_ARB_STATE_PACK_T* state_pack, @@ -492,7 +485,7 @@ static void s_Area_State_Req_Recv_Process(IN const STRU_AREA_WITH_ARB_STATE_PACK } s_Area_GetCommStatus_byID(state_pack->SrcID, &last_sn, NULL); - if(state_pack->SN > last_sn) + if(state_pack->SN >= last_sn) { ack_flags[state_pack->SrcID] = CM_TRUE; s_Area_SetCommStatus_byID(state_pack->SrcID, state_pack->SN, CM_TRUE); @@ -504,7 +497,7 @@ static void s_Area_State_Req_Recv_Process(IN const STRU_AREA_WITH_ARB_STATE_PACK } static void s_Area_State_Ack_Recv_Process(IN const STRU_AREA_WITH_ARB_STATE_PACK_T* state_pack, - IN CM_UINT32 local_sn, IN CM_UINT8 time_sync_flag) + IN CM_UINT32 local_sn) { CM_UINT32 sn_diff = 0u; @@ -513,6 +506,8 @@ static void s_Area_State_Ack_Recv_Process(IN const STRU_AREA_WITH_ARB_STATE_PACK return; } + CM_UINT8 time_sync_flag = state_pack->TimeSyncFlag; + sn_diff = (local_sn >= state_pack->SN) ? (local_sn - state_pack->SN) : (state_pack->SN - local_sn); if(((1u == time_sync_flag) && (state_pack->SN == local_sn)) || @@ -524,6 +519,11 @@ static void s_Area_State_Ack_Recv_Process(IN const STRU_AREA_WITH_ARB_STATE_PACK AREA_LOG_MSG("AREA_ARB:State ACK received, SrcID:%d SN:%u State:%d 2x2:%d\n", state_pack->SrcID, state_pack->SN, state_pack->StateArea, state_pack->State2x); } + else + { + AREA_LOG_MSG("AREA_ARB:State ACK recv failed, SrcID:%d SN:%u State:%d 2x2:%d\n", + state_pack->SrcID, state_pack->SN, state_pack->StateArea, state_pack->State2x); + } } /** @@ -565,17 +565,18 @@ static void s_Area_Arb_Send_Process(void) CM_UINT8 id_sm = AreaArb_GetID_byState(ENUM_AREA_SLAVE, ENUM_2x2_MASTER); /**备地主的板卡ID */ CM_UINT8 id_mm = AreaArb_GetID_byState(ENUM_AREA_MASTER, ENUM_2x2_MASTER); /**主地主的板卡ID */ /**获取通信中断标志 */ - CM_UINT8 flag_comm_all_down = AREA_COMM_STATUS_PTR->Patner_RcvFlag | AREA_COMM_STATUS_PTR->Area_A_RcvFlag | AREA_COMM_STATUS_PTR->Area_B_RcvFlag; + CM_BOOL flag_comm_all_down = AREA_COMM_STATUS_PTR->Area_A_RcvFlag | AREA_COMM_STATUS_PTR->Area_B_RcvFlag; /**用于判断通信是否完全中断 */ + CM_BOOL flag_comm_all_up = AREA_COMM_STATUS_PTR->Area_A_RcvFlag & AREA_COMM_STATUS_PTR->Area_B_RcvFlag; /**用于判断通信是否完全正常 */ /**重置仲裁请求发送标志 */ - AREA_ARB_CTRL_PTR->Arb_Send_Flag = 0u; + AREA_ARB_CTRL_PTR->Arb_Send_Flag = 0u; /**判断是否发送仲裁请求 */ if(ENUM_2x2_MASTER == AREA_STATE_CTRL_PTR->State2x.LocalState) { /**主系判断是否发送仲裁请求 */ - if(ENUM_AREA_MASTER == local_area_state && 0u == id_sm) + if(ENUM_AREA_MASTER == local_area_state && 0u == id_sm && CM_FALSE == flag_comm_all_up) { - /**本地主地主,与备地主通信中断,发送仲裁请求 */ + /**本地主地主,与备地通信存在异常,发送仲裁请求 */ AREA_ARB_CTRL_PTR->Arb_Send_Flag = 1u; send_rt = Area_Arb_Req_Send(tmp_buf, tmp_len); AREA_LOG_MSG("AREA_ARB:Request arbitration, master lost slave, BoardID:%d SN:%u Result:0x%x\n", @@ -599,7 +600,7 @@ static void s_Area_Arb_Send_Process(void) } else if(ENUM_AREA_UNKNOW == local_area_state && CM_FALSE == flag_comm_all_down) { - /**未知地主系,与其他三系通信持续中断10周期,发送仲裁请求 */ + /**未知地主系,与另一地通信持续中断10周期,发送仲裁请求 */ if(tolerate_arb >= 10u) { AREA_ARB_CTRL_PTR->Arb_Send_Flag = 1u; @@ -745,32 +746,45 @@ static void s_Area_State_Multi_Recv_Process(void) CM_INT32 rcv_len = 0; STRU_AREA_WITH_ARB_STATE_MULTI_PACK_T multi_pack = {0}; /**状态组播帧数据结构体 */ CM_UINT32 tickNow = (CM_UINT32)(CM_GetTick() / CM_UNSIGNED_MILLION); + CM_UINT32 tickStart = tickNow, usedTime = 0u; CM_UINT32 tickRcv = 0u; /*组播接收*/ - rcv_len = Area_State_Multi_Recv(wire_buf, sizeof(wire_buf), &tickRcv); /*双CRC校验*/ - if(AREA_ARB_STATE_MULTI_PACK_LEN == rcv_len && - ((tickNow - tickRcv) < g_PFM_Cfg.CYC_TIME)) + do { - Area_Arb_State_Multi_UnPack(&multi_pack, wire_buf, (CM_UINT32)rcv_len); - crc1 = CM_Crc32_1(&wire_buf[1], (CM_UINT32)rcv_len - 9u); - crc2 = CM_Crc32_2(&wire_buf[1], (CM_UINT32)rcv_len - 9u); - if(crc1 == multi_pack.CRC1 && crc2 == multi_pack.CRC2 && - ((AREA_ARB_STATE_MULTI_PACK_LEN - 1u) == multi_pack.Len) && - ENUM_AREA_MSG_STATE_MULTI == multi_pack.MsgType) + rcv_len = Area_State_Multi_Recv(wire_buf, sizeof(wire_buf), &tickRcv); + tickNow = (CM_UINT32)(CM_GetTick() / CM_UNSIGNED_MILLION); + if(AREA_ARB_STATE_MULTI_PACK_LEN == rcv_len && + ((tickNow - tickRcv) < g_PFM_Cfg.CYC_TIME)) { - s_Area_SetCommStatus_byID(multi_pack.SrcID, multi_pack.SN, CM_TRUE); - AreaArb_SetState_byID(multi_pack.SrcID, multi_pack.StateArea); - AreaArb_Set2xState_byID(multi_pack.SrcID, multi_pack.State2x); - AREA_LOG_MSG("AREA_ARB:Multicast state received, SrcID:%d SN:%u State:%d 2x2:%d\n", - multi_pack.SrcID, multi_pack.SN, multi_pack.StateArea, multi_pack.State2x); + Area_Arb_State_Multi_UnPack(&multi_pack, wire_buf, (CM_UINT32)rcv_len); + crc1 = CM_Crc32_1(&wire_buf[1], (CM_UINT32)rcv_len - 9u); + crc2 = CM_Crc32_2(&wire_buf[1], (CM_UINT32)rcv_len - 9u); + if(crc1 == multi_pack.CRC1 && crc2 == multi_pack.CRC2 && + ((AREA_ARB_STATE_MULTI_PACK_LEN - 1u) == multi_pack.Len) && + ENUM_AREA_MSG_STATE_MULTI == multi_pack.MsgType) + { + s_Area_SetCommStatus_byID(multi_pack.SrcID, multi_pack.SN, CM_TRUE); + AreaArb_SetState_byID(multi_pack.SrcID, multi_pack.StateArea); + AreaArb_Set2xState_byID(multi_pack.SrcID, multi_pack.State2x); + AREA_LOG_MSG("AREA_ARB:Multicast state received, SrcID:%d SN:%u State:%d 2x2:%d\n", + multi_pack.SrcID, multi_pack.SN, multi_pack.StateArea, multi_pack.State2x); + } + else + { + AREA_LOG_MSG("Multi Recv Crc Fail %08x-%08x, %08x-%08x\n",crc1, multi_pack.CRC1, crc2, multi_pack.CRC2); + } } else { - AREA_LOG_MSG("Multi Recv Crc Fail %08x-%08x, %08x-%08x\n",crc1, multi_pack.CRC1, crc2, multi_pack.CRC2); - } - } + AREA_LOG_MSG("AREA_ARB:Multicast state received, tickNow - tickRcv = %llums\n", tickNow - tickRcv); + } + usedTime = tickNow - tickStart; + CM_Sleep(1u); + } while (usedTime < 10u); + + } /** diff --git a/TSCP/src/MSCP/Arb/Arb_Net.c b/TSCP/src/MSCP/Arb/Arb_Net.c index afd1dcb..89bc2f1 100644 --- a/TSCP/src/MSCP/Arb/Arb_Net.c +++ b/TSCP/src/MSCP/Arb/Arb_Net.c @@ -273,7 +273,7 @@ ENUM_CM_RETURN Area_State_Multi_Send(IN const CM_UINT8* pBuf, IN CM_INT32 BufLen if(NULL != pBuf) { /*- 组播发送 */ - rt = CM_UDP_Send_Msg(AREA_MULTI_COMM_CFG_PTR->Socket_Send, pBuf, BufLen, inet_addr(AREA_MULTI_COMM_CFG_PTR->IP_Multicast),AREA_MULTI_COMM_CFG_PTR->Port_Send); + rt = CM_UDP_Send_Msg(AREA_MULTI_COMM_CFG_PTR->Socket_Send, pBuf, BufLen, inet_addr(AREA_MULTI_COMM_CFG_PTR->IP_Multicast),AREA_MULTI_COMM_CFG_PTR->Port_Recv); } else {