From 2bd874bd40304ca2537302b63d53c1124d38ca5a Mon Sep 17 00:00:00 2001 From: lh <3191213465@qq.com> Date: Mon, 24 Aug 2026 16:25:16 +0800 Subject: [PATCH] =?UTF-8?q?1.=E5=A2=9E=E5=8A=A0=E9=98=B6=E6=AE=B5=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E6=89=93=E5=8D=B0=202.=E4=BF=AE=E6=94=B9=E8=B6=85?= =?UTF-8?q?=E6=97=B6=E6=8E=A5=E6=94=B6=E9=80=BB=E8=BE=91=203.=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E6=9C=AA=E7=9F=A5=E5=9C=B0->=E7=A6=BB=E7=BA=BF?= =?UTF-8?q?=E5=9C=B0=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TSCP/src/MSCP/Arb/Arb.c | 362 ++++++++++++++--------------- TSCP/src/MSCP/Arb/Arb_State_Vote.c | 13 +- TSCP/src/MSCP/SFM/SFM_2x2.c | 2 +- 3 files changed, 185 insertions(+), 192 deletions(-) diff --git a/TSCP/src/MSCP/Arb/Arb.c b/TSCP/src/MSCP/Arb/Arb.c index a68311a..9e15864 100644 --- a/TSCP/src/MSCP/Arb/Arb.c +++ b/TSCP/src/MSCP/Arb/Arb.c @@ -8,16 +8,29 @@ #include "Arb_State.h" #include "CFM_Sync.h" #include "Arb_State_Vote.h" +#include "CM_Convert.h" /*===========↓↓↓↓↓全局变量声明&定义↓↓↓↓↓=============*/ -STRU_AREA_WITH_ARB_CFG_ALL_T g_area_with_arb_cfg = {0}; + +static CM_UINT64 s_area_arb_start_time = 0u; +STRU_AREA_WITH_ARB_CFG_ALL_T g_area_with_arb_cfg = {0}; /**区域控制信息汇总 */ /*===========↑↑↑↑↑全局变量声明&定义↑↑↑↑↑=============*/ +/*===========↓↓↓↓↓宏定义↓↓↓↓↓=============*/ + +#define AREA_ARB_NOW_USED_TIME ((CM_GetTick() - s_area_arb_start_time) / CM_UNSIGNED_MILLION) +/*===========↑↑↑↑↑宏定义↑↑↑↑↑=============*/ + /*===========↓↓↓↓↓静态函数声明↓↓↓↓↓=============*/ + /** * @brief 根据已打包的线路报文计算并同步双CRC */ static void s_Area_DoubleCRC_Get(IN const CM_UINT8* buf, IN CM_UINT32 len, OUT CM_UINT32* crc1, OUT CM_UINT32* crc2); +/** + * @brief 地间状态帧组包、计算CRC并发送 + */ +static ENUM_CM_RETURN s_Area_State_Pack_Send(INOUT STRU_AREA_WITH_ARB_STATE_PACK_T* state_pack); /** * @brief 区域工作线程(带仲裁) */ @@ -82,8 +95,11 @@ static void s_Area_SetCommStatus_byID(CM_UINT8 ID, CM_UINT32 sn, CM_BOOL rcv_fla static void s_Area_GetCommStatus_byID(CM_UINT8 ID, CM_UINT32* SN, CM_UINT8* rcv_flag); /** * @brief 对接收到的区域状态请求进行2取同步 + * @param ack_flags 记录是否需要进行ACK回复 + * @param time 记录当前所用时间,2取后双CPU同时退出循环 + * @return 2取另一CPU所用时间 */ -static void s_Area_2oo2Sync_AfterStateRecv(CM_BOOL ack_flags[5]); +static CM_UINT32 s_Area_2oo2Sync_AfterStateRecv(CM_BOOL ack_flags[5], CM_UINT32 time); /** * @brief 2取同步后,判断本周期是否收到请求,并进行回复组包发送 * @param ack_partner 是否需要向对系回复ACK @@ -99,47 +115,7 @@ static void s_Area_2oo2Sync_AfterArbRecv(); /*===========↓↓↓↓↓函数定义↓↓↓↓↓↓=============*/ -/** - * @brief 根据已打包的线路报文计算并同步双CRC - */ -static void s_Area_DoubleCRC_Get(IN const CM_UINT8* buf, IN CM_UINT32 len, - OUT CM_UINT32* crc1, OUT CM_UINT32* crc2) -{ - CM_UINT32 local_crc[2] = {0u, 0u}; - CM_UINT32 peer_crc[2] = {0u, 0u}; - CM_INT32 rcv_len = 0; - if((NULL == buf) || (NULL == crc1) || (NULL == crc2) || (len < 9u)) - { - CM_ASSERT(0, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_2, TSCP_DARK_ASSERT_1); - return; - } - - if(1u == AREA_BASIC_CFG_PTR->Cpuid) - { - local_crc[0] = CM_Crc32_1(&buf[1], len - 9u); - } - else - { - local_crc[1] = CM_Crc32_2(&buf[1], len - 9u); - } - - rcv_len = Area_2oo2_Currency_NoSplit((const CM_UINT8*)local_crc, - sizeof(local_crc), (CM_UINT8*)peer_crc, sizeof(peer_crc)); - CM_ASSERT(rcv_len == sizeof(local_crc), NET_MODE, - DARK_FAULT_CODE_FUN_ORDER_2, TSCP_DARK_ASSERT_1); - - if(1u == AREA_BASIC_CFG_PTR->Cpuid) - { - local_crc[1] = peer_crc[1]; - } - else - { - local_crc[0] = peer_crc[0]; - } - *crc1 = local_crc[0]; - *crc2 = local_crc[1]; -} /** * 区域初始化,包含第三方仲裁的初始化 @@ -190,14 +166,16 @@ static CM_THREAD_FUNC_T s_Area_With_Arb_Work_Thread(IN CM_Thread_Arg_Struct_T* a { /* 绑定内核 */ void* pmask = NULL; + CM_UINT64 stage_start = 0u; pmask = (void*)(0x01u|0x02u); (void)ThreadCtl(_NTO_TCTL_RUNMASK, pmask); - /* 情况缓冲区 */ + /* 清空缓冲区 */ Area_Arb_ClearMsgQ(); /* 线程循环 */ while(1) { Area_Arb_Wait_Start(); + 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", @@ -205,13 +183,25 @@ static CM_THREAD_FUNC_T s_Area_With_Arb_Work_Thread(IN CM_Thread_Arg_Struct_T* a AREA_STATE_CTRL_PTR->StateArea.Local_state, AREA_STATE_CTRL_PTR->State2x.LocalState); /**主地主组播发送状态帧,其余板卡接收 */ + stage_start = CM_GetTick(); s_Area_State_Multi_Process(); + AREA_LOG_MSG("AREA_ARB:State multicast stage cost:%llums, AREA_ARB_NOW_USED_TIME:%llums\n", + (CM_GetTick() - stage_start) / CM_UNSIGNED_MILLION, AREA_ARB_NOW_USED_TIME); /**主地双系/初始化阶段发送状态请求帧 */ + stage_start = CM_GetTick(); s_Area_State_Req_Send_Process(); + AREA_LOG_MSG("AREA_ARB:State request send stage cost:%llums, AREA_ARB_NOW_USED_TIME:%llums\n", + (CM_GetTick() - stage_start) / CM_UNSIGNED_MILLION, AREA_ARB_NOW_USED_TIME); /**对应答帧的处理 */ + stage_start = CM_GetTick(); s_Area_State_Ack_Process(); + AREA_LOG_MSG("AREA_ARB:State request/ACK stage cost:%llums, AREA_ARB_NOW_USED_TIME:%llums\n", + (CM_GetTick() - stage_start) / CM_UNSIGNED_MILLION, AREA_ARB_NOW_USED_TIME); /**仲裁请求发送/接收的处理 */ + stage_start = CM_GetTick(); s_Area_Arb_Process(); + AREA_LOG_MSG("AREA_ARB:Arbitration request/ACK stage cost:%llums, AREA_ARB_NOW_USED_TIME:%llums\n", + (CM_GetTick() - stage_start) / CM_UNSIGNED_MILLION, AREA_ARB_NOW_USED_TIME); /**状态转移 */ s_Area_Arb_State_Transition(); @@ -289,9 +279,7 @@ static void s_Area_State_Multi_Process(void) static void s_Area_State_Req_Send_Process(void) { STRU_AREA_WITH_ARB_STATE_PACK_T state_pack = {0}; - CM_INT32 tmp_len = 0; ENUM_CM_RETURN send_rt = ENUM_CM_FALSE; - CM_UINT8 tmp_buf[1400] = {0u}; /**发送帧初始化 */ state_pack.Len = AREA_ARB_STATE_PACK_LEN - 1u; state_pack.MsgType = ENUM_AREA_MSG_STATE_REQ; @@ -310,57 +298,21 @@ static void s_Area_State_Req_Send_Process(void) /**未知地主系(仅A地),刚上电,向其他三系发送请求 */ /**发送至本地另一系 */ state_pack.DstID = AREA_BASIC_CFG_PTR->Partner_BoardID; - tmp_len = Area_Arb_State_Pack(tmp_buf, sizeof(tmp_buf), &state_pack); - if(AREA_ARB_STATE_PACK_LEN == tmp_len) - { - s_Area_DoubleCRC_Get(tmp_buf, (CM_UINT32)tmp_len, &state_pack.CRC1, &state_pack.CRC2); - tmp_len = Area_Arb_State_Pack(tmp_buf, sizeof(tmp_buf), &state_pack); - CM_ASSERT(AREA_ARB_STATE_PACK_LEN == tmp_len, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_2, TSCP_DARK_ASSERT_1); - send_rt = Area_State_Send(AREA_BASIC_CFG_PTR->Partner_BoardID, tmp_buf, tmp_len); - AREA_LOG_MSG("AREA_ARB:State request send, DstID:%d SN:%u State:%d 2x2:%d Result:0x%x\n", - state_pack.DstID, state_pack.SN, state_pack.StateArea, state_pack.State2x, send_rt); - } - else - { - AREA_LOG_MSG("AREA_ARB:State request pack failed, DstID:%d Len:%d\n", - state_pack.DstID, tmp_len); - } + send_rt = s_Area_State_Pack_Send(&state_pack); + AREA_LOG_MSG("AREA_ARB:State request send, DstID:%d SN:%u State:%d 2x2:%d Result:0x%x\n", + state_pack.DstID, state_pack.SN, state_pack.StateArea, state_pack.State2x, send_rt); /**发送至另一地的A系 */ state_pack.DstID = AREA_BASIC_CFG_PTR->Partner_Area_A_BoardID; - tmp_len = Area_Arb_State_Pack(tmp_buf, sizeof(tmp_buf), &state_pack); - if(AREA_ARB_STATE_PACK_LEN == tmp_len) - { - s_Area_DoubleCRC_Get(tmp_buf, (CM_UINT32)tmp_len, &state_pack.CRC1, &state_pack.CRC2); - tmp_len = Area_Arb_State_Pack(tmp_buf, sizeof(tmp_buf), &state_pack); - CM_ASSERT(AREA_ARB_STATE_PACK_LEN == tmp_len, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_2, TSCP_DARK_ASSERT_1); - send_rt = Area_State_Send(AREA_BASIC_CFG_PTR->Partner_Area_A_BoardID, tmp_buf, tmp_len); - AREA_LOG_MSG("AREA_ARB:State request send, DstID:%d SN:%u State:%d 2x2:%d Result:0x%x\n", - state_pack.DstID, state_pack.SN, state_pack.StateArea, state_pack.State2x, send_rt); - } - else - { - AREA_LOG_MSG("AREA_ARB:State request pack failed, DstID:%d Len:%d\n", - state_pack.DstID, tmp_len); - } + send_rt = s_Area_State_Pack_Send(&state_pack); + AREA_LOG_MSG("AREA_ARB:State request send, DstID:%d SN:%u State:%d 2x2:%d Result:0x%x\n", + state_pack.DstID, state_pack.SN, state_pack.StateArea, state_pack.State2x, send_rt); /**发送至另一地的B系 */ state_pack.DstID = AREA_BASIC_CFG_PTR->Partner_Area_B_BoardID; - tmp_len = Area_Arb_State_Pack(tmp_buf, sizeof(tmp_buf), &state_pack); - if(AREA_ARB_STATE_PACK_LEN == tmp_len) - { - s_Area_DoubleCRC_Get(tmp_buf, (CM_UINT32)tmp_len, &state_pack.CRC1, &state_pack.CRC2); - tmp_len = Area_Arb_State_Pack(tmp_buf, sizeof(tmp_buf), &state_pack); - CM_ASSERT(AREA_ARB_STATE_PACK_LEN == tmp_len, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_2, TSCP_DARK_ASSERT_1); - send_rt = Area_State_Send(AREA_BASIC_CFG_PTR->Partner_Area_B_BoardID, tmp_buf, tmp_len); - AREA_LOG_MSG("AREA_ARB:State request send, DstID:%d SN:%u State:%d 2x2:%d Result:0x%x\n", - state_pack.DstID, state_pack.SN, state_pack.StateArea, state_pack.State2x, send_rt); - } - else - { - AREA_LOG_MSG("AREA_ARB:State request pack failed, DstID:%d Len:%d\n", - state_pack.DstID, tmp_len); - } + send_rt = s_Area_State_Pack_Send(&state_pack); + AREA_LOG_MSG("AREA_ARB:State request send, DstID:%d SN:%u State:%d 2x2:%d Result:0x%x\n", + state_pack.DstID, state_pack.SN, state_pack.StateArea, state_pack.State2x, send_rt); } else if(ENUM_AREA_MASTER == AREA_STATE_CTRL_PTR->StateArea.Local_state && ((ENUM_2x2_MASTER == AREA_STATE_CTRL_PTR->State2x.LocalState) || (ENUM_2x2_SLAVE == AREA_STATE_CTRL_PTR->State2x.LocalState))) @@ -368,39 +320,15 @@ static void s_Area_State_Req_Send_Process(void) /**主地主备系,周期运行阶段,向另一地发送请求 */ /**发送至另一地的A系 */ state_pack.DstID = AREA_BASIC_CFG_PTR->Partner_Area_A_BoardID; - tmp_len = Area_Arb_State_Pack(tmp_buf, sizeof(tmp_buf), &state_pack); - if(AREA_ARB_STATE_PACK_LEN == tmp_len) - { - s_Area_DoubleCRC_Get(tmp_buf, (CM_UINT32)tmp_len, &state_pack.CRC1, &state_pack.CRC2); - tmp_len = Area_Arb_State_Pack(tmp_buf, sizeof(tmp_buf), &state_pack); - CM_ASSERT(AREA_ARB_STATE_PACK_LEN == tmp_len, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_2, TSCP_DARK_ASSERT_1); - send_rt = Area_State_Send(AREA_BASIC_CFG_PTR->Partner_Area_A_BoardID, tmp_buf, tmp_len); - AREA_LOG_MSG("AREA_ARB:State request send, DstID:%d SN:%u State:%d 2x2:%d Result:0x%x\n", - state_pack.DstID, state_pack.SN, state_pack.StateArea, state_pack.State2x, send_rt); - } - else - { - AREA_LOG_MSG("AREA_ARB:State request pack failed, DstID:%d Len:%d\n", - state_pack.DstID, tmp_len); - } + send_rt = s_Area_State_Pack_Send(&state_pack); + AREA_LOG_MSG("AREA_ARB:State request send, DstID:%d SN:%u State:%d 2x2:%d Result:0x%x\n", + state_pack.DstID, state_pack.SN, state_pack.StateArea, state_pack.State2x, send_rt); /**发送至另一地的B系 */ state_pack.DstID = AREA_BASIC_CFG_PTR->Partner_Area_B_BoardID; - tmp_len = Area_Arb_State_Pack(tmp_buf, sizeof(tmp_buf), &state_pack); - if(AREA_ARB_STATE_PACK_LEN == tmp_len) - { - s_Area_DoubleCRC_Get(tmp_buf, (CM_UINT32)tmp_len, &state_pack.CRC1, &state_pack.CRC2); - tmp_len = Area_Arb_State_Pack(tmp_buf, sizeof(tmp_buf), &state_pack); - CM_ASSERT(AREA_ARB_STATE_PACK_LEN == tmp_len, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_2, TSCP_DARK_ASSERT_1); - send_rt = Area_State_Send(AREA_BASIC_CFG_PTR->Partner_Area_B_BoardID, tmp_buf, tmp_len); - AREA_LOG_MSG("AREA_ARB:State request send, DstID:%d SN:%u State:%d 2x2:%d Result:0x%x\n", - state_pack.DstID, state_pack.SN, state_pack.StateArea, state_pack.State2x, send_rt); - } - else - { - AREA_LOG_MSG("AREA_ARB:State request pack failed, DstID:%d Len:%d\n", - state_pack.DstID, tmp_len); - } + send_rt = s_Area_State_Pack_Send(&state_pack); + AREA_LOG_MSG("AREA_ARB:State request send, DstID:%d SN:%u State:%d 2x2:%d Result:0x%x\n", + state_pack.DstID, state_pack.SN, state_pack.StateArea, state_pack.State2x, send_rt); } else { @@ -426,10 +354,11 @@ static void s_Area_State_Ack_Process(void) CM_UINT8 area_b_id = AREA_BASIC_CFG_PTR->Partner_Area_B_BoardID; 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 peer_time = 0u; CM_UINT32 i = 0u; /**持续30ms */ - for(i = 0u;i<10;i++) + do { /**REQ与ACK共用一个FIFO,每条报文只读取一次并按类型分发。 */ do @@ -465,13 +394,13 @@ static void s_Area_State_Ack_Process(void) } while(0 < rcv_len); /**同步接收状态和本周期ACK目标,再统一回复。 */ - s_Area_2oo2Sync_AfterStateRecv(ack_flags); + used_time = (CM_UINT32)(CM_GetTick() / CM_UNSIGNED_MILLION) - start_tick; + peer_time = s_Area_2oo2Sync_AfterStateRecv(ack_flags, used_time); 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; - } + CM_Sleep(1u); + }while(30 >= peer_time && 30 >= used_time); } static void s_Area_State_Req_Recv_Process(IN const STRU_AREA_WITH_ARB_STATE_PACK_T* state_pack, @@ -491,8 +420,8 @@ static void s_Area_State_Req_Recv_Process(IN const STRU_AREA_WITH_ARB_STATE_PACK s_Area_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\n", - state_pack->SrcID, state_pack->SN, state_pack->StateArea, 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", + state_pack->SrcID, state_pack->SN, state_pack->StateArea, state_pack->State2x, AREA_ARB_NOW_USED_TIME); } } @@ -516,13 +445,13 @@ static void s_Area_State_Ack_Recv_Process(IN const STRU_AREA_WITH_ARB_STATE_PACK s_Area_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\n", - state_pack->SrcID, state_pack->SN, state_pack->StateArea, 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", + state_pack->SrcID, state_pack->SN, state_pack->StateArea, state_pack->State2x, AREA_ARB_NOW_USED_TIME); } 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); + AREA_LOG_MSG("AREA_ARB:State ACK recv failed, SrcID:%d SN:%u State:%d 2x2:%d, AREA_ARB_NOW_USED_TIME:%llums\n", + state_pack->SrcID, state_pack->SN, state_pack->StateArea, state_pack->State2x, AREA_ARB_NOW_USED_TIME); } } @@ -533,7 +462,6 @@ static void s_Area_Arb_Process(void) { s_Area_Arb_Send_Process(); /**等待20ms仲裁回复 */ - CM_Sleep(20u); s_Area_Arb_Recv_Process(); } /** @@ -633,45 +561,52 @@ static void s_Area_Arb_Recv_Process(void) { STRU_AREA_WITH_ARB_PACK_T arb_pack = {0}; CM_INT32 rcv_len = 0; - CM_UINT8 tmp_buf[1400] = {0}; + CM_UINT8 tmp_buf[AREA_ARB_FRAME_PACK_LEN] = {0}; CM_UINT32 crc1 = 0u, crc2 = 0u; CM_UINT32 local_sn = DFM_GetBirthCount(); CM_UINT16 local_outnetid = AREA_BASIC_CFG_PTR->OutnetID; CM_UINT8 local_id = AREA_BASIC_CFG_PTR->BoardID; + CM_UINT32 tick_now = (CM_UINT32)(CM_GetTick() / CM_UNSIGNED_MILLION); + CM_UINT32 tick_start = tick_now, used_time = 0u; /**清空仲裁状态 */ AREA_ARB_CTRL_PTR->Arb_Ack = 0x00u; - /**仲裁请求接收 */ - rcv_len = Area_Arb_Ack_Recv(tmp_buf, sizeof(tmp_buf)); - /**解包处理 */ - if(AREA_ARB_FRAME_PACK_LEN == rcv_len) + /**持续20ms循环接收仲裁应答 */ + do { - Area_Arb_Frame_UnPack(&arb_pack, tmp_buf, (CM_UINT32)rcv_len); - crc1 = CM_Crc32_1(&tmp_buf[1], (CM_UINT32)rcv_len - 9u); - crc2 = CM_Crc32_2(&tmp_buf[1], (CM_UINT32)rcv_len - 9u); - if(crc1 == arb_pack.CRC1 && crc2 == arb_pack.CRC2 && - ((AREA_ARB_FRAME_PACK_LEN - 1u) == arb_pack.Len) && - local_sn == arb_pack.ArbSN && ENUM_AREA_MSG_ARB_ACK == arb_pack.MsgType && - local_outnetid == arb_pack.OutNet_ID && local_id == arb_pack.Board_ID) + rcv_len = Area_Arb_Ack_Recv(tmp_buf, sizeof(tmp_buf)); + /**解包处理 */ + if(AREA_ARB_FRAME_PACK_LEN == rcv_len) { - if(0x55 == arb_pack.ArbPayLoad) + Area_Arb_Frame_UnPack(&arb_pack, tmp_buf, (CM_UINT32)rcv_len); + crc1 = CM_Crc32_1(&tmp_buf[1], (CM_UINT32)rcv_len - 9u); + crc2 = CM_Crc32_2(&tmp_buf[1], (CM_UINT32)rcv_len - 9u); + if(crc1 == arb_pack.CRC1 && crc2 == arb_pack.CRC2 && + ((AREA_ARB_FRAME_PACK_LEN - 1u) == arb_pack.Len) && + local_sn == arb_pack.ArbSN && ENUM_AREA_MSG_ARB_ACK == arb_pack.MsgType && + local_outnetid == arb_pack.OutNet_ID && local_id == arb_pack.Board_ID) { - /**允许升主 */ - AREA_ARB_CTRL_PTR->Arb_Ack = 0x55u; - AREA_LOG_MSG("AREA_ARB:Arbitration ACK accepted, BoardID:%d SN:%d Payload:0x%x\n", - local_id, arb_pack.ArbSN, arb_pack.ArbPayLoad); + if(0x55 == arb_pack.ArbPayLoad) + { + /**允许升主 */ + AREA_ARB_CTRL_PTR->Arb_Ack = 0x55u; + AREA_LOG_MSG("AREA_ARB:Arbitration ACK accepted, BoardID:%d SN:%d Payload:0x%x\n", + local_id, arb_pack.ArbSN, arb_pack.ArbPayLoad); + } + } + else + { + AREA_LOG_MSG("AREA_ARB:Invalid arbitration ACK, BoardID:%d SN:%d CRC:%08x-%08x/%08x-%08x\n", + arb_pack.Board_ID, arb_pack.ArbSN, crc1, arb_pack.CRC1, crc2, arb_pack.CRC2); } } else { - AREA_LOG_MSG("AREA_ARB:Invalid arbitration ACK, BoardID:%d SN:%d CRC:%08x-%08x/%08x-%08x\n", - arb_pack.Board_ID, arb_pack.ArbSN, crc1, arb_pack.CRC1, crc2, arb_pack.CRC2); + CM_Sleep(1u); } - } - else if(0 < rcv_len) - { - AREA_LOG_MSG("AREA_ARB:Invalid arbitration ACK length, RecvLen:%d FrameLen:%d\n", - rcv_len, arb_pack.Len); - } + tick_now = (CM_UINT32)(CM_GetTick() / CM_UNSIGNED_MILLION); + used_time = tick_now - tick_start; + } while(used_time < 20u); + s_Area_2oo2Sync_AfterArbRecv(); } /** @@ -778,10 +713,9 @@ static void s_Area_State_Multi_Recv_Process(void) } else { - AREA_LOG_MSG("AREA_ARB:Multicast state received, tickNow - tickRcv = %llums\n", tickNow - tickRcv); + CM_Sleep(1u); } usedTime = tickNow - tickStart; - CM_Sleep(1u); } while (usedTime < 10u); @@ -910,7 +844,7 @@ static void s_Area_GetCommStatus_byID(CM_UINT8 ID, CM_UINT32* sn, CM_UINT8* rcv_ /** * @brief 对接收到的区域状态请求进行2取同步 */ -static void s_Area_2oo2Sync_AfterStateRecv(CM_BOOL ack_flags[5]) +static CM_UINT32 s_Area_2oo2Sync_AfterStateRecv(CM_BOOL ack_flags[5], CM_UINT32 used_time) { STRU_AREA_WITH_ARB_COMM_STATUS_T peer_comm_status = {0}; STRU_AREA_WITH_ARB_STATE_CTRL_T peer_state_ctrl = {0}; @@ -921,6 +855,8 @@ static void s_Area_2oo2Sync_AfterStateRecv(CM_BOOL ack_flags[5]) CM_UINT8 id = 0u; CM_UINT8 send_buf [1400] = {0}, rcv_buf[1400]; CM_INT32 send_len = 0u, rcv_len = 0u; + CM_UINT32 rcv_offset = 0u; + CM_UINT32 peer_time = 0u; /**将接收状态进行组包2取 */ if((NULL != ack_flags) && @@ -932,6 +868,8 @@ static void s_Area_2oo2Sync_AfterStateRecv(CM_BOOL ack_flags[5]) send_len += len_state_ctrl; CM_Memcpy(&send_buf[send_len], sizeof(send_buf) - send_len, ack_flags, len_ack_flags); send_len += len_ack_flags; + CM_LongToChar(used_time, &send_buf[send_len]); + send_len += 4u; } rcv_len = Area_2oo2_Currency_NoSplit(send_buf, send_len, rcv_buf, sizeof(rcv_buf)); if(rcv_len != send_len) @@ -941,9 +879,14 @@ static void s_Area_2oo2Sync_AfterStateRecv(CM_BOOL ack_flags[5]) } CM_ASSERT(rcv_len == send_len, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_2, TSCP_DARK_ASSERT_1); /**对另一CPU数据解析 */ - CM_Memcpy(&peer_comm_status, len_comm_status,rcv_buf, len_comm_status); - CM_Memcpy(&peer_state_ctrl, len_state_ctrl,rcv_buf + len_comm_status, len_state_ctrl); - CM_Memcpy(peer_ack_flags, len_ack_flags, rcv_buf + len_comm_status + len_state_ctrl, len_ack_flags); + rcv_offset = 0u; + CM_Memcpy(&peer_comm_status, len_comm_status,&rcv_buf[rcv_offset], len_comm_status); + rcv_offset += len_comm_status; + CM_Memcpy(&peer_state_ctrl, len_state_ctrl,&rcv_buf[rcv_offset], len_state_ctrl); + rcv_offset += len_state_ctrl; + CM_Memcpy(peer_ack_flags, len_ack_flags, &rcv_buf[rcv_offset], len_ack_flags); + rcv_offset += len_ack_flags; + peer_time = CM_LongFromChar(&rcv_buf[rcv_offset]); /**任一CPU收到请求,两个CPU都使用相同的ACK目标。 */ for(id = MSCP_AREA_A_BOARD_ID_A; id <= MSCP_AREA_B_BOARD_ID_B; id++) @@ -1013,6 +956,8 @@ static void s_Area_2oo2Sync_AfterStateRecv(CM_BOOL ack_flags[5]) { /**接收到的对系序列号相同,或者本CPU为新数据,无操作*/ } + + return peer_time; } /** * @brief 2取同步后,判断本周期是否收到请求,并进行回复组包发送 @@ -1020,8 +965,6 @@ static void s_Area_2oo2Sync_AfterStateRecv(CM_BOOL ack_flags[5]) static void s_Area_SendACK_After2oo2(CM_BOOL ack_partner, CM_BOOL ack_area_a, CM_BOOL ack_area_b) { STRU_AREA_WITH_ARB_STATE_PACK_T state_pack = {0}; - CM_UINT8 tmp_buf[1400] = {0}; - CM_INT32 tmp_len = 0; ENUM_CM_RETURN send_rt = ENUM_CM_FALSE; /**发送帧初始化 */ state_pack.Len = AREA_ARB_STATE_PACK_LEN - 1u; @@ -1038,42 +981,27 @@ static void s_Area_SendACK_After2oo2(CM_BOOL ack_partner, CM_BOOL ack_area_a, CM /**接收到了对系的请求,组包回复 */ state_pack.DstID = AREA_BASIC_CFG_PTR->Partner_BoardID; state_pack.SN = AREA_COMM_STATUS_PTR->PatnerSN; - tmp_len = Area_Arb_State_Pack(tmp_buf, sizeof(tmp_buf), &state_pack); - CM_ASSERT(AREA_ARB_STATE_PACK_LEN == tmp_len, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_2, TSCP_DARK_ASSERT_1); - s_Area_DoubleCRC_Get(tmp_buf, (CM_UINT32)tmp_len, &state_pack.CRC1, &state_pack.CRC2); - tmp_len = Area_Arb_State_Pack(tmp_buf, sizeof(tmp_buf), &state_pack); - CM_ASSERT(AREA_ARB_STATE_PACK_LEN == tmp_len, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_2, TSCP_DARK_ASSERT_1); - send_rt = Area_State_Send(AREA_BASIC_CFG_PTR->Partner_BoardID, tmp_buf, tmp_len); - AREA_LOG_MSG("AREA_ARB:State ACK send, DstID:%d SN:%u State:%d 2x2:%d Result:0x%x\n", - state_pack.DstID, state_pack.SN, state_pack.StateArea, state_pack.State2x, send_rt); + send_rt = s_Area_State_Pack_Send(&state_pack); + AREA_LOG_MSG("AREA_ARB:State ACK send, DstID:%d SN:%u State:%d 2x2:%d Result:0x%x, AREA_ARB_NOW_USED_TIME:%llums\n", + state_pack.DstID, state_pack.SN, state_pack.StateArea, state_pack.State2x, send_rt, AREA_ARB_NOW_USED_TIME); } if(CM_TRUE == AREA_COMM_STATUS_PTR->Area_A_RcvFlag && CM_TRUE == ack_area_a) { /**接收到了另一地A系的请求,组包回复 */ state_pack.DstID = AREA_BASIC_CFG_PTR->Partner_Area_A_BoardID; state_pack.SN = AREA_COMM_STATUS_PTR->Area_A_SN; - tmp_len = Area_Arb_State_Pack(tmp_buf, sizeof(tmp_buf), &state_pack); - CM_ASSERT(AREA_ARB_STATE_PACK_LEN == tmp_len, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_2, TSCP_DARK_ASSERT_1); - s_Area_DoubleCRC_Get(tmp_buf, (CM_UINT32)tmp_len, &state_pack.CRC1, &state_pack.CRC2); - tmp_len = Area_Arb_State_Pack(tmp_buf, sizeof(tmp_buf), &state_pack); - CM_ASSERT(AREA_ARB_STATE_PACK_LEN == tmp_len, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_2, TSCP_DARK_ASSERT_1); - send_rt = Area_State_Send(AREA_BASIC_CFG_PTR->Partner_Area_A_BoardID, tmp_buf, tmp_len); - AREA_LOG_MSG("AREA_ARB:State ACK send, DstID:%d SN:%u State:%d 2x2:%d Result:0x%x\n", - state_pack.DstID, state_pack.SN, state_pack.StateArea, state_pack.State2x, send_rt); + send_rt = s_Area_State_Pack_Send(&state_pack); + AREA_LOG_MSG("AREA_ARB:State ACK send, DstID:%d SN:%u State:%d 2x2:%d Result:0x%x, AREA_ARB_NOW_USED_TIME:%llums\n", + state_pack.DstID, state_pack.SN, state_pack.StateArea, state_pack.State2x, send_rt, AREA_ARB_NOW_USED_TIME); } if(CM_TRUE == AREA_COMM_STATUS_PTR->Area_B_RcvFlag && CM_TRUE == ack_area_b) { /**接收到了另一地A系的请求,组包回复 */ state_pack.DstID = AREA_BASIC_CFG_PTR->Partner_Area_B_BoardID; state_pack.SN = AREA_COMM_STATUS_PTR->Area_B_SN; - tmp_len = Area_Arb_State_Pack(tmp_buf, sizeof(tmp_buf), &state_pack); - CM_ASSERT(AREA_ARB_STATE_PACK_LEN == tmp_len, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_2, TSCP_DARK_ASSERT_1); - s_Area_DoubleCRC_Get(tmp_buf, (CM_UINT32)tmp_len, &state_pack.CRC1, &state_pack.CRC2); - tmp_len = Area_Arb_State_Pack(tmp_buf, sizeof(tmp_buf), &state_pack); - CM_ASSERT(AREA_ARB_STATE_PACK_LEN == tmp_len, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_2, TSCP_DARK_ASSERT_1); - send_rt = Area_State_Send(AREA_BASIC_CFG_PTR->Partner_Area_B_BoardID, tmp_buf, tmp_len); - AREA_LOG_MSG("AREA_ARB:State ACK send, DstID:%d SN:%u State:%d 2x2:%d Result:0x%x\n", - state_pack.DstID, state_pack.SN, state_pack.StateArea, state_pack.State2x, send_rt); + send_rt = s_Area_State_Pack_Send(&state_pack); + AREA_LOG_MSG("AREA_ARB:State ACK send, DstID:%d SN:%u State:%d 2x2:%d Result:0x%x, AREA_ARB_NOW_USED_TIME:%llums\n", + state_pack.DstID, state_pack.SN, state_pack.StateArea, state_pack.State2x, send_rt, AREA_ARB_NOW_USED_TIME); } } /** @@ -1101,3 +1029,59 @@ static void s_Area_2oo2Sync_AfterArbRecv() peer_ctrl.Arb_Ack); } } +/** + * @brief 地间状态帧组包、计算CRC并发送 + */ +static ENUM_CM_RETURN s_Area_State_Pack_Send(INOUT STRU_AREA_WITH_ARB_STATE_PACK_T* state_pack) +{ + CM_UINT8 tmp_buf[AREA_ARB_STATE_PACK_LEN] = {0u}; + + /**第一次打包用于计算双CRC */ + (void)Area_Arb_State_Pack(tmp_buf, sizeof(tmp_buf), state_pack); + s_Area_DoubleCRC_Get(tmp_buf, AREA_ARB_STATE_PACK_LEN, &state_pack->CRC1, &state_pack->CRC2); + /**第二次打包用于发送 */ + (void)Area_Arb_State_Pack(tmp_buf, sizeof(tmp_buf), state_pack); + + return Area_State_Send(state_pack->DstID, tmp_buf, AREA_ARB_STATE_PACK_LEN); +} +/** + * @brief 根据已打包的线路报文计算并同步双CRC + */ +static void s_Area_DoubleCRC_Get(IN const CM_UINT8* buf, IN CM_UINT32 len, + OUT CM_UINT32* crc1, OUT CM_UINT32* crc2) +{ + CM_UINT32 local_crc[2] = {0u, 0u}; + CM_UINT32 peer_crc[2] = {0u, 0u}; + CM_INT32 rcv_len = 0; + + if((NULL == buf) || (NULL == crc1) || (NULL == crc2) || (len < 9u)) + { + CM_ASSERT(0, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_2, TSCP_DARK_ASSERT_1); + return; + } + + if(1u == AREA_BASIC_CFG_PTR->Cpuid) + { + local_crc[0] = CM_Crc32_1(&buf[1], len - 9u); + } + else + { + local_crc[1] = CM_Crc32_2(&buf[1], len - 9u); + } + + rcv_len = Area_2oo2_Currency_NoSplit((const CM_UINT8*)local_crc, + sizeof(local_crc), (CM_UINT8*)peer_crc, sizeof(peer_crc)); + CM_ASSERT(rcv_len == sizeof(local_crc), NET_MODE, + DARK_FAULT_CODE_FUN_ORDER_2, TSCP_DARK_ASSERT_1); + + if(1u == AREA_BASIC_CFG_PTR->Cpuid) + { + local_crc[1] = peer_crc[1]; + } + else + { + local_crc[0] = peer_crc[0]; + } + *crc1 = local_crc[0]; + *crc2 = local_crc[1]; +} diff --git a/TSCP/src/MSCP/Arb/Arb_State_Vote.c b/TSCP/src/MSCP/Arb/Arb_State_Vote.c index 4d8cee3..b24d42f 100644 --- a/TSCP/src/MSCP/Arb/Arb_State_Vote.c +++ b/TSCP/src/MSCP/Arb/Arb_State_Vote.c @@ -65,6 +65,7 @@ void s_Shutdown_vote(void) */ void s_Unknown_vote(void) { + CM_BOOL Sync_Health_Flag = AREA_FLAGS_CTRL_PTR->Sync_Health_Flag; /**同步成功标志 */ /**获取另外三系状态 */ ENUM_AREA_STATE Partner_State = VOTE_STATE_CTRL->Partner_state; ENUM_AREA_STATE Area_A_State = VOTE_STATE_CTRL->Partner_Area_A_state; @@ -81,8 +82,16 @@ void s_Unknown_vote(void) else if(ENUM_AREA_MASTER == Partner_State) { /**和主地在同一地 */ - VOTE_STATE_CTRL->Local_state = ENUM_AREA_MASTER; - AREA_LOG_MSG("AREA_STATE_VOTE:Unknow>>>>>Master, Partner is Master\n"); + if(CM_TRUE == Sync_Health_Flag) + { + VOTE_STATE_CTRL->Local_state = ENUM_AREA_MASTER; + AREA_LOG_MSG("AREA_STATE_VOTE:Unknow>>>>>Master, Partner is Master, Sync Sucess\n"); + } + else + { + VOTE_STATE_CTRL->Local_state = ENUM_AREA_OFFLINE; + AREA_LOG_MSG("AREA_STATE_VOTE:Unknow>>>>>Offline, Partner is Master, Sync Fail\n"); + } } else if((ENUM_AREA_UNKNOW == Area_A_State || ENUM_AREA_UNKNOW == Area_B_State) && (MSCP_AREA_ID_B == AREA_BASIC_CFG_PTR->AreaID)) diff --git a/TSCP/src/MSCP/SFM/SFM_2x2.c b/TSCP/src/MSCP/SFM/SFM_2x2.c index 5ac0ddc..53ef2a6 100644 --- a/TSCP/src/MSCP/SFM/SFM_2x2.c +++ b/TSCP/src/MSCP/SFM/SFM_2x2.c @@ -1176,7 +1176,6 @@ void SFM_4x2_ChangeState(void) Area_Wait_Stop(); } - Area_LOG_Transition(); MSCP_LOG_MSG("SFM_4x2_ChangeState start\n"); /*- 执行最后的切系逻辑*/ s_2x2_Ctrl.MineComState = MSCP_Get_2X_VagueCom_State(&s_2x2_state_Ctrl.MineComOKCount[0]); /**< 本机通信状态,2oo2交换 */ @@ -1342,6 +1341,7 @@ void SFM_4x2_ChangeState(void) (void)CFM_DarkLog_Storage(DARK_LOG_HEX, TSCP_DARK_PARTNER, 1U, &s_2x2_Ctrl.PartnerState); SFM_2x2_LOG_Transition(); + Area_LOG_Transition(); MSCP_LOG_MSG("timecurr 16.0.4 = %lld us\n", NOW_USED_TIME); MSCP_LOG_MSG("SFM_4x2_ChangeState stop\n"); }