一主三备完成
This commit is contained in:
+52
-38
@@ -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);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user