组播接收后做2取交互,组播接收的数据不作用于通信状态判断
This commit is contained in:
+27
-22
@@ -88,14 +88,6 @@ static void s_Area_State_Multi_Recv_Process(void);
|
||||
* @brief 周期运行中的初始化,初始化接收状态和其他板卡状态
|
||||
*/
|
||||
static void s_Area_Cycle_Init(void);
|
||||
/**
|
||||
* @brief 根据ID设置接收状态
|
||||
*/
|
||||
static void s_Area_SetCommStatus_byID(CM_UINT8 ID, CM_UINT32 sn, CM_BOOL rcv_flag);
|
||||
/**
|
||||
* @brief 根据ID获取接收状态
|
||||
*/
|
||||
static void s_Area_GetCommStatus_byID(CM_UINT8 ID, CM_UINT32* SN, CM_UINT8* rcv_flag);
|
||||
/**
|
||||
* @brief 对接收到的区域状态请求进行2取同步
|
||||
* @param ack_flags 记录是否需要进行ACK回复
|
||||
@@ -181,10 +173,10 @@ static CM_THREAD_FUNC_T s_Area_With_Arb_Work_Thread(IN CM_Thread_Arg_Struct_T* a
|
||||
s_area_arb_start_time = CM_GetTick();
|
||||
/**清空上周期的接收状态,并获取2乘线程中的最终状态 */
|
||||
s_Area_Cycle_Init();
|
||||
AREA_LOG_MSG("AREA_ARB:Cycle start, BoardID:%d SN:%u State:%d 2x2:%d\n",
|
||||
AREA_LOG_MSG("AREA_ARB:Cycle start, BoardID:%d SN:%u State:%d 2x2:%d, NOW_USED_TIME:%llums\n",
|
||||
AREA_BASIC_CFG_PTR->BoardID, DFM_GetBirthCount(),
|
||||
AREA_STATE_CTRL_PTR->StateArea.Local_state,
|
||||
AREA_STATE_CTRL_PTR->State2x.LocalState);
|
||||
AREA_STATE_CTRL_PTR->State2x.LocalState,NOW_USED_TIME / 1000u);
|
||||
/**主地主组播发送状态帧,其余板卡接收 */
|
||||
stage_start = CM_GetTick();
|
||||
s_Area_State_Multi_Process();
|
||||
@@ -208,12 +200,12 @@ static CM_THREAD_FUNC_T s_Area_With_Arb_Work_Thread(IN CM_Thread_Arg_Struct_T* a
|
||||
/**状态转移 */
|
||||
s_Area_Arb_State_Transition();
|
||||
|
||||
AREA_LOG_MSG("AREA_ARB:Cycle end, SN:%u State:%d 2x2:%d RcvFlag:%d-%d-%d Arb:%d-0x%x\n",
|
||||
AREA_LOG_MSG("AREA_ARB:Cycle end, SN:%u State:%d 2x2:%d RcvFlag:%d-%d-%d Arb:%d-0x%x, AREA_ARB_USED_TIME:%llums, NOW_USED_TIME:%llums\n",
|
||||
AREA_COMM_STATUS_PTR->LocalSN, AREA_STATE_CTRL_PTR->StateArea.Local_state,
|
||||
AREA_STATE_CTRL_PTR->State2x.LocalState,
|
||||
AREA_COMM_STATUS_PTR->Patner_RcvFlag, AREA_COMM_STATUS_PTR->Area_A_RcvFlag,
|
||||
AREA_COMM_STATUS_PTR->Area_B_RcvFlag, AREA_ARB_CTRL_PTR->Arb_Send_Flag,
|
||||
AREA_ARB_CTRL_PTR->Arb_Ack);
|
||||
AREA_ARB_CTRL_PTR->Arb_Ack, AREA_ARB_NOW_USED_TIME, NOW_USED_TIME / 1000u);
|
||||
|
||||
Area_Arb_Stop();
|
||||
}
|
||||
@@ -416,11 +408,11 @@ static void s_Area_State_Req_Recv_Process(IN const STRU_AREA_WITH_ARB_STATE_PACK
|
||||
return;
|
||||
}
|
||||
|
||||
s_Area_GetCommStatus_byID(state_pack->SrcID, &last_sn, NULL);
|
||||
if(state_pack->SN >= last_sn)
|
||||
AreaArb_GetCommStatus_byID(state_pack->SrcID, &last_sn, NULL);
|
||||
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);
|
||||
AreaArb_SetCommStatus_byID(state_pack->SrcID, state_pack->SN, CM_TRUE);
|
||||
AreaArb_SetState_byID(state_pack->SrcID, state_pack->StateArea);
|
||||
AreaArb_Set2xState_byID(state_pack->SrcID, state_pack->State2x);
|
||||
AREA_LOG_MSG("AREA_ARB:State request received, SrcID:%d SN:%u State:%d 2x2:%d, AREA_ARB_NOW_USED_TIME:%llums\n",
|
||||
@@ -445,7 +437,7 @@ static void s_Area_State_Ack_Recv_Process(IN const STRU_AREA_WITH_ARB_STATE_PACK
|
||||
if(((1u == time_sync_flag) && (state_pack->SN == local_sn)) ||
|
||||
((0u == time_sync_flag) && (sn_diff <= 1u)))
|
||||
{
|
||||
s_Area_SetCommStatus_byID(state_pack->SrcID, state_pack->SN, CM_TRUE);
|
||||
AreaArb_SetCommStatus_byID(state_pack->SrcID, state_pack->SN, CM_TRUE);
|
||||
AreaArb_SetState_byID(state_pack->SrcID, state_pack->StateArea);
|
||||
AreaArb_Set2xState_byID(state_pack->SrcID, state_pack->State2x);
|
||||
AREA_LOG_MSG("AREA_ARB:State ACK received, SrcID:%d SN:%u State:%d 2x2:%d, AREA_ARB_NOW_USED_TIME:%llums\n",
|
||||
@@ -478,6 +470,7 @@ static void s_Area_Arb_Send_Process(void)
|
||||
ENUM_AREA_STATE local_area_state = AREA_STATE_CTRL_PTR->StateArea.Local_state;
|
||||
static CM_UINT32 tolerate_arb = 0u; /**仲裁请求容忍 */
|
||||
ENUM_CM_RETURN send_rt = ENUM_CM_FALSE;
|
||||
CM_BOOL flag_comm_mm_status = CM_FALSE;
|
||||
/**请求帧帧基础信息组包 */
|
||||
arb_pack.Len = AREA_ARB_FRAME_PACK_LEN - 1u;
|
||||
arb_pack.MsgType = ENUM_AREA_MSG_ARB_REQ;
|
||||
@@ -498,6 +491,8 @@ static void s_Area_Arb_Send_Process(void)
|
||||
/**获取通信中断标志 */
|
||||
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; /**用于判断通信是否完全正常 */
|
||||
/**获取主地主通信状态标志 */
|
||||
AreaArb_GetCommStatus_byID(id_mm, NULL, &flag_comm_mm_status);
|
||||
/**重置仲裁请求发送标志 */
|
||||
AREA_ARB_CTRL_PTR->Arb_Send_Flag = 0u;
|
||||
|
||||
@@ -513,7 +508,7 @@ static void s_Area_Arb_Send_Process(void)
|
||||
AREA_LOG_MSG("AREA_ARB:Request arbitration, master lost slave, BoardID:%d SN:%u Result:0x%x\n",
|
||||
AREA_BASIC_CFG_PTR->BoardID, arb_pack.ArbSN, send_rt);
|
||||
}
|
||||
else if(ENUM_AREA_SLAVE == local_area_state && 0u == id_mm)
|
||||
else if(ENUM_AREA_SLAVE == local_area_state && CM_FALSE == flag_comm_mm_status)
|
||||
{
|
||||
/**本地备地主,与主地主通信中断,容忍一周期发送请求 */
|
||||
if(tolerate_arb >= 1u)
|
||||
@@ -686,6 +681,7 @@ static void s_Area_State_Multi_Recv_Process(void)
|
||||
CM_UINT32 tickNow = (CM_UINT32)(CM_GetTick() / CM_UNSIGNED_MILLION);
|
||||
CM_UINT32 tickStart = tickNow, usedTime = 0u;
|
||||
CM_UINT32 tickRcv = 0u;
|
||||
STRU_AREA_WITH_ARB_STATE_MULTI_PACK_T peer_pack = {0};
|
||||
/*组播接收*/
|
||||
|
||||
/*双CRC校验*/
|
||||
@@ -703,7 +699,7 @@ static void s_Area_State_Multi_Recv_Process(void)
|
||||
((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",
|
||||
@@ -711,6 +707,8 @@ static void s_Area_State_Multi_Recv_Process(void)
|
||||
}
|
||||
else
|
||||
{
|
||||
/**接收失败清空结构体,等待2取同步 */
|
||||
CM_Memset(&multi_pack, 0, sizeof(multi_pack), sizeof(multi_pack));
|
||||
AREA_LOG_MSG("Multi Recv Crc Fail %08x-%08x, %08x-%08x\n",crc1, multi_pack.CRC1, crc2, multi_pack.CRC2);
|
||||
}
|
||||
}
|
||||
@@ -720,8 +718,15 @@ static void s_Area_State_Multi_Recv_Process(void)
|
||||
}
|
||||
usedTime = tickNow - tickStart;
|
||||
} while (AREA_MULTI_WAITE_TIME > usedTime);
|
||||
|
||||
|
||||
/**对组播接收进行2取同步 */
|
||||
Area_2oo2_Currency_NoSplit(&multi_pack, sizeof(multi_pack), &peer_pack, sizeof(peer_pack));
|
||||
if(peer_pack.SN > multi_pack.SN)
|
||||
{
|
||||
/**邻机有最新数据 */
|
||||
AREA_LOG_MSG("AREA_ARB: Multi Recv 2oo2 Sync, Peer-Mine:%d-%d\n", peer_pack.SN, multi_pack.SN);
|
||||
AreaArb_SetState_byID(peer_pack.SrcID, peer_pack.StateArea);
|
||||
AreaArb_Set2xState_byID(peer_pack.SrcID, peer_pack.State2x);
|
||||
}
|
||||
|
||||
}
|
||||
/**
|
||||
@@ -763,7 +768,7 @@ static void s_Area_Cycle_Init(void)
|
||||
/**
|
||||
* @brief 根据ID设置接收状态
|
||||
*/
|
||||
static void s_Area_SetCommStatus_byID(CM_UINT8 ID, CM_UINT32 sn, CM_BOOL rcv_flag)
|
||||
void AreaArb_SetCommStatus_byID(CM_UINT8 ID, CM_UINT32 sn, CM_BOOL rcv_flag)
|
||||
{
|
||||
if(ID == AREA_BASIC_CFG_PTR->BoardID)
|
||||
{
|
||||
@@ -792,7 +797,7 @@ static void s_Area_SetCommStatus_byID(CM_UINT8 ID, CM_UINT32 sn, CM_BOOL rcv_fla
|
||||
/**
|
||||
* @brief 根据ID获取接收状态
|
||||
*/
|
||||
static void s_Area_GetCommStatus_byID(CM_UINT8 ID, CM_UINT32* sn, CM_UINT8* rcv_flag)
|
||||
void AreaArb_GetCommStatus_byID(CM_UINT8 ID, CM_UINT32* sn, CM_BOOL* rcv_flag)
|
||||
{
|
||||
if(ID == AREA_BASIC_CFG_PTR->BoardID)
|
||||
{
|
||||
|
||||
@@ -123,5 +123,13 @@ void Area_Arb_Stop();
|
||||
*
|
||||
*/
|
||||
void Area_Arb_Wait_Stop();
|
||||
/**
|
||||
* @brief 根据ID设置接收状态
|
||||
*/
|
||||
void AreaArb_SetCommStatus_byID(CM_UINT8 ID, CM_UINT32 sn, CM_BOOL rcv_flag);
|
||||
/**
|
||||
* @brief 根据ID获取接收状态
|
||||
*/
|
||||
void AreaArb_GetCommStatus_byID(CM_UINT8 ID, CM_UINT32* SN, CM_BOOL* rcv_flag);
|
||||
|
||||
#endif
|
||||
@@ -195,8 +195,11 @@ void s_Master_vote(void)
|
||||
*/
|
||||
void s_Slave_vote(void)
|
||||
{
|
||||
CM_BOOL flag_comm_mm_status = CM_FALSE; /**与主地主的通信状态 */
|
||||
static CM_UINT32 s_slave_cnt = 0u; /**备系降离线容忍计数 */
|
||||
CM_UINT8 id_mm = AreaArb_GetID_byState(ENUM_AREA_MASTER, ENUM_2x2_MASTER); /**主地主的ID */
|
||||
AreaArb_GetCommStatus_byID(id_mm, NULL, &flag_comm_mm_status);
|
||||
|
||||
CM_BOOL Sync_Fail_Flag = AREA_FLAGS_CTRL_PTR->Sync_Fail_Flag; /**同步失败标志 */
|
||||
if(0x55u == AREA_ARB_CTRL_PTR->Arb_Ack)
|
||||
{
|
||||
@@ -207,7 +210,7 @@ void s_Slave_vote(void)
|
||||
else if(CM_FALSE == Sync_Fail_Flag)
|
||||
{
|
||||
/**同步失败 */
|
||||
if(0u != id_mm)
|
||||
if(CM_TRUE == flag_comm_mm_status)
|
||||
{
|
||||
/**主地主存活,降离线 */
|
||||
VOTE_STATE_CTRL->Local_state = ENUM_AREA_OFFLINE;
|
||||
@@ -216,7 +219,7 @@ void s_Slave_vote(void)
|
||||
}
|
||||
else
|
||||
{
|
||||
/**主地主ID不存在,认为主地主宕机,容忍一周期降离线 */
|
||||
/**与主地主通信中断,认为主地主宕机,容忍一周期降离线 */
|
||||
s_slave_cnt++;
|
||||
if(s_slave_cnt > MSCP_AREA_SLAVE_TOLERATE_COUNT)
|
||||
{
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
#define TIME_OFFSET_PEER (1) //对端时间偏移量
|
||||
static STRU_CFM_TIME_CTRL_T s_TimeCtrl[10] = {0};
|
||||
#define SFM_2oo2_TM_FIX_VAL_NS (3 * CM_MILLION) /* 2oo2校时门限,单位:ns */
|
||||
#define SFM_2x2_TM_FIX_VAL_NS (10 * CM_MILLION) /* 2x最小调整偏差,单位:ns */
|
||||
#define SFM_2x2_TM_FIX_VAL_NS (5 * CM_MILLION) /* 2x最小调整偏差,单位:ns */
|
||||
#define SFM_TIME_SYNC_TOLERANCE_COUNT (5u) /* 时间同步切换, 丢失容忍次数*/
|
||||
|
||||
static CM_THREAD_FUNC_T t_Sync_TimeThread(IN CM_Thread_Arg_Struct_T* arg);
|
||||
|
||||
Reference in New Issue
Block a user