bug修改中

This commit is contained in:
lh
2026-08-21 16:15:59 +08:00
parent 8e7cd0ea12
commit 18003863ae
9 changed files with 218 additions and 42 deletions
+145 -19
View File
@@ -136,6 +136,10 @@ void Area_With_Arb_Init(void)
{ {
AREA_BASIC_CFG_PTR->AreaID = MSCP_AREA_ID_B; AREA_BASIC_CFG_PTR->AreaID = MSCP_AREA_ID_B;
} }
AREA_LOG_MSG("AREA_ARB:Init config, BoardID:%d CPU:%d Area:%d Partner:%d Remote:%d-%d\n",
AREA_BASIC_CFG_PTR->BoardID, AREA_BASIC_CFG_PTR->Cpuid, AREA_BASIC_CFG_PTR->AreaID,
AREA_BASIC_CFG_PTR->Partner_BoardID, AREA_BASIC_CFG_PTR->Partner_Area_A_BoardID,
AREA_BASIC_CFG_PTR->Partner_Area_B_BoardID);
/* 网络初始化*/ /* 网络初始化*/
Area_Arb_Net_Init(); Area_Arb_Net_Init();
/*信号量初始化*/ /*信号量初始化*/
@@ -144,6 +148,9 @@ void Area_With_Arb_Init(void)
/**初始化板卡状态 */ /**初始化板卡状态 */
AREA_STATE_CTRL_PTR->StateArea.Local_state = ENUM_AREA_UNKNOW; AREA_STATE_CTRL_PTR->StateArea.Local_state = ENUM_AREA_UNKNOW;
AREA_LOG_MSG("AREA_STATE:Init local state, BoardID:%d Area:%d State:%d\n",
AREA_BASIC_CFG_PTR->BoardID, AREA_BASIC_CFG_PTR->AreaID,
AREA_STATE_CTRL_PTR->StateArea.Local_state);
s_Area_Cycle_Init(); s_Area_Cycle_Init();
/**创建区域工作线程 */ /**创建区域工作线程 */
@@ -167,6 +174,10 @@ static CM_THREAD_FUNC_T s_Area_With_Arb_Work_Thread(IN CM_Thread_Arg_Struct_T* a
Area_Arb_Wait_Start(); Area_Arb_Wait_Start();
/**清空上周期的接收状态,并获取2乘线程中的最终状态 */ /**清空上周期的接收状态,并获取2乘线程中的最终状态 */
s_Area_Cycle_Init(); s_Area_Cycle_Init();
AREA_LOG_MSG("AREA_ARB:Cycle start, BoardID:%d SN:%u State:%d 2x2:%d\n",
AREA_BASIC_CFG_PTR->BoardID, DFM_GetBirthCount(),
AREA_STATE_CTRL_PTR->StateArea.Local_state,
AREA_STATE_CTRL_PTR->State2x.LocalState);
/**主地主组播发送状态帧,其余板卡接收 */ /**主地主组播发送状态帧,其余板卡接收 */
s_Area_State_Multi_Process(); s_Area_State_Multi_Process();
/**主地双系/初始化阶段发送状态请求帧 */ /**主地双系/初始化阶段发送状态请求帧 */
@@ -178,6 +189,13 @@ static CM_THREAD_FUNC_T s_Area_With_Arb_Work_Thread(IN CM_Thread_Arg_Struct_T* a
/**状态转移 */ /**状态转移 */
s_Area_Arb_State_Transition(); 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_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_Stop(); Area_Arb_Stop();
} }
return NULL; return NULL;
@@ -247,6 +265,7 @@ 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}, peer_pack = {0};
CM_INT32 tmp_len = 0; CM_INT32 tmp_len = 0;
ENUM_CM_RETURN send_rt = ENUM_CM_FALSE;
CM_UINT8 tmp_buf[1400] = {0u}; CM_UINT8 tmp_buf[1400] = {0u};
/**发送帧初始化 */ /**发送帧初始化 */
state_pack.Len = AREA_ARB_STATE_PACK_REAL_LEN - 1; state_pack.Len = AREA_ARB_STATE_PACK_REAL_LEN - 1;
@@ -271,7 +290,14 @@ static void s_Area_State_Req_Send_Process(void)
{ {
DOUBLE_CRC_GET(state_pack, peer_pack, tmp_buf, 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); CM_ASSERT(AREA_ARB_STATE_PACK_REAL_LEN == tmp_len, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_2, TSCP_DARK_ASSERT_1);
(void)Area_State_Send(AREA_BASIC_CFG_PTR->Partner_BoardID, &state_pack, sizeof(state_pack)); send_rt = Area_State_Send(AREA_BASIC_CFG_PTR->Partner_BoardID, &state_pack, sizeof(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
{
AREA_LOG_MSG("AREA_ARB:State request pack failed, DstID:%d Len:%d\n",
state_pack.DstID, tmp_len);
} }
/**发送至另一地的A系 */ /**发送至另一地的A系 */
@@ -281,7 +307,14 @@ static void s_Area_State_Req_Send_Process(void)
{ {
DOUBLE_CRC_GET(state_pack, peer_pack, tmp_buf, 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); CM_ASSERT(AREA_ARB_STATE_PACK_REAL_LEN == tmp_len, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_2, TSCP_DARK_ASSERT_1);
Area_State_Send(AREA_BASIC_CFG_PTR->Partner_Area_A_BoardID, &state_pack, sizeof(state_pack)); send_rt = Area_State_Send(AREA_BASIC_CFG_PTR->Partner_Area_A_BoardID, &state_pack, sizeof(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
{
AREA_LOG_MSG("AREA_ARB:State request pack failed, DstID:%d Len:%d\n",
state_pack.DstID, tmp_len);
} }
/**发送至另一地的B系 */ /**发送至另一地的B系 */
@@ -291,7 +324,14 @@ static void s_Area_State_Req_Send_Process(void)
{ {
DOUBLE_CRC_GET(state_pack, peer_pack, tmp_buf, 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); CM_ASSERT(AREA_ARB_STATE_PACK_REAL_LEN == tmp_len, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_2, TSCP_DARK_ASSERT_1);
Area_State_Send(AREA_BASIC_CFG_PTR->Partner_Area_B_BoardID, &state_pack, sizeof(state_pack)); send_rt = Area_State_Send(AREA_BASIC_CFG_PTR->Partner_Area_B_BoardID, &state_pack, sizeof(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
{
AREA_LOG_MSG("AREA_ARB:State request pack failed, DstID:%d Len:%d\n",
state_pack.DstID, tmp_len);
} }
} }
else if(ENUM_AREA_MASTER == AREA_STATE_CTRL_PTR->StateArea.Local_state && else if(ENUM_AREA_MASTER == AREA_STATE_CTRL_PTR->StateArea.Local_state &&
@@ -305,7 +345,14 @@ static void s_Area_State_Req_Send_Process(void)
{ {
DOUBLE_CRC_GET(state_pack, peer_pack, tmp_buf, 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); CM_ASSERT(AREA_ARB_STATE_PACK_REAL_LEN == tmp_len, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_2, TSCP_DARK_ASSERT_1);
Area_State_Send(AREA_BASIC_CFG_PTR->Partner_Area_A_BoardID, &state_pack, sizeof(state_pack)); send_rt = Area_State_Send(AREA_BASIC_CFG_PTR->Partner_Area_A_BoardID, &state_pack, sizeof(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
{
AREA_LOG_MSG("AREA_ARB:State request pack failed, DstID:%d Len:%d\n",
state_pack.DstID, tmp_len);
} }
/**发送至另一地的B系 */ /**发送至另一地的B系 */
@@ -315,7 +362,14 @@ static void s_Area_State_Req_Send_Process(void)
{ {
DOUBLE_CRC_GET(state_pack, peer_pack, tmp_buf, 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); CM_ASSERT(AREA_ARB_STATE_PACK_REAL_LEN == tmp_len, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_2, TSCP_DARK_ASSERT_1);
Area_State_Send(AREA_BASIC_CFG_PTR->Partner_Area_B_BoardID, &state_pack, sizeof(state_pack)); send_rt = Area_State_Send(AREA_BASIC_CFG_PTR->Partner_Area_B_BoardID, &state_pack, sizeof(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
{
AREA_LOG_MSG("AREA_ARB:State request pack failed, DstID:%d Len:%d\n",
state_pack.DstID, tmp_len);
} }
} }
else else
@@ -340,7 +394,7 @@ static void s_Area_State_Ack_Process(void)
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 < 30000u); } while(used_time < 30u);
} }
@@ -355,9 +409,9 @@ static void s_Area_State_Ack_Send_Process(void)
CM_UINT32 crc1 = 0u, crc2 = 0u; CM_UINT32 crc1 = 0u, crc2 = 0u;
CM_UINT32 timeStamp = 0u, timeNow = 0u; CM_UINT32 timeStamp = 0u, timeNow = 0u;
CM_UINT8 srcID = 0u, dstID = 0u; CM_UINT8 srcID = 0u, dstID = 0u;
CM_UINT32 rcv_sn = 0u; CM_UINT32 last_sn = 0u;
/**记录是否需要向某一系发送ACK */ /**记录是否需要向某一系发送ACK */
CM_BOOL ack_flags[4] = {CM_FALSE,CM_FALSE,CM_FALSE,CM_FALSE}; 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 partner_id = AREA_BASIC_CFG_PTR->Partner_BoardID;
CM_UINT8 area_a_id = AREA_BASIC_CFG_PTR->Partner_Area_A_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 area_b_id = AREA_BASIC_CFG_PTR->Partner_Area_B_BoardID;
@@ -375,16 +429,19 @@ static void s_Area_State_Ack_Send_Process(void)
crc2 = CM_Crc32_2(&tmp_buf[1], rcv_len - 9); crc2 = CM_Crc32_2(&tmp_buf[1], rcv_len - 9);
srcID = state_pack.SrcID; srcID = state_pack.SrcID;
dstID = state_pack.DstID; dstID = state_pack.DstID;
s_Area_GetCommStatus_byID(srcID, &last_sn, NULL);
if(crc1 == state_pack.CRC1 && crc2 == state_pack.CRC2 if(crc1 == state_pack.CRC1 && crc2 == state_pack.CRC2
&& dstID == AREA_BASIC_CFG_PTR->BoardID && && dstID == AREA_BASIC_CFG_PTR->BoardID &&
ENUM_AREA_MSG_STATE_REQ == state_pack.MsgType && ENUM_AREA_MSG_STATE_REQ == state_pack.MsgType &&
rcv_sn > state_pack.SN) state_pack.SN > last_sn)
{ {
/**CRC与目的ID校验通过,并且SN最新*/ /**CRC与目的ID校验通过,并且SN最新*/
ack_flags[srcID] = CM_TRUE; ack_flags[srcID] = CM_TRUE;
s_Area_SetCommStatus_byID(srcID, state_pack.SN, CM_TRUE); s_Area_SetCommStatus_byID(srcID, state_pack.SN, CM_TRUE);
AreaArb_SetState_byID(srcID, state_pack.StateArea); AreaArb_SetState_byID(srcID, state_pack.StateArea);
AreaArb_Set2xState_byID(srcID, state_pack.State2x); 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); } while (0u < rcv_len);
@@ -429,6 +486,8 @@ static void s_Area_State_Ack_Recv_Process(void)
s_Area_SetCommStatus_byID(srcID, state_pack.SN, CM_TRUE); s_Area_SetCommStatus_byID(srcID, state_pack.SN, CM_TRUE);
AreaArb_SetState_byID(srcID, state_pack.StateArea); AreaArb_SetState_byID(srcID, state_pack.StateArea);
AreaArb_Set2xState_byID(srcID, state_pack.State2x); 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); } while (0u < rcv_len);
@@ -455,7 +514,8 @@ static void s_Area_Arb_Send_Process(void)
CM_UINT32 tmp_len = 0u; CM_UINT32 tmp_len = 0u;
CM_UINT8 tmp_buf[1400] = {0u}; CM_UINT8 tmp_buf[1400] = {0u};
ENUM_AREA_STATE local_area_state = AREA_STATE_CTRL_PTR->StateArea.Local_state; ENUM_AREA_STATE local_area_state = AREA_STATE_CTRL_PTR->StateArea.Local_state;
CM_UINT32 tolerate_arb = 0u; /**仲裁请求容忍 */ 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_REAL_LEN - 1u;
arb_pack.MsgType = ENUM_AREA_MSG_ARB_REQ; arb_pack.MsgType = ENUM_AREA_MSG_ARB_REQ;
@@ -465,6 +525,7 @@ static void s_Area_Arb_Send_Process(void)
arb_pack.ArbPayLoad = 0x55u; /**请求升主 */ arb_pack.ArbPayLoad = 0x55u; /**请求升主 */
CM_Memset(&arb_pack.Reserver[0], 0, AREA_ARB_RESERVER_LEN, AREA_ARB_RESERVER_LEN); CM_Memset(&arb_pack.Reserver[0], 0, AREA_ARB_RESERVER_LEN, AREA_ARB_RESERVER_LEN);
/**计算双CRC */ /**计算双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); 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_REAL_LEN == tmp_len, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_2, TSCP_DARK_ASSERT_1);
/**获取对应状态的板卡ID */ /**获取对应状态的板卡ID */
@@ -483,7 +544,9 @@ static void s_Area_Arb_Send_Process(void)
{ {
/**本地主地主,与备地主通信中断,发送仲裁请求 */ /**本地主地主,与备地主通信中断,发送仲裁请求 */
AREA_ARB_CTRL_PTR->Arb_Send_Flag = 1u; AREA_ARB_CTRL_PTR->Arb_Send_Flag = 1u;
Area_Arb_Req_Send(&arb_pack, sizeof(arb_pack)); send_rt = Area_Arb_Req_Send(&arb_pack, sizeof(arb_pack));
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 && 0u == id_mm)
{ {
@@ -491,7 +554,9 @@ static void s_Area_Arb_Send_Process(void)
if(tolerate_arb >= 1u) if(tolerate_arb >= 1u)
{ {
AREA_ARB_CTRL_PTR->Arb_Send_Flag = 1u; AREA_ARB_CTRL_PTR->Arb_Send_Flag = 1u;
Area_Arb_Req_Send(&arb_pack, sizeof(arb_pack)); send_rt = Area_Arb_Req_Send(&arb_pack, sizeof(arb_pack));
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; tolerate_arb = 0u;
} }
else else
@@ -505,7 +570,9 @@ static void s_Area_Arb_Send_Process(void)
if(tolerate_arb >= 10u) if(tolerate_arb >= 10u)
{ {
AREA_ARB_CTRL_PTR->Arb_Send_Flag = 1u; AREA_ARB_CTRL_PTR->Arb_Send_Flag = 1u;
Area_Arb_Req_Send(&arb_pack, sizeof(arb_pack)); send_rt = Area_Arb_Req_Send(&arb_pack, sizeof(arb_pack));
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; tolerate_arb = 0u;
} }
else else
@@ -556,8 +623,20 @@ static void s_Area_Arb_Recv_Process(void)
{ {
/**允许升主 */ /**允许升主 */
AREA_ARB_CTRL_PTR->Arb_Ack = 0x55u; 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 if(0 < rcv_len)
{
AREA_LOG_MSG("AREA_ARB:Invalid arbitration ACK length, RecvLen:%d FrameLen:%d\n",
rcv_len, arb_pack.Len);
} }
s_Area_2oo2Sync_AfterArbRecv(); s_Area_2oo2Sync_AfterArbRecv();
} }
@@ -566,15 +645,25 @@ static void s_Area_Arb_Recv_Process(void)
*/ */
static void s_Area_Arb_State_Transition(void) static void s_Area_Arb_State_Transition(void)
{ {
ENUM_AREA_STATE old_state = AREA_STATE_CTRL_PTR->StateArea.Local_state;
if(1u == AREA_ARB_CTRL_PTR->Arb_Send_Flag && 0x00u == AREA_ARB_CTRL_PTR->Arb_Ack) if(1u == AREA_ARB_CTRL_PTR->Arb_Send_Flag && 0x00u == AREA_ARB_CTRL_PTR->Arb_Ack)
{ {
/**发送了仲裁请求但未收到应答,直接宕机 */ /**发送了仲裁请求但未收到应答,直接宕机 */
AREA_LOG_MSG("AREA_ARB:Arbitration request timed out, BoardID:%d State:%d\n",
AREA_BASIC_CFG_PTR->BoardID, old_state);
CM_ASSERT(0, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_2, TSCP_DARK_ASSERT_1); CM_ASSERT(0, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_2, TSCP_DARK_ASSERT_1);
} }
else else
{ {
/**进行状态转换 */ /**进行状态转换 */
Area_With_Arb_State_Vote(); Area_With_Arb_State_Vote();
if(old_state != AREA_STATE_CTRL_PTR->StateArea.Local_state)
{
AREA_LOG_MSG("AREA_STATE:Local transition, BoardID:%d %d>>>>>%d ArbAck:0x%x\n",
AREA_BASIC_CFG_PTR->BoardID, old_state,
AREA_STATE_CTRL_PTR->StateArea.Local_state, AREA_ARB_CTRL_PTR->Arb_Ack);
}
} }
} }
/** /**
@@ -584,6 +673,7 @@ static void s_Area_State_Multi_Send_Process(void)
{ {
CM_UINT8 tmp_buf[1400]; /**< 临时缓冲区 */ CM_UINT8 tmp_buf[1400]; /**< 临时缓冲区 */
CM_INT32 tmp_len = 0; /**< 临时数据长度 */ 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}, peer_pack = {0}; /**< 待发送数据结构体 */
/** 填充结构体 */ /** 填充结构体 */
@@ -602,7 +692,13 @@ static void s_Area_State_Multi_Send_Process(void)
DOUBLE_CRC_GET(multi_pack, peer_pack, tmp_buf, 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); CM_ASSERT(AREA_ARB_STATE_PACK_REAL_LEN == tmp_len, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_2, TSCP_DARK_ASSERT_1);
/**组播发送 */ /**组播发送 */
Area_State_Multi_Send(&multi_pack, sizeof(multi_pack)); send_rt = Area_State_Multi_Send(&multi_pack, sizeof(multi_pack));
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);
}
else
{
AREA_LOG_MSG("AREA_ARB:Multicast state pack failed, Len:%d\n", tmp_len);
} }
} }
/** /**
@@ -632,6 +728,8 @@ static void s_Area_State_Multi_Recv_Process(void)
s_Area_SetCommStatus_byID(multi_pack.SrcID, multi_pack.SN, CM_TRUE); s_Area_SetCommStatus_byID(multi_pack.SrcID, multi_pack.SN, CM_TRUE);
AreaArb_SetState_byID(multi_pack.SrcID, multi_pack.StateArea); AreaArb_SetState_byID(multi_pack.SrcID, multi_pack.StateArea);
AreaArb_Set2xState_byID(multi_pack.SrcID, multi_pack.State2x); 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 else
{ {
@@ -781,10 +879,15 @@ static void s_Area_2oo2Sync_AfterStateRecv()
send_len += len_state_ctrl; send_len += len_state_ctrl;
} }
rcv_len = Area_2oo2_Currency_NoSplit(send_buf, send_len, rcv_buf, sizeof(rcv_buf)); rcv_len = Area_2oo2_Currency_NoSplit(send_buf, send_len, rcv_buf, sizeof(rcv_buf));
if(rcv_len != send_len)
{
AREA_LOG_MSG("AREA_ARB:State 2oo2 sync failed, SendLen:%d RecvLen:%d\n",
send_len, rcv_len);
}
CM_ASSERT(rcv_len == send_len, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_2, TSCP_DARK_ASSERT_1); CM_ASSERT(rcv_len == send_len, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_2, TSCP_DARK_ASSERT_1);
/**对另一CPU数据解析 */ /**对另一CPU数据解析 */
CM_Memcpy(&peer_comm_status, len_comm_status,send_buf, len_comm_status); CM_Memcpy(&peer_comm_status, len_comm_status,rcv_buf, len_comm_status);
CM_Memcpy(&peer_state_ctrl, len_state_ctrl,send_buf + len_comm_status, len_state_ctrl); CM_Memcpy(&peer_state_ctrl, len_state_ctrl,rcv_buf + len_comm_status, len_state_ctrl);
/**更新对系的接收序列号 */ /**更新对系的接收序列号 */
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 == peer_comm_status.Patner_RcvFlag)
@@ -795,6 +898,9 @@ static void s_Area_2oo2Sync_AfterStateRecv()
AREA_STATE_CTRL_PTR->StateArea.Partner_state = peer_state_ctrl.StateArea.Partner_state; AREA_STATE_CTRL_PTR->StateArea.Partner_state = peer_state_ctrl.StateArea.Partner_state;
AREA_STATE_CTRL_PTR->State2x.PartnerState = peer_state_ctrl.State2x.PartnerState; AREA_STATE_CTRL_PTR->State2x.PartnerState = peer_state_ctrl.State2x.PartnerState;
AREA_LOG_MSG("AREA_STATE:2oo2 sync update, BoardID:%d SN:%d State:%d 2x2:%d\n",
AREA_BASIC_CFG_PTR->Partner_BoardID, peer_comm_status.PatnerSN,
peer_state_ctrl.StateArea.Partner_state, peer_state_ctrl.State2x.PartnerState);
} }
else else
{ {
@@ -810,6 +916,9 @@ static void s_Area_2oo2Sync_AfterStateRecv()
AREA_STATE_CTRL_PTR->StateArea.Partner_Area_A_state = peer_state_ctrl.StateArea.Partner_Area_A_state; AREA_STATE_CTRL_PTR->StateArea.Partner_Area_A_state = peer_state_ctrl.StateArea.Partner_Area_A_state;
AREA_STATE_CTRL_PTR->State2x.Area_A_State = peer_state_ctrl.State2x.Area_A_State; AREA_STATE_CTRL_PTR->State2x.Area_A_State = peer_state_ctrl.State2x.Area_A_State;
AREA_LOG_MSG("AREA_STATE:2oo2 sync update, BoardID:%d SN:%d State:%d 2x2:%d\n",
AREA_BASIC_CFG_PTR->Partner_Area_A_BoardID, peer_comm_status.Area_A_SN,
peer_state_ctrl.StateArea.Partner_Area_A_state, peer_state_ctrl.State2x.Area_A_State);
} }
else else
{ {
@@ -825,6 +934,9 @@ static void s_Area_2oo2Sync_AfterStateRecv()
AREA_STATE_CTRL_PTR->StateArea.Partner_Area_B_state = peer_state_ctrl.StateArea.Partner_Area_B_state; AREA_STATE_CTRL_PTR->StateArea.Partner_Area_B_state = peer_state_ctrl.StateArea.Partner_Area_B_state;
AREA_STATE_CTRL_PTR->State2x.Area_B_State = peer_state_ctrl.State2x.Area_B_State; AREA_STATE_CTRL_PTR->State2x.Area_B_State = peer_state_ctrl.State2x.Area_B_State;
AREA_LOG_MSG("AREA_STATE:2oo2 sync update, BoardID:%d SN:%d State:%d 2x2:%d\n",
AREA_BASIC_CFG_PTR->Partner_Area_B_BoardID, peer_comm_status.Area_B_SN,
peer_state_ctrl.StateArea.Partner_Area_B_state, peer_state_ctrl.State2x.Area_B_State);
} }
else else
{ {
@@ -839,6 +951,7 @@ static void s_Area_SendACK_After2oo2(CM_BOOL ack_partner, CM_BOOL ack_area_a, CM
STRU_AREA_WITH_ARB_STATE_PACK_T state_pack = {0}, peer_pack = {0}; STRU_AREA_WITH_ARB_STATE_PACK_T state_pack = {0}, peer_pack = {0};
CM_UINT8 tmp_buf[1400] = {0}; CM_UINT8 tmp_buf[1400] = {0};
CM_INT32 tmp_len = 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_REAL_LEN - 1;
state_pack.MsgType = ENUM_AREA_MSG_STATE_ACK; state_pack.MsgType = ENUM_AREA_MSG_STATE_ACK;
@@ -857,7 +970,9 @@ static void s_Area_SendACK_After2oo2(CM_BOOL ack_partner, CM_BOOL ack_area_a, CM
tmp_len = Area_Arb_State_Pack(tmp_buf, sizeof(tmp_buf), &state_pack); tmp_len = Area_Arb_State_Pack(tmp_buf, sizeof(tmp_buf), &state_pack);
DOUBLE_CRC_GET(state_pack, peer_pack, tmp_buf, 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); CM_ASSERT(AREA_ARB_STATE_PACK_REAL_LEN == tmp_len, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_2, TSCP_DARK_ASSERT_1);
Area_State_Send(AREA_BASIC_CFG_PTR->Partner_Area_A_BoardID, &state_pack, sizeof(state_pack)); send_rt = Area_State_Send(AREA_BASIC_CFG_PTR->Partner_BoardID, &state_pack, sizeof(state_pack));
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);
} }
if(CM_TRUE == AREA_COMM_STATUS_PTR->Area_A_RcvFlag && CM_TRUE == ack_area_a) if(CM_TRUE == AREA_COMM_STATUS_PTR->Area_A_RcvFlag && CM_TRUE == ack_area_a)
{ {
@@ -867,7 +982,9 @@ static void s_Area_SendACK_After2oo2(CM_BOOL ack_partner, CM_BOOL ack_area_a, CM
tmp_len = Area_Arb_State_Pack(tmp_buf, sizeof(tmp_buf), &state_pack); tmp_len = Area_Arb_State_Pack(tmp_buf, sizeof(tmp_buf), &state_pack);
DOUBLE_CRC_GET(state_pack, peer_pack, tmp_buf, 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); CM_ASSERT(AREA_ARB_STATE_PACK_REAL_LEN == tmp_len, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_2, TSCP_DARK_ASSERT_1);
Area_State_Send(AREA_BASIC_CFG_PTR->Partner_Area_A_BoardID, &state_pack, sizeof(state_pack)); send_rt = Area_State_Send(AREA_BASIC_CFG_PTR->Partner_Area_A_BoardID, &state_pack, sizeof(state_pack));
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);
} }
if(CM_TRUE == AREA_COMM_STATUS_PTR->Area_B_RcvFlag && CM_TRUE == ack_area_b) if(CM_TRUE == AREA_COMM_STATUS_PTR->Area_B_RcvFlag && CM_TRUE == ack_area_b)
{ {
@@ -877,7 +994,9 @@ static void s_Area_SendACK_After2oo2(CM_BOOL ack_partner, CM_BOOL ack_area_a, CM
tmp_len = Area_Arb_State_Pack(tmp_buf, sizeof(tmp_buf), &state_pack); tmp_len = Area_Arb_State_Pack(tmp_buf, sizeof(tmp_buf), &state_pack);
DOUBLE_CRC_GET(state_pack, peer_pack, tmp_buf, 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); CM_ASSERT(AREA_ARB_STATE_PACK_REAL_LEN == tmp_len, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_2, TSCP_DARK_ASSERT_1);
Area_State_Send(AREA_BASIC_CFG_PTR->Partner_Area_B_BoardID, &state_pack, sizeof(state_pack)); send_rt = Area_State_Send(AREA_BASIC_CFG_PTR->Partner_Area_B_BoardID, &state_pack, sizeof(state_pack));
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);
} }
} }
/** /**
@@ -889,11 +1008,18 @@ static void s_Area_2oo2Sync_AfterArbRecv()
STRU_AREA_WITH_ARB_REQ_T peer_ctrl = {0}; STRU_AREA_WITH_ARB_REQ_T peer_ctrl = {0};
/**2取交互仲裁应答信息 */ /**2取交互仲裁应答信息 */
rcv_len = Area_2oo2_Currency_NoSplit(AREA_ARB_CTRL_PTR, len, &peer_ctrl, len); rcv_len = Area_2oo2_Currency_NoSplit(AREA_ARB_CTRL_PTR, len, &peer_ctrl, len);
if(len != rcv_len)
{
AREA_LOG_MSG("AREA_ARB:Arbitration 2oo2 sync failed, SendLen:%d RecvLen:%d\n",
len, rcv_len);
}
CM_ASSERT(len == rcv_len, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_2, TSCP_DARK_ASSERT_1); CM_ASSERT(len == rcv_len, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_2, TSCP_DARK_ASSERT_1);
if(peer_ctrl.Arb_Ack == 0x55u && AREA_ARB_CTRL_PTR->Arb_Ack == 0x00u) if(peer_ctrl.Arb_Ack == 0x55u && AREA_ARB_CTRL_PTR->Arb_Ack == 0x00u)
{ {
/**本CPU没有收到仲裁回复,另一CPU收到,同步仲裁状态 */ /**本CPU没有收到仲裁回复,另一CPU收到,同步仲裁状态 */
AREA_ARB_CTRL_PTR->Arb_Ack = peer_ctrl.Arb_Ack; AREA_ARB_CTRL_PTR->Arb_Ack = peer_ctrl.Arb_Ack;
AREA_LOG_MSG("AREA_ARB:Arbitration ACK synchronized from peer CPU, ACK:0x%x\n",
peer_ctrl.Arb_Ack);
} }
} }
+9 -9
View File
@@ -428,7 +428,7 @@ static CM_THREAD_FUNC_T t_Area_Multi_UdpRecvThread(IN STRU_AREA_MULTICAST_COMM_T
rcvBuf = CM_MQ_Get_BufAddr(&pCtrl->MsgQ); rcvBuf = CM_MQ_Get_BufAddr(&pCtrl->MsgQ);
if (NULL != rcvBuf) if (NULL != rcvBuf)
{ {
len = CM_UDP_Recv_Msg(pCtrl->Socket_Recv, &rcvBuf[0u], (CM_INT32)CM_UNSIGNED_SHORT_EXP(pCtrl->MsgQ.maxMsgSize), &srcIP, &srcPort); len = CM_UDP_Recv_Msg(pCtrl->Socket_Recv, &rcvBuf[4u], (CM_INT32)CM_UNSIGNED_SHORT_EXP(pCtrl->MsgQ.maxMsgSize - 4u), &srcIP, &srcPort);
/*- 是否收到有效数据 */ /*- 是否收到有效数据 */
if (len > 0) if (len > 0)
{ {
@@ -436,9 +436,9 @@ static CM_THREAD_FUNC_T t_Area_Multi_UdpRecvThread(IN STRU_AREA_MULTICAST_COMM_T
if ((srcIP != 0) && (srcPort != 0)) if ((srcIP != 0) && (srcPort != 0))
{ {
/*- @alias 将收到的报文写入线程接收队列 */ /*- @alias 将收到的报文写入线程接收队列 */
// MSCP_LOG_MSG("!!! area recv len = %d \r\n",len); CM_LongToChar((CM_UINT32)(CM_GetTick()/CM_UNSIGNED_MILLION), rcvBuf);
/*- 保存通信数据 */ /*- 保存通信数据 */
rt = CM_MQ_UpData(&pCtrl->MsgQ, (CM_UINT16)CM_SIGNED_INT_EXP(len)); rt = CM_MQ_UpData(&pCtrl->MsgQ, (CM_UINT16)CM_SIGNED_INT_EXP(len+4u));
/*- 数据保存是否成功 */ /*- 数据保存是否成功 */
if (ENUM_CM_TRUE == rt) if (ENUM_CM_TRUE == rt)
{ {
@@ -461,7 +461,7 @@ static CM_THREAD_FUNC_T t_Area_Multi_UdpRecvThread(IN STRU_AREA_MULTICAST_COMM_T
else else
{ {
/*- 接收出错 */ /*- 接收出错 */
MSCP_LOG_MSG("warning ASSERT1103: port %d rx err(len=%d)\n", pCtrl->Port_Recv, len); AREA_LOG_MSG("warning ASSERT1103: port %d rx err(len=%d)\n", pCtrl->port, 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)); (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));
} }
} }
@@ -469,7 +469,7 @@ static CM_THREAD_FUNC_T t_Area_Multi_UdpRecvThread(IN STRU_AREA_MULTICAST_COMM_T
{ {
/*获取队列指针失败,清空队列*/ /*获取队列指针失败,清空队列*/
rt = CM_MQ_Clear(&pCtrl->MsgQ); rt = CM_MQ_Clear(&pCtrl->MsgQ);
MSCP_LOG_MSG("buf clear\n"); AREA_LOG_MSG("buf clear\n");
CM_RE_ASSERT(ENUM_CM_TRUE == rt, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_11, TSCP_DARK_ASSERT_4); CM_RE_ASSERT(ENUM_CM_TRUE == rt, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_11, TSCP_DARK_ASSERT_4);
} }
} }
@@ -551,7 +551,7 @@ static CM_THREAD_FUNC_T t_Area_Uni_UdpRecvThread(IN STR_Area_IP_Cfg *arg)
rcvBuf = CM_MQ_Get_BufAddr(&pCtrl->MsgQ); rcvBuf = CM_MQ_Get_BufAddr(&pCtrl->MsgQ);
if (NULL != rcvBuf) if (NULL != rcvBuf)
{ {
len = CM_UDP_Recv_Msg(pCtrl->Socket, &rcvBuf[4u], (CM_INT32)CM_UNSIGNED_SHORT_EXP(pCtrl->MsgQ.maxMsgSize), &srcIP, &srcPort); len = CM_UDP_Recv_Msg(pCtrl->Socket, &rcvBuf[4u], (CM_INT32)CM_UNSIGNED_SHORT_EXP(pCtrl->MsgQ.maxMsgSize - 4u), &srcIP, &srcPort);
/*- 是否收到有效数据 */ /*- 是否收到有效数据 */
if (len > 0) if (len > 0)
{ {
@@ -561,7 +561,7 @@ static CM_THREAD_FUNC_T t_Area_Uni_UdpRecvThread(IN STR_Area_IP_Cfg *arg)
/*- @alias 将收到的报文写入线程接收队列 */ /*- @alias 将收到的报文写入线程接收队列 */
CM_LongToChar((CM_UINT32)(CM_GetTick()/CM_UNSIGNED_MILLION), rcvBuf); CM_LongToChar((CM_UINT32)(CM_GetTick()/CM_UNSIGNED_MILLION), rcvBuf);
/*- 保存通信数据 */ /*- 保存通信数据 */
rt = CM_MQ_UpData(&pCtrl->MsgQ, (CM_UINT16)CM_SIGNED_INT_EXP(len)); rt = CM_MQ_UpData(&pCtrl->MsgQ, (CM_UINT16)CM_SIGNED_INT_EXP(len+4u));
/*- 数据保存是否成功 */ /*- 数据保存是否成功 */
if (ENUM_CM_TRUE == rt) if (ENUM_CM_TRUE == rt)
{ {
@@ -584,7 +584,7 @@ static CM_THREAD_FUNC_T t_Area_Uni_UdpRecvThread(IN STR_Area_IP_Cfg *arg)
else else
{ {
/*- 接收出错 */ /*- 接收出错 */
MSCP_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, 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)); (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));
} }
} }
@@ -592,7 +592,7 @@ static CM_THREAD_FUNC_T t_Area_Uni_UdpRecvThread(IN STR_Area_IP_Cfg *arg)
{ {
/*获取队列指针失败,清空队列*/ /*获取队列指针失败,清空队列*/
rt = CM_MQ_Clear(&pCtrl->MsgQ); rt = CM_MQ_Clear(&pCtrl->MsgQ);
MSCP_LOG_MSG("buf clear\n"); AREA_LOG_MSG("buf clear\n");
CM_RE_ASSERT(ENUM_CM_TRUE == rt, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_11, TSCP_DARK_ASSERT_4); CM_RE_ASSERT(ENUM_CM_TRUE == rt, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_11, TSCP_DARK_ASSERT_4);
} }
} }
+17 -7
View File
@@ -25,7 +25,7 @@ ENUM_AREA_STATE AreaArb_GetState_byID(CM_UINT8 ID)
} }
else else
{ {
AREA_LOG_MSG("Cant Find ID:%d\n", ID); AREA_LOG_MSG("AREA_STATE:Get state failed, invalid board ID:%d\n", ID);
} }
return state; return state;
} }
@@ -35,6 +35,11 @@ ENUM_AREA_STATE AreaArb_GetState_byID(CM_UINT8 ID)
*/ */
void AreaArb_SetState_byID(CM_UINT8 ID, ENUM_AREA_STATE state) void AreaArb_SetState_byID(CM_UINT8 ID, ENUM_AREA_STATE state)
{ {
if((state < ENUM_AREA_SHUTDOWN) || (state > ENUM_AREA_SLAVE))
{
AREA_LOG_MSG("AREA_STATE:Set invalid area state, ID:%d State:%d\n", ID, state);
}
if(ID == AREA_BASIC_CFG_PTR->BoardID) if(ID == AREA_BASIC_CFG_PTR->BoardID)
{ {
AREA_STATE_CTRL_PTR->StateArea.Local_state = state; AREA_STATE_CTRL_PTR->StateArea.Local_state = state;
@@ -53,7 +58,7 @@ void AreaArb_SetState_byID(CM_UINT8 ID, ENUM_AREA_STATE state)
} }
else else
{ {
AREA_LOG_MSG("Cant Find ID:%d\n", ID); AREA_LOG_MSG("AREA_STATE:Set state failed, invalid board ID:%d State:%d\n", ID, state);
} }
} }
@@ -81,7 +86,7 @@ ENUM_2x2_STATE_T AreaArb_Get2xState_byID(CM_UINT8 ID)
} }
else else
{ {
AREA_LOG_MSG("Cant Find ID:%d\n", ID); AREA_LOG_MSG("AREA_STATE:Get 2x2 state failed, invalid board ID:%d\n", ID);
} }
return state; return state;
} }
@@ -91,6 +96,11 @@ ENUM_2x2_STATE_T AreaArb_Get2xState_byID(CM_UINT8 ID)
*/ */
void AreaArb_Set2xState_byID(CM_UINT8 ID, ENUM_2x2_STATE_T state) void AreaArb_Set2xState_byID(CM_UINT8 ID, ENUM_2x2_STATE_T state)
{ {
if((state < ENUM_2x2_SHUTDOWN) || (state > ENUM_2x2_MASTER))
{
AREA_LOG_MSG("AREA_STATE:Set invalid 2x2 state, ID:%d State:%d\n", ID, state);
}
if(ID == AREA_BASIC_CFG_PTR->BoardID) if(ID == AREA_BASIC_CFG_PTR->BoardID)
{ {
AREA_STATE_CTRL_PTR->State2x.LocalState = state; AREA_STATE_CTRL_PTR->State2x.LocalState = state;
@@ -109,13 +119,13 @@ void AreaArb_Set2xState_byID(CM_UINT8 ID, ENUM_2x2_STATE_T state)
} }
else else
{ {
AREA_LOG_MSG("Cant Find ID:%d\n", ID); AREA_LOG_MSG("AREA_STATE:Set 2x2 state failed, invalid board ID:%d State:%d\n", ID, state);
} }
} }
/** /**
* @brief 通过状态获取某个板卡ID * @brief 通过状态获取某个板卡ID
*/ */
CM_UINT8 AreaArb_GetID_byState(ENUM_AREA_STATE* state_area, ENUM_2x2_STATE_T* state_2x) CM_UINT8 AreaArb_GetID_byState(ENUM_AREA_STATE state_area, ENUM_2x2_STATE_T state_2x)
{ {
CM_UINT8 boardID = 0u; CM_UINT8 boardID = 0u;
@@ -137,7 +147,7 @@ CM_UINT8 AreaArb_GetID_byState(ENUM_AREA_STATE* state_area, ENUM_2x2_STATE_T* st
} }
else else
{ {
AREA_LOG_MSG("Cant Find State:%d-%d\n", state_area, state_2x); AREA_LOG_MSG("AREA_STATE:Board not found by state, Area:%d 2x2:%d\n", state_area, state_2x);
} }
return boardID; return boardID;
@@ -149,7 +159,7 @@ void AreaArb_Get_All_State(STR_Area_State *p_all_State)
{ {
if(NULL == p_all_State) if(NULL == p_all_State)
{ {
AREA_LOG_MSG("AREA_STATE:Get all states failed, output is NULL\n");
} }
else else
{ {
+1 -1
View File
@@ -27,7 +27,7 @@ void AreaArb_Set2xState_byID(CM_UINT8 ID, ENUM_2x2_STATE_T state);
* @brief 仲裁模式下使用,通过状态获取某个板卡ID * @brief 仲裁模式下使用,通过状态获取某个板卡ID
* @return 0表示无该板卡 * @return 0表示无该板卡
*/ */
CM_UINT8 AreaArb_GetID_byState(ENUM_AREA_STATE* state_area, ENUM_2x2_STATE_T* state_2x); CM_UINT8 AreaArb_GetID_byState(ENUM_AREA_STATE state_area, ENUM_2x2_STATE_T state_2x);
/** /**
* @brief 仲裁模式下使用,获取所有区域状态 * @brief 仲裁模式下使用,获取所有区域状态
+20 -1
View File
@@ -45,6 +45,9 @@ void Area_With_Arb_State_Vote(void)
case ENUM_AREA_SLAVE: case ENUM_AREA_SLAVE:
s_Slave_vote(); s_Slave_vote();
break; break;
default:
AREA_LOG_MSG("AREA_STATE_VOTE:Invalid local state:%d\n", local_state);
break;
} }
} }
@@ -54,6 +57,7 @@ void Area_With_Arb_State_Vote(void)
void s_Shutdown_vote(void) void s_Shutdown_vote(void)
{ {
VOTE_STATE_CTRL->Local_state = ENUM_AREA_SHUTDOWN; VOTE_STATE_CTRL->Local_state = ENUM_AREA_SHUTDOWN;
AREA_LOG_MSG("AREA_STATE_VOTE:Local is Shutdown, system will assert\n");
CM_ASSERT(0, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_2, TSCP_DARK_ASSERT_1); CM_ASSERT(0, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_2, TSCP_DARK_ASSERT_1);
} }
/** /**
@@ -72,11 +76,13 @@ void s_Unknown_vote(void)
{ {
/**收到仲裁升主回复 */ /**收到仲裁升主回复 */
VOTE_STATE_CTRL->Local_state = ENUM_AREA_MASTER; VOTE_STATE_CTRL->Local_state = ENUM_AREA_MASTER;
AREA_LOG_MSG("AREA_STATE_VOTE:Unknow>>>>>Master, Arbitration ACK received\n");
} }
else if(ENUM_AREA_MASTER == Partner_State) else if(ENUM_AREA_MASTER == Partner_State)
{ {
/**和主地在同一地 */ /**和主地在同一地 */
VOTE_STATE_CTRL->Local_state = ENUM_AREA_MASTER; VOTE_STATE_CTRL->Local_state = ENUM_AREA_MASTER;
AREA_LOG_MSG("AREA_STATE_VOTE:Unknow>>>>>Master, Partner is Master\n");
} }
else if((ENUM_AREA_UNKNOW == Area_A_State || ENUM_AREA_UNKNOW == Area_B_State) else if((ENUM_AREA_UNKNOW == Area_A_State || ENUM_AREA_UNKNOW == Area_B_State)
&& (MSCP_AREA_ID_B == AREA_BASIC_CFG_PTR->AreaID)) && (MSCP_AREA_ID_B == AREA_BASIC_CFG_PTR->AreaID))
@@ -95,6 +101,7 @@ void s_Unknown_vote(void)
{ {
/**另一地是主地,降离线 */ /**另一地是主地,降离线 */
VOTE_STATE_CTRL->Local_state = ENUM_AREA_OFFLINE; VOTE_STATE_CTRL->Local_state = ENUM_AREA_OFFLINE;
AREA_LOG_MSG("AREA_STATE_VOTE:Unknow>>>>>Offline, Another Area is Master\n");
} }
else if((MSCP_AREA_ID_A == AREA_BASIC_CFG_PTR->AreaID) else if((MSCP_AREA_ID_A == AREA_BASIC_CFG_PTR->AreaID)
&& (ENUM_AREA_UNKNOW == Area_A_State || ENUM_AREA_OFFLINE == Area_A_State) && (ENUM_AREA_UNKNOW == Area_A_State || ENUM_AREA_OFFLINE == Area_A_State)
@@ -105,6 +112,8 @@ void s_Unknown_vote(void)
if(s_unkown_cnt > MSCP_AREA_UNKNOW_COUNT_MAX) if(s_unkown_cnt > MSCP_AREA_UNKNOW_COUNT_MAX)
{ {
VOTE_STATE_CTRL->Local_state = ENUM_AREA_MASTER; VOTE_STATE_CTRL->Local_state = ENUM_AREA_MASTER;
AREA_LOG_MSG("AREA_STATE_VOTE:Unknow>>>>>Master, Local A tolerated %d cycles\n",
s_unkown_cnt);
s_unkown_cnt = 0u; s_unkown_cnt = 0u;
} }
} }
@@ -113,7 +122,7 @@ void s_Unknown_vote(void)
/**维持未知地 */ /**维持未知地 */
} }
/**离开未知地,清空计数 */ /**离开未知地,清空计数 */
if(ENUM_AREA_UNKNOW == VOTE_STATE_CTRL->Local_state) if(ENUM_AREA_UNKNOW != VOTE_STATE_CTRL->Local_state)
{ {
s_unkown_cnt = 0u; s_unkown_cnt = 0u;
} }
@@ -133,12 +142,14 @@ void s_Offline_vote(void)
{ {
/**主地在本地,升主地 */ /**主地在本地,升主地 */
VOTE_STATE_CTRL->Local_state = ENUM_AREA_MASTER; VOTE_STATE_CTRL->Local_state = ENUM_AREA_MASTER;
AREA_LOG_MSG("AREA_STATE_VOTE:Offline>>>>>Master, Partner is Master and sync is healthy\n");
} }
else if(ENUM_AREA_MASTER == VOTE_STATE_CTRL->Partner_Area_A_state || else if(ENUM_AREA_MASTER == VOTE_STATE_CTRL->Partner_Area_A_state ||
ENUM_AREA_MASTER == VOTE_STATE_CTRL->Partner_Area_B_state) ENUM_AREA_MASTER == VOTE_STATE_CTRL->Partner_Area_B_state)
{ {
/**主地在另一地,升备地 */ /**主地在另一地,升备地 */
VOTE_STATE_CTRL->Local_state = ENUM_AREA_SLAVE; VOTE_STATE_CTRL->Local_state = ENUM_AREA_SLAVE;
AREA_LOG_MSG("AREA_STATE_VOTE:Offline>>>>>Slave, Another Area is Master and sync is healthy\n");
} }
else else
{ {
@@ -149,6 +160,7 @@ void s_Offline_vote(void)
{ {
/**(预留)主地主ID不存在,认为主地主宕机,离线地降未知地 */ /**(预留)主地主ID不存在,认为主地主宕机,离线地降未知地 */
VOTE_STATE_CTRL->Local_state = ENUM_AREA_UNKNOW; VOTE_STATE_CTRL->Local_state = ENUM_AREA_UNKNOW;
AREA_LOG_MSG("AREA_STATE_VOTE:Offline>>>>>Unknow, Master board not found\n");
} }
else else
{ {
@@ -164,6 +176,8 @@ void s_Master_vote(void)
if(ENUM_AREA_MASTER == VOTE_STATE_CTRL->Partner_Area_A_state || ENUM_AREA_MASTER == VOTE_STATE_CTRL->Partner_Area_B_state) if(ENUM_AREA_MASTER == VOTE_STATE_CTRL->Partner_Area_A_state || ENUM_AREA_MASTER == VOTE_STATE_CTRL->Partner_Area_B_state)
{ {
/**双主宕机 */ /**双主宕机 */
AREA_LOG_MSG("AREA_STATE_VOTE:Double master detected, Another Area state:%d-%d\n",
VOTE_STATE_CTRL->Partner_Area_A_state, VOTE_STATE_CTRL->Partner_Area_B_state);
CM_ASSERT(0, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_2, TSCP_DARK_ASSERT_1); CM_ASSERT(0, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_2, TSCP_DARK_ASSERT_1);
} }
} }
@@ -179,6 +193,7 @@ void s_Slave_vote(void)
{ {
/**收到仲裁升主回复 */ /**收到仲裁升主回复 */
VOTE_STATE_CTRL->Local_state = ENUM_AREA_MASTER; VOTE_STATE_CTRL->Local_state = ENUM_AREA_MASTER;
AREA_LOG_MSG("AREA_STATE_VOTE:Slave>>>>>Master, Arbitration ACK received\n");
} }
else if(CM_FALSE == Sync_Fail_Flag) else if(CM_FALSE == Sync_Fail_Flag)
{ {
@@ -187,6 +202,8 @@ void s_Slave_vote(void)
{ {
/**主地主存活,降离线 */ /**主地主存活,降离线 */
VOTE_STATE_CTRL->Local_state = ENUM_AREA_OFFLINE; VOTE_STATE_CTRL->Local_state = ENUM_AREA_OFFLINE;
AREA_LOG_MSG("AREA_STATE_VOTE:Slave>>>>>Offline, Sync failed and Master ID:%d exists\n",
id_mm);
} }
else else
{ {
@@ -196,6 +213,7 @@ void s_Slave_vote(void)
{ {
s_slave_cnt = 0u; s_slave_cnt = 0u;
VOTE_STATE_CTRL->Local_state = ENUM_AREA_OFFLINE; VOTE_STATE_CTRL->Local_state = ENUM_AREA_OFFLINE;
AREA_LOG_MSG("AREA_STATE_VOTE:Slave>>>>>Offline, Sync failed and Master is lost\n");
} }
} }
} }
@@ -203,6 +221,7 @@ void s_Slave_vote(void)
{ {
/**对系是主地,升主地(备地主升主地主后,备地备通过这条逻辑升主地) */ /**对系是主地,升主地(备地主升主地主后,备地备通过这条逻辑升主地) */
VOTE_STATE_CTRL->Local_state = ENUM_AREA_MASTER; VOTE_STATE_CTRL->Local_state = ENUM_AREA_MASTER;
AREA_LOG_MSG("AREA_STATE_VOTE:Slave>>>>>Master, Partner is Master\n");
} }
else else
{ {
+17
View File
@@ -40,6 +40,7 @@
#include "SFM_Prtcl.h" #include "SFM_Prtcl.h"
#include "PFM_RemoteUpdate.h" #include "PFM_RemoteUpdate.h"
#include "CFM_Sync.h" #include "CFM_Sync.h"
#include "Arb.h"
#if QNX #if QNX
#include <sys/neutrino.h> #include <sys/neutrino.h>
#include <sys/trace.h> #include <sys/trace.h>
@@ -242,7 +243,15 @@ static void MSCP_Init(void)
PFM_LOG_SET_INIT_STAGE(ENUM_INIT_APP_CTRL); PFM_LOG_SET_INIT_STAGE(ENUM_INIT_APP_CTRL);
PFM_LOG_SET_INIT_STAGE(ENUM_INIT_2X2USART); PFM_LOG_SET_INIT_STAGE(ENUM_INIT_2X2USART);
CFM_TimeSync_Init(2);//时间同步初始化 CFM_TimeSync_Init(2);//时间同步初始化
if(0x55u == g_PFM_Cfg.M_Arb_Enable)
{
Area_With_Arb_Init();
}
else
{
Area_init();//区域初始化 Area_init();//区域初始化
}
/*- 是否开启2oo2功能 */ /*- 是否开启2oo2功能 */
if (0x55u == g_PFM_Cfg.M_2oo2_Enable) if (0x55u == g_PFM_Cfg.M_2oo2_Enable)
@@ -324,7 +333,15 @@ static CM_THREAD_FUNC_T MSCP_CycBase(void)
/*发送2x状态结束信号量*/ /*发送2x状态结束信号量*/
SFM_2x2_SemPost(); SFM_2x2_SemPost();
/*< 发送区域通信结束信号量*/ /*< 发送区域通信结束信号量*/
if(0x55u == g_PFM_Cfg.M_Arb_Enable)
{
Area_Arb_Stop();
}
else
{
Area_Stop(); Area_Stop();
}
(void)DFM_SetIO_OutPut(0x00u); (void)DFM_SetIO_OutPut(0x00u);
/*- 循环执行周期逻辑 */ /*- 循环执行周期逻辑 */
while (1) while (1)
+2
View File
@@ -139,6 +139,7 @@ void PFM_CFG_Init(void)
g_PFM_Cfg.M_2oo2_Enable = g_AppCfgInterface.M_2oo2_Enable; g_PFM_Cfg.M_2oo2_Enable = g_AppCfgInterface.M_2oo2_Enable;
g_PFM_Cfg.M_2x2_Enable = g_AppCfgInterface.M_2x2_Enable; g_PFM_Cfg.M_2x2_Enable = g_AppCfgInterface.M_2x2_Enable;
g_PFM_Cfg.M_4x2_Enable = g_AppCfgInterface.M_4x2_Enable; g_PFM_Cfg.M_4x2_Enable = g_AppCfgInterface.M_4x2_Enable;
g_PFM_Cfg.M_Arb_Enable = g_AppCfgInterface.M_Arb_Enable;
g_PFM_Cfg.M_2x2_Com_Cfg = g_AppCfgInterface.M_2x2_Com_Cfg; g_PFM_Cfg.M_2x2_Com_Cfg = g_AppCfgInterface.M_2x2_Com_Cfg;
g_PFM_Cfg.M_InnetSafe_Enable = g_AppCfgInterface.M_InnetSafe_Enable; g_PFM_Cfg.M_InnetSafe_Enable = g_AppCfgInterface.M_InnetSafe_Enable;
g_PFM_Cfg.M_InnetRaw_Enable = g_AppCfgInterface.M_InnetRaw_Enable; g_PFM_Cfg.M_InnetRaw_Enable = g_AppCfgInterface.M_InnetRaw_Enable;
@@ -158,6 +159,7 @@ void PFM_CFG_Init(void)
MSCP_LOG_MSG("M_2oo2_Enable:0x%x\n",g_PFM_Cfg.M_2oo2_Enable); MSCP_LOG_MSG("M_2oo2_Enable:0x%x\n",g_PFM_Cfg.M_2oo2_Enable);
MSCP_LOG_MSG("M_2x2_Enable:0x%x\n",g_PFM_Cfg.M_2x2_Enable); MSCP_LOG_MSG("M_2x2_Enable:0x%x\n",g_PFM_Cfg.M_2x2_Enable);
MSCP_LOG_MSG("M_4x2_Enable:0x%x\n",g_PFM_Cfg.M_4x2_Enable); MSCP_LOG_MSG("M_4x2_Enable:0x%x\n",g_PFM_Cfg.M_4x2_Enable);
MSCP_LOG_MSG("M_Arb_Enable:0x%x\n",g_PFM_Cfg.M_Arb_Enable);
MSCP_LOG_MSG("M_2x2_Com_Cfg:0x%x\n",g_PFM_Cfg.M_2x2_Com_Cfg); MSCP_LOG_MSG("M_2x2_Com_Cfg:0x%x\n",g_PFM_Cfg.M_2x2_Com_Cfg);
MSCP_LOG_MSG("M_InnetSafe_Enable:0x%x\n",g_PFM_Cfg.M_InnetSafe_Enable); MSCP_LOG_MSG("M_InnetSafe_Enable:0x%x\n",g_PFM_Cfg.M_InnetSafe_Enable);
MSCP_LOG_MSG("M_InnetRaw_Enable:0x%x\n",g_PFM_Cfg.M_InnetRaw_Enable); MSCP_LOG_MSG("M_InnetRaw_Enable:0x%x\n",g_PFM_Cfg.M_InnetRaw_Enable);
+1
View File
@@ -424,6 +424,7 @@ void MSCP_REBOOT_ASSERT(unsigned int x, unsigned int MaintenanceFlag,unsigned sh
/*- 置位全局宕机标志 */ /*- 置位全局宕机标志 */
s_stopflag = 0x55u; s_stopflag = 0x55u;
SFM_2x2_LOG_Transition(); SFM_2x2_LOG_Transition();
Area_LOG_Transition();
/*- 控制台输出断言失效信息 */ /*- 控制台输出断言失效信息 */
MSCP_LOG_MSG("MSCP_REBOOT_ASSERT: %s:%s:%d,version:%d.%d.%d.%d,Cyc = %d,DefaultNum:0x%x\n", filename, func, line,MSCP_SW_VERION[0], MSCP_SW_VERION[1], MSCP_SW_VERION[2], MSCP_SW_VERION[3],g_MSCP_SysCount,darkBuf); MSCP_LOG_MSG("MSCP_REBOOT_ASSERT: %s:%s:%d,version:%d.%d.%d.%d,Cyc = %d,DefaultNum:0x%x\n", filename, func, line,MSCP_SW_VERION[0], MSCP_SW_VERION[1], MSCP_SW_VERION[2], MSCP_SW_VERION[3],g_MSCP_SysCount,darkBuf);
(void)printf("MSCP_REBOOT_ASSERT: %s:%s:%d,version:%d.%d.%d.%d,Cyc = %d,DefaultNum:0x%x\n", filename, func, line,MSCP_SW_VERION[0], MSCP_SW_VERION[1], MSCP_SW_VERION[2], MSCP_SW_VERION[3],g_MSCP_SysCount,darkBuf); (void)printf("MSCP_REBOOT_ASSERT: %s:%s:%d,version:%d.%d.%d.%d,Cyc = %d,DefaultNum:0x%x\n", filename, func, line,MSCP_SW_VERION[0], MSCP_SW_VERION[1], MSCP_SW_VERION[2], MSCP_SW_VERION[3],g_MSCP_SysCount,darkBuf);
+2 -1
View File
@@ -34,6 +34,7 @@
#include "stdarg.h" #include "stdarg.h"
#include "Area_state.h" #include "Area_state.h"
#include "Arb_State.h" #include "Arb_State.h"
#include "Arb.h"
/*通信中断时间和同步超时时间可以相同,此时优先执行通信中断切系*/ /*通信中断时间和同步超时时间可以相同,此时优先执行通信中断切系*/
@@ -1168,7 +1169,7 @@ void SFM_4x2_ChangeState(void)
/*- 等待Area结束信号量*/ /*- 等待Area结束信号量*/
if(0x55u == g_PFM_Cfg.M_Arb_Enable) if(0x55u == g_PFM_Cfg.M_Arb_Enable)
{ {
Area_Arb_Stop(); Area_Arb_Wait_Stop();
} }
else else
{ {