From e0b03e011f809f0e7a8e8e76dd21c6d21b0a2e66 Mon Sep 17 00:00:00 2001 From: lh <3191213465@qq.com> Date: Fri, 21 Aug 2026 17:22:07 +0800 Subject: [PATCH] =?UTF-8?q?=E9=80=9A=E4=BF=A1bug=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TSCP/src/MSCP/Arb/Arb.c | 444 +++++++++++++++++++--------------- TSCP/src/MSCP/Arb/Arb_Net.c | 29 ++- TSCP/src/MSCP/Arb/Arb_Pack.c | 5 - TSCP/src/MSCP/Arb/Arb_Pack.h | 11 +- TSCP/src/MSCP/Arb/Arb_State.c | 2 +- 5 files changed, 280 insertions(+), 211 deletions(-) diff --git a/TSCP/src/MSCP/Arb/Arb.c b/TSCP/src/MSCP/Arb/Arb.c index c6cfd11..2baeea3 100644 --- a/TSCP/src/MSCP/Arb/Arb.c +++ b/TSCP/src/MSCP/Arb/Arb.c @@ -12,32 +12,12 @@ STRU_AREA_WITH_ARB_CFG_ALL_T g_area_with_arb_cfg = {0}; /*===========↑↑↑↑↑全局变量声明&定义↑↑↑↑↑=============*/ -/*===========↓↓↓↓↓宏定义↓↓↓↓↓=============*/ - -/**宏函数,支持不同帧结构体计算双CRC */ -#define DOUBLE_CRC_GET(mypack, peerpack, tmp_buf, tmp_len) \ - do { \ - if (1 == AREA_BASIC_CFG_PTR->Cpuid) { \ - (mypack).CRC1 = CM_Crc32_1(&(tmp_buf)[1], (tmp_len) - 9); \ - } else { \ - (mypack).CRC2 = CM_Crc32_2(&(tmp_buf)[1], (tmp_len) - 9); \ - } \ - \ - tmp_len = Area_2oo2_Currency_NoSplit( \ - &(mypack), sizeof(mypack), \ - &(peerpack), sizeof(peerpack)); \ - \ - if (1 == AREA_BASIC_CFG_PTR->Cpuid) { \ - (mypack).CRC2 = (peerpack).CRC2; \ - } else { \ - (mypack).CRC1 = (peerpack).CRC1; \ - } \ - } while (0) - -/*===========↑↑↑↑↑宏定义↑↑↑↑↑=============*/ - - /*===========↓↓↓↓↓静态函数声明↓↓↓↓↓=============*/ +/** + * @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 区域工作线程(带仲裁) */ @@ -55,13 +35,15 @@ static void s_Area_State_Req_Send_Process(void); */ static void s_Area_State_Ack_Process(void); /** - * @brief 区域状态的请求接收,发送ACK + * @brief 处理校验通过的状态请求帧 */ -static void s_Area_State_Ack_Send_Process(void); +static void s_Area_State_Req_Recv_Process(IN const STRU_AREA_WITH_ARB_STATE_PACK_T* state_pack, + INOUT CM_BOOL ack_flags[5]); /** - * @brief 区域状态的应答ACK接收处理 + * @brief 处理校验通过的状态ACK帧 */ -static void s_Area_State_Ack_Recv_Process(void); +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); /** * @brief 仲裁处理 */ @@ -101,7 +83,7 @@ static void s_Area_GetCommStatus_byID(CM_UINT8 ID, CM_UINT32* SN, CM_UINT8* rcv_ /** * @brief 对接收到的区域状态请求进行2取同步 */ -static void s_Area_2oo2Sync_AfterStateRecv(); +static void s_Area_2oo2Sync_AfterStateRecv(CM_BOOL ack_flags[5]); /** * @brief 2取同步后,判断本周期是否收到请求,并进行回复组包发送 * @param ack_partner 是否需要向对系回复ACK @@ -117,11 +99,55 @@ 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]; +} + /** * 区域初始化,包含第三方仲裁的初始化 */ void Area_With_Arb_Init(void) { + /**日志队列初始化 */ + Area_LogMQ_Init(); AREA_BASIC_CFG_PTR->BoardID = g_PFM_Cfg.BOARD_ID;/**< 板卡ID 插箱id */ AREA_BASIC_CFG_PTR->Cpuid = g_PFM_Cfg.CPU_ID;/**< cpu id */ AREA_BASIC_CFG_PTR->OutnetID = g_PFM_Cfg.BOARD_ID;/**< 外网ID */ @@ -263,12 +289,12 @@ 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}, peer_pack = {0}; + 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_REAL_LEN - 1; + state_pack.Len = AREA_ARB_STATE_PACK_LEN - 1u; state_pack.MsgType = ENUM_AREA_MSG_STATE_REQ; state_pack.SN = DFM_GetBirthCount(); state_pack.TimeSyncFlag = 1u; /**请求中的该字段不使用 */ @@ -286,11 +312,12 @@ static void s_Area_State_Req_Send_Process(void) /**发送至本地另一系 */ 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_REAL_LEN == tmp_len) + if(AREA_ARB_STATE_PACK_LEN == tmp_len) { - DOUBLE_CRC_GET(state_pack, peer_pack, tmp_buf, tmp_len); - CM_ASSERT(AREA_ARB_STATE_PACK_REAL_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, &state_pack, sizeof(state_pack)); + 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); } @@ -303,11 +330,12 @@ 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_REAL_LEN == tmp_len) + if(AREA_ARB_STATE_PACK_LEN == tmp_len) { - DOUBLE_CRC_GET(state_pack, peer_pack, tmp_buf, tmp_len); - CM_ASSERT(AREA_ARB_STATE_PACK_REAL_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, &state_pack, sizeof(state_pack)); + 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); } @@ -320,11 +348,12 @@ static void s_Area_State_Req_Send_Process(void) /**发送至另一地的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_REAL_LEN == tmp_len) + if(AREA_ARB_STATE_PACK_LEN == tmp_len) { - DOUBLE_CRC_GET(state_pack, peer_pack, tmp_buf, tmp_len); - CM_ASSERT(AREA_ARB_STATE_PACK_REAL_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, &state_pack, sizeof(state_pack)); + 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); } @@ -341,11 +370,12 @@ 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_REAL_LEN == tmp_len) + if(AREA_ARB_STATE_PACK_LEN == tmp_len) { - DOUBLE_CRC_GET(state_pack, peer_pack, tmp_buf, tmp_len); - CM_ASSERT(AREA_ARB_STATE_PACK_REAL_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, &state_pack, sizeof(state_pack)); + 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); } @@ -358,11 +388,12 @@ static void s_Area_State_Req_Send_Process(void) /**发送至另一地的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_REAL_LEN == tmp_len) + if(AREA_ARB_STATE_PACK_LEN == tmp_len) { - DOUBLE_CRC_GET(state_pack, peer_pack, tmp_buf, tmp_len); - CM_ASSERT(AREA_ARB_STATE_PACK_REAL_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, &state_pack, sizeof(state_pack)); + 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); } @@ -382,117 +413,117 @@ static void s_Area_State_Req_Send_Process(void) */ static void s_Area_State_Ack_Process(void) { + STRU_AREA_WITH_ARB_STATE_PACK_T state_pack = {0}; + CM_UINT8 wire_buf[AREA_ARB_STATE_PACK_LEN] = {0}; + CM_INT32 rcv_len = 0; + CM_UINT32 crc1 = 0u, crc2 = 0u; + CM_UINT32 timeStamp = 0u, timeNow = 0u; CM_UINT32 start_tick = (CM_UINT32)(CM_GetTick() / CM_UNSIGNED_MILLION); CM_UINT32 used_time = 0u; + CM_UINT32 localsn = AREA_COMM_STATUS_PTR->LocalSN; + CM_UINT8 srcID = 0u; + CM_UINT8 partner_id = AREA_BASIC_CFG_PTR->Partner_BoardID; + CM_UINT8 area_a_id = AREA_BASIC_CFG_PTR->Partner_Area_A_BoardID; + 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}; + /**持续30ms */ do { - /**接收请求进行回复发送 */ - s_Area_State_Ack_Send_Process(); - /**接收回复 */ - s_Area_State_Ack_Recv_Process(); + /**REQ与ACK共用一个FIFO,每条报文只读取一次并按类型分发。 */ + do + { + rcv_len = Area_State_Recv(wire_buf, sizeof(wire_buf), &timeStamp); + timeNow = (CM_UINT32)(CM_GetTick() / CM_UNSIGNED_MILLION); + if((AREA_ARB_STATE_PACK_LEN == rcv_len) && + ((timeNow - timeStamp) < g_PFM_Cfg.CYC_TIME)) + { + Area_Arb_State_UnPack(&state_pack, wire_buf, (CM_UINT32)rcv_len); + crc1 = CM_Crc32_1(&wire_buf[1], (CM_UINT32)rcv_len - 9u); + crc2 = CM_Crc32_2(&wire_buf[1], (CM_UINT32)rcv_len - 9u); + srcID = state_pack.SrcID; + + 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)) + { + if(ENUM_AREA_MSG_STATE_REQ == state_pack.MsgType) + { + s_Area_State_Req_Recv_Process(&state_pack, ack_flags); + } + else if(ENUM_AREA_MSG_STATE_ACK == state_pack.MsgType) + { + s_Area_State_Ack_Recv_Process(&state_pack, localsn, timeSyncFlag); + } + else + { + /**消息类型或序列号不符合当前周期,不更新状态。 */ + } + } + } + } while(0 < rcv_len); + + /**同步接收状态和本周期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); - +} -} -/** - * @brief 区域状态的请求接收,发送ACK - */ -static void s_Area_State_Ack_Send_Process(void) +static void s_Area_State_Req_Recv_Process(IN const STRU_AREA_WITH_ARB_STATE_PACK_T* state_pack, + INOUT CM_BOOL ack_flags[5]) { - STRU_AREA_WITH_ARB_STATE_PACK_T state_pack = {0}; - CM_UINT8 tmp_buf[1400] = {0}; - CM_INT32 rcv_len = 0u; - CM_UINT32 crc1 = 0u, crc2 = 0u; - CM_UINT32 timeStamp = 0u, timeNow = 0u; - CM_UINT8 srcID = 0u, dstID = 0u; CM_UINT32 last_sn = 0u; - /**记录是否需要向某一系发送ACK */ - CM_BOOL ack_flags[5] = {CM_FALSE,CM_FALSE,CM_FALSE,CM_FALSE,CM_FALSE}; - CM_UINT8 partner_id = AREA_BASIC_CFG_PTR->Partner_BoardID; - CM_UINT8 area_a_id = AREA_BASIC_CFG_PTR->Partner_Area_A_BoardID; - CM_UINT8 area_b_id = AREA_BASIC_CFG_PTR->Partner_Area_B_BoardID; - /**接收请求 */ - do + + if((NULL == state_pack) || (NULL == ack_flags)) { - rcv_len = Area_State_Recv(&state_pack, sizeof(state_pack), &timeStamp); - timeNow = (CM_UINT32)(CM_GetTick() / CM_UNSIGNED_MILLION); - if(AREA_ARB_STATE_PACK_REAL_LEN == rcv_len && - ((timeNow - timeStamp) < g_PFM_Cfg.CYC_TIME)) - { - /**接收到长度合法,并且接收时间合法 */ - Area_Arb_State_Pack(tmp_buf, sizeof(tmp_buf), &state_pack); - crc1 = CM_Crc32_1(&tmp_buf[1], rcv_len - 9); - crc2 = CM_Crc32_2(&tmp_buf[1], rcv_len - 9); - srcID = state_pack.SrcID; - dstID = state_pack.DstID; - s_Area_GetCommStatus_byID(srcID, &last_sn, NULL); - if(crc1 == state_pack.CRC1 && crc2 == state_pack.CRC2 - && dstID == AREA_BASIC_CFG_PTR->BoardID && - ENUM_AREA_MSG_STATE_REQ == state_pack.MsgType && - state_pack.SN > last_sn) - { - /**CRC与目的ID校验通过,并且SN最新*/ - ack_flags[srcID] = CM_TRUE; - s_Area_SetCommStatus_byID(srcID, state_pack.SN, CM_TRUE); - AreaArb_SetState_byID(srcID, state_pack.StateArea); - AreaArb_Set2xState_byID(srcID, state_pack.State2x); - AREA_LOG_MSG("AREA_ARB:State request received, SrcID:%d SN:%u State:%d 2x2:%d\n", - srcID, state_pack.SN, state_pack.StateArea, state_pack.State2x); - } - } - } while (0u < rcv_len); - /**进行2取同步 */ - s_Area_2oo2Sync_AfterStateRecv(); - /**进行ACK回复 */ - s_Area_SendACK_After2oo2(ack_flags[partner_id],ack_flags[area_a_id], ack_flags[area_b_id]); + return; + } + + s_Area_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_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); + } } -/** - * @brief 区域状态的应答ACK接收处理 - */ -static void s_Area_State_Ack_Recv_Process(void) + +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) { - STRU_AREA_WITH_ARB_STATE_PACK_T state_pack = {0}; - CM_UINT8 tmp_buf[1400] = {0}; - CM_INT32 rcv_len = 0u; - CM_UINT32 crc1 = 0u, crc2 = 0u; - CM_UINT32 timeStamp = 0u, timeNow = 0u; - CM_UINT8 srcID = 0u, dstID = 0u; - CM_UINT8 timeSyncFlag = AREA_FLAGS_CTRL_PTR->Time_Sync_Flag; /**获取校时标志 */ - CM_UINT32 localsn = AREA_COMM_STATUS_PTR->LocalSN; - do + CM_UINT32 sn_diff = 0u; + + if(NULL == state_pack) { - rcv_len = Area_State_Recv(&state_pack, sizeof(state_pack), &timeStamp); - timeNow = (CM_UINT32)(CM_GetTick() / CM_UNSIGNED_MILLION); - if(AREA_ARB_STATE_PACK_REAL_LEN == rcv_len && - ((timeNow - timeStamp) < g_PFM_Cfg.CYC_TIME)) - { - /**接收到长度合法,并且接收时间合法 */ - Area_Arb_State_Pack(tmp_buf, sizeof(tmp_buf), &state_pack); - crc1 = CM_Crc32_1(&tmp_buf[1], rcv_len - 9); - crc2 = CM_Crc32_2(&tmp_buf[1], rcv_len - 9); - srcID = state_pack.SrcID; - dstID = state_pack.DstID; - if(crc1 == state_pack.CRC1 && crc2 == state_pack.CRC2 - && dstID == AREA_BASIC_CFG_PTR->BoardID && - ENUM_AREA_MSG_STATE_ACK == state_pack.MsgType && - (((1u == timeSyncFlag) && (state_pack.SN == localsn)) || - ((0u == timeSyncFlag) && (CM_ABS(localsn - state_pack.SN) <= 1)))) - { - /**CRC与目的ID校验通过,并且是本周期接收到的回复(校时未完成时容忍一周期) */ - s_Area_SetCommStatus_byID(srcID, state_pack.SN, CM_TRUE); - AreaArb_SetState_byID(srcID, state_pack.StateArea); - AreaArb_Set2xState_byID(srcID, state_pack.State2x); - AREA_LOG_MSG("AREA_ARB:State ACK received, SrcID:%d SN:%u State:%d 2x2:%d\n", - srcID, state_pack.SN, state_pack.StateArea, state_pack.State2x); - } - } - } while (0u < rcv_len); - /**进行2取同步 */ - s_Area_2oo2Sync_AfterStateRecv(); + return; + } + + 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)) || + ((0u == time_sync_flag) && (sn_diff <= 1u))) + { + 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); + } } /** @@ -510,14 +541,14 @@ static void s_Area_Arb_Process(void) */ static void s_Area_Arb_Send_Process(void) { - STRU_AREA_WITH_ARB_PACK_T arb_pack = {0}, peer_pack = {0}; + STRU_AREA_WITH_ARB_PACK_T arb_pack = {0}; CM_UINT32 tmp_len = 0u; CM_UINT8 tmp_buf[1400] = {0u}; 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; /**请求帧帧基础信息组包 */ - arb_pack.Len = AREA_ARB_FRAME_PACK_REAL_LEN - 1u; + arb_pack.Len = AREA_ARB_FRAME_PACK_LEN - 1u; arb_pack.MsgType = ENUM_AREA_MSG_ARB_REQ; arb_pack.ArbSN = DFM_GetBirthCount(); arb_pack.OutNet_ID = AREA_BASIC_CFG_PTR->OutnetID; @@ -526,8 +557,10 @@ static void s_Area_Arb_Send_Process(void) CM_Memset(&arb_pack.Reserver[0], 0, AREA_ARB_RESERVER_LEN, AREA_ARB_RESERVER_LEN); /**计算双CRC */ tmp_len = Area_Arb_Frame_Pack(tmp_buf, sizeof(tmp_buf), &arb_pack); - DOUBLE_CRC_GET(arb_pack, peer_pack, tmp_buf, tmp_len); - CM_ASSERT(AREA_ARB_FRAME_PACK_REAL_LEN == tmp_len, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_2, TSCP_DARK_ASSERT_1); + CM_ASSERT(AREA_ARB_FRAME_PACK_LEN == tmp_len, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_2, TSCP_DARK_ASSERT_1); + s_Area_DoubleCRC_Get(tmp_buf, tmp_len, &arb_pack.CRC1, &arb_pack.CRC2); + tmp_len = Area_Arb_Frame_Pack(tmp_buf, sizeof(tmp_buf), &arb_pack); + CM_ASSERT(AREA_ARB_FRAME_PACK_LEN == tmp_len, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_2, TSCP_DARK_ASSERT_1); /**获取对应状态的板卡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 */ @@ -544,7 +577,7 @@ static void s_Area_Arb_Send_Process(void) { /**本地主地主,与备地主通信中断,发送仲裁请求 */ AREA_ARB_CTRL_PTR->Arb_Send_Flag = 1u; - send_rt = Area_Arb_Req_Send(&arb_pack, sizeof(arb_pack)); + 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_BASIC_CFG_PTR->BoardID, arb_pack.ArbSN, send_rt); } @@ -554,7 +587,7 @@ static void s_Area_Arb_Send_Process(void) if(tolerate_arb >= 1u) { AREA_ARB_CTRL_PTR->Arb_Send_Flag = 1u; - send_rt = Area_Arb_Req_Send(&arb_pack, sizeof(arb_pack)); + send_rt = Area_Arb_Req_Send(tmp_buf, tmp_len); AREA_LOG_MSG("AREA_ARB:Request arbitration, slave lost master, BoardID:%d SN:%u Result:0x%x\n", AREA_BASIC_CFG_PTR->BoardID, arb_pack.ArbSN, send_rt); tolerate_arb = 0u; @@ -570,7 +603,7 @@ static void s_Area_Arb_Send_Process(void) if(tolerate_arb >= 10u) { AREA_ARB_CTRL_PTR->Arb_Send_Flag = 1u; - send_rt = Area_Arb_Req_Send(&arb_pack, sizeof(arb_pack)); + send_rt = Area_Arb_Req_Send(tmp_buf, tmp_len); AREA_LOG_MSG("AREA_ARB:Request arbitration, all area links down, BoardID:%d SN:%u Result:0x%x\n", AREA_BASIC_CFG_PTR->BoardID, arb_pack.ArbSN, send_rt); tolerate_arb = 0u; @@ -607,15 +640,15 @@ static void s_Area_Arb_Recv_Process(void) /**清空仲裁状态 */ AREA_ARB_CTRL_PTR->Arb_Ack = 0x00u; /**仲裁请求接收 */ - rcv_len = Area_Arb_Ack_Recv(&arb_pack, sizeof(arb_pack)); + rcv_len = Area_Arb_Ack_Recv(tmp_buf, sizeof(tmp_buf)); /**解包处理 */ - if(AREA_ARB_FRAME_PACK_REAL_LEN == rcv_len && - ((AREA_ARB_FRAME_PACK_REAL_LEN - 1) == arb_pack.Len)) + if(AREA_ARB_FRAME_PACK_LEN == rcv_len) { - rcv_len = Area_Arb_Frame_Pack(tmp_buf, sizeof(tmp_buf), &arb_pack); - crc1 = CM_Crc32_1(&tmp_buf[1], rcv_len - 9); - crc2 = CM_Crc32_2(&tmp_buf[1], rcv_len - 9); + 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) { @@ -674,10 +707,10 @@ static void s_Area_State_Multi_Send_Process(void) CM_UINT8 tmp_buf[1400]; /**< 临时缓冲区 */ CM_INT32 tmp_len = 0; /**< 临时数据长度 */ ENUM_CM_RETURN send_rt = ENUM_CM_FALSE; - STRU_AREA_WITH_ARB_STATE_MULTI_PACK_T multi_pack = {0}, peer_pack = {0}; /**< 待发送数据结构体 */ + STRU_AREA_WITH_ARB_STATE_MULTI_PACK_T multi_pack = {0}; /**< 待发送数据结构体 */ /** 填充结构体 */ - multi_pack.Len = AREA_ARB_STATE_MULTI_PACK_REAL_LEN - 1; + multi_pack.Len = AREA_ARB_STATE_MULTI_PACK_LEN - 1u; multi_pack.MsgType = ENUM_AREA_MSG_STATE_MULTI; multi_pack.SN = DFM_GetBirthCount(); multi_pack.SrcID = AREA_BASIC_CFG_PTR->BoardID; @@ -687,12 +720,13 @@ static void s_Area_State_Multi_Send_Process(void) /**计算CRC */ tmp_len = Area_Arb_State_Multi_Pack(tmp_buf, sizeof(tmp_buf), &multi_pack); - if(AREA_ARB_STATE_MULTI_PACK_REAL_LEN == tmp_len) + if(AREA_ARB_STATE_MULTI_PACK_LEN == tmp_len) { - DOUBLE_CRC_GET(multi_pack, peer_pack, tmp_buf, tmp_len); - CM_ASSERT(AREA_ARB_STATE_PACK_REAL_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, &multi_pack.CRC1, &multi_pack.CRC2); + tmp_len = Area_Arb_State_Multi_Pack(tmp_buf, sizeof(tmp_buf), &multi_pack); + CM_ASSERT(AREA_ARB_STATE_MULTI_PACK_LEN == tmp_len, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_2, TSCP_DARK_ASSERT_1); /**组播发送 */ - send_rt = Area_State_Multi_Send(&multi_pack, sizeof(multi_pack)); + send_rt = Area_State_Multi_Send(tmp_buf, tmp_len); AREA_LOG_MSG("AREA_ARB:Multicast state send, SrcID:%d SN:%u State:%d 2x2:%d Result:0x%x\n", multi_pack.SrcID, multi_pack.SN, multi_pack.StateArea, multi_pack.State2x, send_rt); } @@ -707,22 +741,23 @@ static void s_Area_State_Multi_Send_Process(void) static void s_Area_State_Multi_Recv_Process(void) { CM_UINT32 crc1 = 0u, crc2 = 0u; - CM_UINT8 tmp_buf[1400] = {0u}; - CM_INT32 tmp_len = 0; + CM_UINT8 wire_buf[AREA_ARB_STATE_MULTI_PACK_LEN] = {0u}; + 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 tickRcv = 0u; /*组播接收*/ - tmp_len = Area_State_Multi_Recv(&multi_pack, sizeof(multi_pack), &tickRcv); + rcv_len = Area_State_Multi_Recv(wire_buf, sizeof(wire_buf), &tickRcv); /*双CRC校验*/ - tmp_len = Area_Arb_State_Multi_Pack(tmp_buf, sizeof(tmp_buf), &multi_pack); - if(AREA_ARB_STATE_MULTI_PACK_REAL_LEN == tmp_len && + if(AREA_ARB_STATE_MULTI_PACK_LEN == rcv_len && ((tickNow - tickRcv) < g_PFM_Cfg.CYC_TIME)) { - crc1 = CM_Crc32_1(&tmp_buf[1], tmp_len - 9); - crc2 = CM_Crc32_2(&tmp_buf[1], tmp_len - 9); + Area_Arb_State_Multi_UnPack(&multi_pack, wire_buf, (CM_UINT32)rcv_len); + crc1 = CM_Crc32_1(&wire_buf[1], (CM_UINT32)rcv_len - 9u); + crc2 = CM_Crc32_2(&wire_buf[1], (CM_UINT32)rcv_len - 9u); if(crc1 == multi_pack.CRC1 && crc2 == multi_pack.CRC2 && + ((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); @@ -861,22 +896,28 @@ static void s_Area_GetCommStatus_byID(CM_UINT8 ID, CM_UINT32* sn, CM_UINT8* rcv_ /** * @brief 对接收到的区域状态请求进行2取同步 */ -static void s_Area_2oo2Sync_AfterStateRecv() +static void s_Area_2oo2Sync_AfterStateRecv(CM_BOOL ack_flags[5]) { STRU_AREA_WITH_ARB_COMM_STATUS_T peer_comm_status = {0}; STRU_AREA_WITH_ARB_STATE_CTRL_T peer_state_ctrl = {0}; + CM_BOOL peer_ack_flags[5] = {CM_FALSE, CM_FALSE, CM_FALSE, CM_FALSE, CM_FALSE}; CM_UINT32 len_comm_status = sizeof(STRU_AREA_WITH_ARB_COMM_STATUS_T); CM_UINT32 len_state_ctrl = sizeof(STRU_AREA_WITH_ARB_STATE_CTRL_T); + CM_UINT32 len_ack_flags = sizeof(peer_ack_flags); + CM_UINT8 id = 0u; CM_UINT8 send_buf [1400] = {0}, rcv_buf[1400]; CM_INT32 send_len = 0u, rcv_len = 0u; /**将接收状态进行组包2取 */ - if(sizeof(send_buf) >= (len_comm_status + len_state_ctrl)) + if((NULL != ack_flags) && + (sizeof(send_buf) >= (len_comm_status + len_state_ctrl + len_ack_flags))) { CM_Memcpy(send_buf, sizeof(send_buf), AREA_COMM_STATUS_PTR, len_comm_status); send_len += len_comm_status; CM_Memcpy(&send_buf[send_len], sizeof(send_buf) - send_len, AREA_STATE_CTRL_PTR, len_state_ctrl); 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; } rcv_len = Area_2oo2_Currency_NoSplit(send_buf, send_len, rcv_buf, sizeof(rcv_buf)); if(rcv_len != send_len) @@ -888,9 +929,21 @@ static void s_Area_2oo2Sync_AfterStateRecv() /**对另一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); + + /**任一CPU收到请求,两个CPU都使用相同的ACK目标。 */ + for(id = MSCP_AREA_A_BOARD_ID_A; id <= MSCP_AREA_B_BOARD_ID_B; id++) + { + if(CM_TRUE == peer_ack_flags[id]) + { + ack_flags[id] = CM_TRUE; + } + } /**更新对系的接收序列号 */ - if(AREA_COMM_STATUS_PTR->PatnerSN < peer_comm_status.PatnerSN && CM_TRUE == peer_comm_status.Patner_RcvFlag) + if(((AREA_COMM_STATUS_PTR->PatnerSN < peer_comm_status.PatnerSN) || + (CM_TRUE != AREA_COMM_STATUS_PTR->Patner_RcvFlag)) && + (CM_TRUE == peer_comm_status.Patner_RcvFlag)) { /**接收到的对系序列号不同,本CPU为旧数据,同步新数据 */ AREA_COMM_STATUS_PTR->PatnerSN = peer_comm_status.PatnerSN; @@ -908,7 +961,9 @@ static void s_Area_2oo2Sync_AfterStateRecv() } /**更新另一地A系的接收序列号 */ - if(AREA_COMM_STATUS_PTR->Area_A_SN < peer_comm_status.Area_A_SN && CM_TRUE == peer_comm_status.Area_A_RcvFlag) + if(((AREA_COMM_STATUS_PTR->Area_A_SN < peer_comm_status.Area_A_SN) || + (CM_TRUE != AREA_COMM_STATUS_PTR->Area_A_RcvFlag)) && + (CM_TRUE == peer_comm_status.Area_A_RcvFlag)) { /**接收到的对系序列号不同,本CPU为旧数据,同步新数据 */ AREA_COMM_STATUS_PTR->Area_A_SN = peer_comm_status.Area_A_SN; @@ -926,7 +981,9 @@ static void s_Area_2oo2Sync_AfterStateRecv() } /**更新另一地B系的接收序列号 */ - if(AREA_COMM_STATUS_PTR->Area_B_SN < peer_comm_status.Area_B_SN && CM_TRUE == peer_comm_status.Area_B_RcvFlag) + if(((AREA_COMM_STATUS_PTR->Area_B_SN < peer_comm_status.Area_B_SN) || + (CM_TRUE != AREA_COMM_STATUS_PTR->Area_B_RcvFlag)) && + (CM_TRUE == peer_comm_status.Area_B_RcvFlag)) { /**接收到的对系序列号不同,本CPU为旧数据,同步新数据 */ AREA_COMM_STATUS_PTR->Area_B_SN = peer_comm_status.Area_B_SN; @@ -948,12 +1005,12 @@ static void s_Area_2oo2Sync_AfterStateRecv() */ 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}, peer_pack = {0}; + 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_REAL_LEN - 1; + state_pack.Len = AREA_ARB_STATE_PACK_LEN - 1u; state_pack.MsgType = ENUM_AREA_MSG_STATE_ACK; state_pack.TimeSyncFlag = AREA_FLAGS_CTRL_PTR->Time_Sync_Flag; /**获取校时标志 */ state_pack.SrcID = AREA_BASIC_CFG_PTR->BoardID; @@ -968,9 +1025,11 @@ 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); - DOUBLE_CRC_GET(state_pack, peer_pack, tmp_buf, tmp_len); - CM_ASSERT(AREA_ARB_STATE_PACK_REAL_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, &state_pack, sizeof(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); } @@ -980,9 +1039,11 @@ static void s_Area_SendACK_After2oo2(CM_BOOL ack_partner, CM_BOOL ack_area_a, CM 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); - DOUBLE_CRC_GET(state_pack, peer_pack, tmp_buf, tmp_len); - CM_ASSERT(AREA_ARB_STATE_PACK_REAL_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, &state_pack, sizeof(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); } @@ -992,9 +1053,11 @@ static void s_Area_SendACK_After2oo2(CM_BOOL ack_partner, CM_BOOL ack_area_a, CM 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); - DOUBLE_CRC_GET(state_pack, peer_pack, tmp_buf, tmp_len); - CM_ASSERT(AREA_ARB_STATE_PACK_REAL_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, &state_pack, sizeof(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); } @@ -1007,7 +1070,8 @@ static void s_Area_2oo2Sync_AfterArbRecv() CM_INT32 len = sizeof(STRU_AREA_WITH_ARB_REQ_T), rcv_len = 0; STRU_AREA_WITH_ARB_REQ_T peer_ctrl = {0}; /**2取交互仲裁应答信息 */ - rcv_len = Area_2oo2_Currency_NoSplit(AREA_ARB_CTRL_PTR, len, &peer_ctrl, len); + rcv_len = Area_2oo2_Currency_NoSplit((const CM_UINT8 *)AREA_ARB_CTRL_PTR, + len, (CM_UINT8 *)&peer_ctrl, len); if(len != rcv_len) { AREA_LOG_MSG("AREA_ARB:Arbitration 2oo2 sync failed, SendLen:%d RecvLen:%d\n", diff --git a/TSCP/src/MSCP/Arb/Arb_Net.c b/TSCP/src/MSCP/Arb/Arb_Net.c index 865e2a1..afd1dcb 100644 --- a/TSCP/src/MSCP/Arb/Arb_Net.c +++ b/TSCP/src/MSCP/Arb/Arb_Net.c @@ -16,6 +16,7 @@ #include "stdarg.h" #include "Arb.h" #include "Arb_Net.h" +#include "Area_2oo2.h" /*===========↓↓↓↓↓宏定义↓↓↓↓↓=============*/ #define ARB_MSG_NUM_MAX 20 /*仲裁应答接收队列最大数量*/ @@ -68,8 +69,6 @@ void Area_Arb_Net_Init(void) CM_UINT32 val = 0u; ENUM_CM_RETURN rt = ENUM_CM_FALSE; CM_BOOL rtCheck = CM_FALSE; - /**日志队列初始化 */ - Area_LogMQ_Init(); /**2取初始化 */ Area_2oo2_Init(); /*获取IP配置*/ @@ -228,14 +227,18 @@ ENUM_CM_RETURN Area_State_Send(IN CM_UINT8 dstID, IN const CM_UINT8* pBuf, IN CM CM_INT32 Area_State_Recv(CM_UINT8* pBuf, IN CM_UINT32 BufSize, OUT CM_UINT32* timeRcv) { /*- 变量初始化 */ - CM_UINT8 buf[65535] = {0}; - CM_UINT16 len = (CM_UINT16)((BufSize > 65535u) ? 65535u : BufSize); + CM_UINT8 buf[Area_RAW_MSG_SIZE] = {0}; + CM_UINT16 len = (CM_UINT16)sizeof(buf); ENUM_CM_RETURN rt = ENUM_CM_FALSE; /*- 指针防空*/ + if((NULL == pBuf) || (0u == BufSize)) + { + return 0; + } /*- 从接收线程获取输入报文 */ rt = CM_MQ_Read(&(AREA_UNI_COMM_CFG_PTR->MsgQ), buf, &len); /*- 是否获取成功 */ - if (ENUM_CM_TRUE == rt && len > 4u) + if ((ENUM_CM_TRUE == rt) && (len > 4u) && ((CM_UINT32)(len - 4u) <= BufSize)) { /*- 输出接收数据 */ if(NULL != timeRcv) @@ -243,6 +246,7 @@ CM_INT32 Area_State_Recv(CM_UINT8* pBuf, IN CM_UINT32 BufSize, OUT CM_UINT32* ti *timeRcv = CM_LongFromChar(buf); } CM_Memcpy(pBuf, BufSize, &buf[4], len - 4); + len -= 4u; } else { @@ -291,14 +295,18 @@ ENUM_CM_RETURN Area_State_Multi_Send(IN const CM_UINT8* pBuf, IN CM_INT32 BufLen CM_INT32 Area_State_Multi_Recv(CM_UINT8* pBuf, IN CM_UINT32 BufSize, OUT CM_UINT32* timeRcv) { /*- 变量初始化 */ - CM_UINT8 buf[65535] = {0}; - CM_UINT16 len = (CM_UINT16)((BufSize > 65535u) ? 65535u : BufSize); + CM_UINT8 buf[Area_RAW_MSG_SIZE] = {0}; + CM_UINT16 len = (CM_UINT16)sizeof(buf); ENUM_CM_RETURN rt = ENUM_CM_FALSE; /*- 指针防空*/ + if((NULL == pBuf) || (0u == BufSize)) + { + return 0; + } /*- 从接收线程获取输入报文 */ rt = CM_MQ_Read(&(AREA_MULTI_COMM_CFG_PTR->MsgQ), buf, &len); /*- 是否获取成功 */ - if (ENUM_CM_TRUE == rt && len > 4u) + if ((ENUM_CM_TRUE == rt) && (len > 4u) && ((CM_UINT32)(len - 4u) <= BufSize)) { /*- 输出接收数据 */ if(NULL != timeRcv) @@ -306,6 +314,7 @@ CM_INT32 Area_State_Multi_Recv(CM_UINT8* pBuf, IN CM_UINT32 BufSize, OUT CM_UINT *timeRcv = CM_LongFromChar(buf); } CM_Memcpy(pBuf, BufSize, &buf[4], len - 4); + len -= 4u; } else { @@ -461,7 +470,7 @@ static CM_THREAD_FUNC_T t_Area_Multi_UdpRecvThread(IN STRU_AREA_MULTICAST_COMM_T else { /*- 接收出错 */ - AREA_LOG_MSG("warning ASSERT1103: port %d rx err(len=%d)\n", pCtrl->port, len); + AREA_LOG_MSG("warning ASSERT1103: port %d rx err(len=%d)\n", pCtrl->Port_Recv, len); (void)CFM_DarkLog_Storage(DARK_LOG_HEX, TSCP_DARK_WARNING, 4U, DARK_FAULT_CODE_MERGE(NET_MODE, DARK_FAULT_CODE_FUN_ORDER_8, TSCP_DARK_ASSERT_1)); } } @@ -597,4 +606,4 @@ static CM_THREAD_FUNC_T t_Area_Uni_UdpRecvThread(IN STR_Area_IP_Cfg *arg) } } return NULL; -} \ No newline at end of file +} diff --git a/TSCP/src/MSCP/Arb/Arb_Pack.c b/TSCP/src/MSCP/Arb/Arb_Pack.c index c9df0e8..3e7ebcb 100644 --- a/TSCP/src/MSCP/Arb/Arb_Pack.c +++ b/TSCP/src/MSCP/Arb/Arb_Pack.c @@ -1,11 +1,6 @@ #include "Arb_Pack.h" #include "CM_Convert.h" -/* 各类报文在线路上的固定长度。枚举类型按1字节消息类型进行传输。 */ -#define AREA_ARB_FRAME_PACK_LEN (26u) -#define AREA_ARB_STATE_MULTI_PACK_LEN (25u) -#define AREA_ARB_STATE_PACK_LEN (27u) - /** * @brief 打包仲裁请求/应答帧 * @return 成功返回固定报文长度26,入参非法或缓冲区不足返回0。 diff --git a/TSCP/src/MSCP/Arb/Arb_Pack.h b/TSCP/src/MSCP/Arb/Arb_Pack.h index fd8cbc8..580762e 100644 --- a/TSCP/src/MSCP/Arb/Arb_Pack.h +++ b/TSCP/src/MSCP/Arb/Arb_Pack.h @@ -5,10 +5,11 @@ #include "SFM_2x2.h" #include "Area.h" -/* 结构体的真实大小,如果有结构体对齐,可能和所有成员长度相加不同 */ -#define AREA_ARB_FRAME_PACK_REAL_LEN (sizeof(STRU_AREA_WITH_ARB_PACK_T)) -#define AREA_ARB_STATE_MULTI_PACK_REAL_LEN (sizeof(STRU_AREA_WITH_ARB_STATE_MULTI_PACK_T)) -#define AREA_ARB_STATE_PACK_REAL_LEN (sizeof(STRU_AREA_WITH_ARB_STATE_PACK_T)) +/* 各类报文在线路上的固定长度,不包含结构体对齐字节。 */ +#define AREA_ARB_FRAME_PACK_LEN (26u) +#define AREA_ARB_STATE_MULTI_PACK_LEN (25u) +#define AREA_ARB_STATE_PACK_LEN (27u) + #define AREA_ARB_RESERVER_LEN (8u) /**< 仲裁模式下,区域通信的消息类型 */ @@ -127,4 +128,4 @@ CM_INT32 Area_Arb_State_Pack(OUT CM_UINT8* buf, IN CM_UINT32 buf_size, IN STRU_A */ void Area_Arb_State_UnPack(OUT STRU_AREA_WITH_ARB_STATE_PACK_T* pack, IN CM_UINT8* buf, IN CM_UINT32 buf_len); -#endif \ No newline at end of file +#endif diff --git a/TSCP/src/MSCP/Arb/Arb_State.c b/TSCP/src/MSCP/Arb/Arb_State.c index e6a8d26..b32ac5f 100644 --- a/TSCP/src/MSCP/Arb/Arb_State.c +++ b/TSCP/src/MSCP/Arb/Arb_State.c @@ -143,7 +143,7 @@ CM_UINT8 AreaArb_GetID_byState(ENUM_AREA_STATE state_area, ENUM_2x2_STATE_T stat } else if(AREA_STATE_CTRL_PTR->StateArea.Partner_Area_B_state == state_area && AREA_STATE_CTRL_PTR->State2x.Area_B_State == state_2x) { - boardID = AREA_BASIC_CFG_PTR->Partner_Area_A_BoardID; + boardID = AREA_BASIC_CFG_PTR->Partner_Area_B_BoardID; } else {