一主三备完成

This commit is contained in:
lh
2026-08-21 19:43:34 +08:00
parent e0b03e011f
commit 7dd0b7aa68
2 changed files with 53 additions and 39 deletions
+52 -38
View File
@@ -43,7 +43,7 @@ static void s_Area_State_Req_Recv_Process(IN const STRU_AREA_WITH_ARB_STATE_PACK
* @brief 处理校验通过的状态ACK帧 * @brief 处理校验通过的状态ACK帧
*/ */
static void s_Area_State_Ack_Recv_Process(IN const STRU_AREA_WITH_ARB_STATE_PACK_T* 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);
/** /**
* @brief 仲裁处理 * @brief 仲裁处理
*/ */
@@ -279,7 +279,6 @@ static void s_Area_State_Multi_Process(void)
else else
{ {
/**非主地主接收组播状态数据 */ /**非主地主接收组播状态数据 */
CM_Sleep(10u); /**等待10ms后接收组播数据 */
s_Area_State_Multi_Recv_Process(); 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_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_BOOL ack_flags[5] = {CM_FALSE, CM_FALSE, CM_FALSE, CM_FALSE, CM_FALSE};
CM_UINT32 i = 0u;
/**持续30ms */ /**持续30ms */
do for(i = 0u;i<10;i++)
{ {
/**REQ与ACK共用一个FIFO,每条报文只读取一次并按类型分发。 */ /**REQ与ACK共用一个FIFO,每条报文只读取一次并按类型分发。 */
do do
@@ -446,9 +446,7 @@ static void s_Area_State_Ack_Process(void)
if((crc1 == state_pack.CRC1) && (crc2 == state_pack.CRC2) && if((crc1 == state_pack.CRC1) && (crc2 == state_pack.CRC2) &&
((AREA_ARB_STATE_PACK_LEN - 1u) == state_pack.Len) && ((AREA_ARB_STATE_PACK_LEN - 1u) == state_pack.Len) &&
(state_pack.DstID == AREA_BASIC_CFG_PTR->BoardID) && (state_pack.DstID == AREA_BASIC_CFG_PTR->BoardID))
(srcID >= MSCP_AREA_A_BOARD_ID_A) &&
(srcID <= MSCP_AREA_B_BOARD_ID_B))
{ {
if(ENUM_AREA_MSG_STATE_REQ == state_pack.MsgType) 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) 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 else
{ {
@@ -468,17 +466,12 @@ static void s_Area_State_Ack_Process(void)
/**同步接收状态和本周期ACK目标,再统一回复。 */ /**同步接收状态和本周期ACK目标,再统一回复。 */
s_Area_2oo2Sync_AfterStateRecv(ack_flags); s_Area_2oo2Sync_AfterStateRecv(ack_flags);
if((partner_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]);
(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]);
}
CM_Memset(ack_flags, 0, sizeof(ack_flags), sizeof(ack_flags)); CM_Memset(ack_flags, 0, sizeof(ack_flags), sizeof(ack_flags));
CM_Sleep(2u); CM_Sleep(2u);
used_time = (CM_UINT32)(CM_GetTick() / CM_UNSIGNED_MILLION) - start_tick; 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, 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); 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; ack_flags[state_pack->SrcID] = CM_TRUE;
s_Area_SetCommStatus_byID(state_pack->SrcID, state_pack->SN, 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, 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; 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; return;
} }
CM_UINT8 time_sync_flag = state_pack->TimeSyncFlag;
sn_diff = (local_sn >= state_pack->SN) ? sn_diff = (local_sn >= state_pack->SN) ?
(local_sn - state_pack->SN) : (state_pack->SN - local_sn); (local_sn - state_pack->SN) : (state_pack->SN - local_sn);
if(((1u == time_sync_flag) && (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", 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); 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_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 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_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; AREA_ARB_CTRL_PTR->Arb_Send_Flag = 1u;
send_rt = Area_Arb_Req_Send(tmp_buf, tmp_len); 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", 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) else if(ENUM_AREA_UNKNOW == local_area_state && CM_FALSE == flag_comm_all_down)
{ {
/**未知地主系,与其他三系通信持续中断10周期,发送仲裁请求 */ /**未知地主系,与另一地通信持续中断10周期,发送仲裁请求 */
if(tolerate_arb >= 10u) if(tolerate_arb >= 10u)
{ {
AREA_ARB_CTRL_PTR->Arb_Send_Flag = 1u; 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; CM_INT32 rcv_len = 0;
STRU_AREA_WITH_ARB_STATE_MULTI_PACK_T multi_pack = {0}; /**状态组播帧数据结构体 */ STRU_AREA_WITH_ARB_STATE_MULTI_PACK_T multi_pack = {0}; /**状态组播帧数据结构体 */
CM_UINT32 tickNow = (CM_UINT32)(CM_GetTick() / CM_UNSIGNED_MILLION); CM_UINT32 tickNow = (CM_UINT32)(CM_GetTick() / CM_UNSIGNED_MILLION);
CM_UINT32 tickStart = tickNow, usedTime = 0u;
CM_UINT32 tickRcv = 0u; CM_UINT32 tickRcv = 0u;
/*组播接收*/ /*组播接收*/
rcv_len = Area_State_Multi_Recv(wire_buf, sizeof(wire_buf), &tickRcv);
/*双CRC校验*/ /*双CRC校验*/
if(AREA_ARB_STATE_MULTI_PACK_LEN == rcv_len && do
((tickNow - tickRcv) < g_PFM_Cfg.CYC_TIME))
{ {
Area_Arb_State_Multi_UnPack(&multi_pack, wire_buf, (CM_UINT32)rcv_len); rcv_len = Area_State_Multi_Recv(wire_buf, sizeof(wire_buf), &tickRcv);
crc1 = CM_Crc32_1(&wire_buf[1], (CM_UINT32)rcv_len - 9u); tickNow = (CM_UINT32)(CM_GetTick() / CM_UNSIGNED_MILLION);
crc2 = CM_Crc32_2(&wire_buf[1], (CM_UINT32)rcv_len - 9u); if(AREA_ARB_STATE_MULTI_PACK_LEN == rcv_len &&
if(crc1 == multi_pack.CRC1 && crc2 == multi_pack.CRC2 && ((tickNow - tickRcv) < g_PFM_Cfg.CYC_TIME))
((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); Area_Arb_State_Multi_UnPack(&multi_pack, wire_buf, (CM_UINT32)rcv_len);
AreaArb_SetState_byID(multi_pack.SrcID, multi_pack.StateArea); crc1 = CM_Crc32_1(&wire_buf[1], (CM_UINT32)rcv_len - 9u);
AreaArb_Set2xState_byID(multi_pack.SrcID, multi_pack.State2x); crc2 = CM_Crc32_2(&wire_buf[1], (CM_UINT32)rcv_len - 9u);
AREA_LOG_MSG("AREA_ARB:Multicast state received, SrcID:%d SN:%u State:%d 2x2:%d\n", if(crc1 == multi_pack.CRC1 && crc2 == multi_pack.CRC2 &&
multi_pack.SrcID, multi_pack.SN, multi_pack.StateArea, multi_pack.State2x); ((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 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);
} }
/** /**
+1 -1
View File
@@ -273,7 +273,7 @@ ENUM_CM_RETURN Area_State_Multi_Send(IN const CM_UINT8* pBuf, IN CM_INT32 BufLen
if(NULL != pBuf) 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 else
{ {