一主三备完成

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
+34 -20
View File
@@ -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]);
}
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,7 +565,8 @@ 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;
@@ -573,9 +574,9 @@ static void s_Area_Arb_Send_Process(void)
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,11 +746,15 @@ 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校验*/
do
{
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))
{
@@ -771,6 +776,15 @@ static void s_Area_State_Multi_Recv_Process(void)
AREA_LOG_MSG("Multi Recv Crc Fail %08x-%08x, %08x-%08x\n",crc1, multi_pack.CRC1, crc2, multi_pack.CRC2);
}
}
else
{
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)
{
/*- 组播发送 */
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
{