同时上电,一主三备正常,待遍历异常场景

This commit is contained in:
lh
2026-08-21 15:05:48 +08:00
parent eb5bdc8177
commit 8e7cd0ea12
11 changed files with 206 additions and 60 deletions
+1
View File
@@ -111,6 +111,7 @@ INCLUDES += -I ./src/APP \
-I ./src/MSCP_CFG \
-I ./src/MSCP/Area\
-I ./src/MSCP/OFM\
-I ./src/MSCP/Arb
#LIBS += -L/path/to/my/lib/$(PLATFORM)/usr/lib -lmylib
#LIBS += -L../mylib/$(OUTPUT_DIR) -lmylib
+42 -25
View File
@@ -104,8 +104,11 @@ static void s_Area_GetCommStatus_byID(CM_UINT8 ID, CM_UINT32* SN, CM_UINT8* rcv_
static void s_Area_2oo2Sync_AfterStateRecv();
/**
* @brief 2取同步后,判断本周期是否收到请求,并进行回复组包发送
* @param ack_partner 是否需要向对系回复ACK
* @param ack_area_a 是否需要向另一地A系回复ACK
* @param ack_area_b 是否需要向另一地B系回复ACK
*/
static void s_Area_SendACK_After2oo2();
static void s_Area_SendACK_After2oo2(CM_BOOL ack_partner, CM_BOOL ack_area_a, CM_BOOL ack_area_b);
/**
* @brief 对接收到的仲裁应答进行2取同步
*/
@@ -256,10 +259,11 @@ static void s_Area_State_Req_Send_Process(void)
CM_Memset(&state_pack.Reserver[0], 0, AREA_ARB_RESERVER_LEN, AREA_ARB_RESERVER_LEN);
AREA_COMM_STATUS_PTR->LocalSN = DFM_GetBirthCount();
/**判断需要发送至哪一系 */
if(ENUM_AREA_UNKNOW == AREA_STATE_CTRL_PTR->StateArea.Local_state &&
if(MSCP_AREA_ID_A == AREA_BASIC_CFG_PTR->AreaID &&
ENUM_AREA_UNKNOW == AREA_STATE_CTRL_PTR->StateArea.Local_state &&
ENUM_2x2_MASTER == AREA_STATE_CTRL_PTR->State2x.LocalState)
{
/**未知地主系,刚上电,向其他三系发送请求 */
/**未知地主系(仅A地),刚上电,向其他三系发送请求 */
/**发送至本地另一系 */
state_pack.DstID = AREA_BASIC_CFG_PTR->Partner_BoardID;
tmp_len = Area_Arb_State_Pack(tmp_buf, sizeof(tmp_buf), &state_pack);
@@ -351,6 +355,12 @@ static void s_Area_State_Ack_Send_Process(void)
CM_UINT32 crc1 = 0u, crc2 = 0u;
CM_UINT32 timeStamp = 0u, timeNow = 0u;
CM_UINT8 srcID = 0u, dstID = 0u;
CM_UINT32 rcv_sn = 0u;
/**记录是否需要向某一系发送ACK */
CM_BOOL ack_flags[4] = {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
{
@@ -367,19 +377,21 @@ static void s_Area_State_Ack_Send_Process(void)
dstID = state_pack.DstID;
if(crc1 == state_pack.CRC1 && crc2 == state_pack.CRC2
&& 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)
{
/**CRC与目的ID校验通过*/
/**CRC与目的ID校验通过,并且SN最新*/
ack_flags[srcID] = CM_TRUE;
s_Area_SetCommStatus_byID(srcID, state_pack.SN, CM_TRUE);
Area_SetState_byID(srcID, state_pack.StateArea);
Area_Set2xState_byID(srcID, state_pack.State2x);
AreaArb_SetState_byID(srcID, state_pack.StateArea);
AreaArb_Set2xState_byID(srcID, state_pack.State2x);
}
}
} while (0u < rcv_len);
/**进行2取同步 */
s_Area_2oo2Sync_AfterStateRecv();
/**进行ACK回复 */
s_Area_SendACK_After2oo2();
s_Area_SendACK_After2oo2(ack_flags[partner_id],ack_flags[area_a_id], ack_flags[area_b_id]);
}
/**
* @brief 区域状态的应答ACK接收处理
@@ -415,8 +427,8 @@ static void s_Area_State_Ack_Recv_Process(void)
{
/**CRC与目的ID校验通过,并且是本周期接收到的回复(校时未完成时容忍一周期) */
s_Area_SetCommStatus_byID(srcID, state_pack.SN, CM_TRUE);
Area_SetState_byID(srcID, state_pack.StateArea);
Area_Set2xState_byID(srcID, state_pack.State2x);
AreaArb_SetState_byID(srcID, state_pack.StateArea);
AreaArb_Set2xState_byID(srcID, state_pack.State2x);
}
}
} while (0u < rcv_len);
@@ -441,7 +453,7 @@ static void s_Area_Arb_Send_Process(void)
{
STRU_AREA_WITH_ARB_PACK_T arb_pack = {0}, peer_pack = {0};
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;
CM_UINT32 tolerate_arb = 0u; /**仲裁请求容忍 */
/**请求帧帧基础信息组包 */
@@ -456,8 +468,8 @@ static void s_Area_Arb_Send_Process(void)
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);
/**获取对应状态的板卡ID */
CM_UINT8 id_sm = Area_GetID_byState(ENUM_AREA_SLAVE, ENUM_2x2_MASTER); /**备地主的板卡ID */
CM_UINT8 id_mm = Area_GetID_byState(ENUM_AREA_MASTER, ENUM_2x2_MASTER); /**主地主的板卡ID */
CM_UINT8 id_sm = AreaArb_GetID_byState(ENUM_AREA_SLAVE, ENUM_2x2_MASTER); /**备地主的板卡ID */
CM_UINT8 id_mm = AreaArb_GetID_byState(ENUM_AREA_MASTER, ENUM_2x2_MASTER); /**主地主的板卡ID */
/**获取通信中断标志 */
CM_UINT8 flag_comm_all_down = AREA_COMM_STATUS_PTR->Patner_RcvFlag | AREA_COMM_STATUS_PTR->Area_A_RcvFlag | AREA_COMM_STATUS_PTR->Area_B_RcvFlag;
/**重置仲裁请求发送标志 */
@@ -618,8 +630,8 @@ static void s_Area_State_Multi_Recv_Process(void)
ENUM_AREA_MSG_STATE_MULTI == multi_pack.MsgType)
{
s_Area_SetCommStatus_byID(multi_pack.SrcID, multi_pack.SN, CM_TRUE);
Area_SetState_byID(multi_pack.SrcID, multi_pack.StateArea);
Area_Set2xState_byID(multi_pack.SrcID, multi_pack.State2x);
AreaArb_SetState_byID(multi_pack.SrcID, multi_pack.StateArea);
AreaArb_Set2xState_byID(multi_pack.SrcID, multi_pack.State2x);
}
else
{
@@ -642,12 +654,19 @@ static void s_Area_Cycle_Init(void)
AREA_STATE_CTRL_PTR->State2x.Area_B_State = ENUM_2x2_SHUTDOWN;
/**从2乘线程获取地内的系状态 */
SFM_2x2_GetStateAfterStateChange(&(AREA_STATE_CTRL_PTR->State2x.LocalState), &(AREA_STATE_CTRL_PTR->State2x.PartnerState));
if(ENUM_2x2_OFFLINE == AREA_STATE_CTRL_PTR->State2x.LocalState &&
((ENUM_AREA_MASTER == AREA_STATE_CTRL_PTR->StateArea.Local_state) || (ENUM_AREA_SLAVE == AREA_STATE_CTRL_PTR->StateArea.Local_state)))
/**如果上周期与某一系通信中断,清空接收SN */
if(CM_FALSE == AREA_COMM_STATUS_PTR->Patner_RcvFlag)
{
/**2乘离线系,置自己为离线地 */
AREA_STATE_CTRL_PTR->StateArea.Local_state = ENUM_AREA_OFFLINE;
AREA_COMM_STATUS_PTR->PatnerSN = 0u;
}
if(CM_FALSE == AREA_COMM_STATUS_PTR->Area_A_RcvFlag)
{
AREA_COMM_STATUS_PTR->Area_A_SN = 0u;
}
if(CM_FALSE == AREA_COMM_STATUS_PTR->Area_B_RcvFlag)
{
AREA_COMM_STATUS_PTR->Area_B_SN = 0u;
}
/**每周期初始化接收标志 */
AREA_COMM_STATUS_PTR->Patner_RcvFlag = CM_FALSE;
AREA_COMM_STATUS_PTR->Area_A_RcvFlag = CM_FALSE;
@@ -691,7 +710,6 @@ 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)
{
CM_UINT32 sn = 0u;
if(ID == AREA_BASIC_CFG_PTR->BoardID)
{
if(NULL != sn)
@@ -741,7 +759,6 @@ static void s_Area_GetCommStatus_byID(CM_UINT8 ID, CM_UINT32* sn, CM_UINT8* rcv_
{
AREA_LOG_MSG("Cant Find ID:%d\n", ID);
}
return sn;
}
/**
* @brief 对接收到的区域状态请求进行2取同步
@@ -817,7 +834,7 @@ static void s_Area_2oo2Sync_AfterStateRecv()
/**
* @brief 2取同步后,判断本周期是否收到请求,并进行回复组包发送
*/
static void s_Area_SendACK_After2oo2()
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};
CM_UINT8 tmp_buf[1400] = {0};
@@ -832,7 +849,7 @@ static void s_Area_SendACK_After2oo2()
CM_Memset(&state_pack.Reserver[0], 0, AREA_ARB_RESERVER_LEN, AREA_ARB_RESERVER_LEN);
/**判断请求的接收情况 */
if(CM_TRUE == AREA_COMM_STATUS_PTR->Patner_RcvFlag)
if(CM_TRUE == AREA_COMM_STATUS_PTR->Patner_RcvFlag && CM_TRUE == ack_partner)
{
/**接收到了对系的请求,组包回复 */
state_pack.DstID = AREA_BASIC_CFG_PTR->Partner_BoardID;
@@ -842,7 +859,7 @@ static void s_Area_SendACK_After2oo2()
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));
}
if(CM_TRUE == AREA_COMM_STATUS_PTR->Area_A_RcvFlag)
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;
@@ -852,7 +869,7 @@ static void s_Area_SendACK_After2oo2()
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));
}
if(CM_TRUE == AREA_COMM_STATUS_PTR->Area_B_RcvFlag)
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;
+1 -1
View File
@@ -288,7 +288,7 @@ ENUM_CM_RETURN Area_State_Multi_Send(IN const CM_UINT8* pBuf, IN CM_INT32 BufLen
* - 1~0xFFFFFFFF 接收报文长度
* - 0 接收失败
*/
CM_INT32 Area_State_Recv(CM_UINT8* pBuf, IN CM_UINT32 BufSize, OUT CM_UINT32* timeRcv)
CM_INT32 Area_State_Multi_Recv(CM_UINT8* pBuf, IN CM_UINT32 BufSize, OUT CM_UINT32* timeRcv)
{
/*- 变量初始化 */
CM_UINT8 buf[65535] = {0};
+1 -1
View File
@@ -89,7 +89,7 @@ ENUM_CM_RETURN Area_State_Multi_Send(IN const CM_UINT8* pBuf, IN CM_INT32 BufLen
* - 1~0xFFFFFFFF 接收报文长度
* - 0 接收失败
*/
CM_INT32 Area_State_Recv(CM_UINT8* pBuf, IN CM_UINT32 BufSize, OUT CM_UINT32* timeRcv);
CM_INT32 Area_State_Multi_Recv(CM_UINT8* pBuf, IN CM_UINT32 BufSize, OUT CM_UINT32* timeRcv);
/**
* @brief 仲裁模式下所有的接收缓冲区
+22 -5
View File
@@ -4,7 +4,7 @@
/**
* @brief 通过ID获取对应板卡区域状态
*/
ENUM_AREA_STATE Area_GetState_byID(CM_UINT8 ID)
ENUM_AREA_STATE AreaArb_GetState_byID(CM_UINT8 ID)
{
ENUM_AREA_STATE state = ENUM_AREA_SHUTDOWN;
if(ID == AREA_BASIC_CFG_PTR->BoardID)
@@ -33,7 +33,7 @@ ENUM_AREA_STATE Area_GetState_byID(CM_UINT8 ID)
/**
* @brief 通过ID设置对应板卡区域状态
*/
void Area_SetState_byID(CM_UINT8 ID, ENUM_AREA_STATE state)
void AreaArb_SetState_byID(CM_UINT8 ID, ENUM_AREA_STATE state)
{
if(ID == AREA_BASIC_CFG_PTR->BoardID)
{
@@ -60,7 +60,7 @@ void Area_SetState_byID(CM_UINT8 ID, ENUM_AREA_STATE state)
/**
* @brief 通过ID获取对应板卡2x状态
*/
ENUM_2x2_STATE_T Area_Get2xState_byID(CM_UINT8 ID)
ENUM_2x2_STATE_T AreaArb_Get2xState_byID(CM_UINT8 ID)
{
ENUM_2x2_STATE_T state = ENUM_2x2_SHUTDOWN;
if(ID == AREA_BASIC_CFG_PTR->BoardID)
@@ -89,7 +89,7 @@ ENUM_2x2_STATE_T Area_Get2xState_byID(CM_UINT8 ID)
/**
* @brief 通过ID设置对应板卡2x状态
*/
void Area_Set2xState_byID(CM_UINT8 ID, ENUM_2x2_STATE_T state)
void AreaArb_Set2xState_byID(CM_UINT8 ID, ENUM_2x2_STATE_T state)
{
if(ID == AREA_BASIC_CFG_PTR->BoardID)
{
@@ -115,7 +115,7 @@ void Area_Set2xState_byID(CM_UINT8 ID, ENUM_2x2_STATE_T state)
/**
* @brief 通过状态获取某个板卡ID
*/
CM_UINT8 Area_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;
@@ -141,4 +141,21 @@ CM_UINT8 Area_GetID_byState(ENUM_AREA_STATE* state_area, ENUM_2x2_STATE_T* state
}
return boardID;
}
/**
* @brief 仲裁模式下使用,获取所有区域状态
*/
void AreaArb_Get_All_State(STR_Area_State *p_all_State)
{
if(NULL == p_all_State)
{
}
else
{
p_all_State->Local_state = AREA_STATE_CTRL_PTR->StateArea.Local_state;
p_all_State->Partner_state = AREA_STATE_CTRL_PTR->StateArea.Partner_state;
p_all_State->Partner_Area_A_state = AREA_STATE_CTRL_PTR->StateArea.Partner_Area_A_state;
p_all_State->Partner_Area_B_state = AREA_STATE_CTRL_PTR->StateArea.Partner_Area_B_state;
}
}
+15 -10
View File
@@ -4,29 +4,34 @@
#include "SFM_2x2.h"
/**
* @brief 通过ID获取对应板卡区域状态
* @brief 仲裁模式下使用,通过ID获取对应板卡区域状态
*/
ENUM_AREA_STATE Area_GetState_byID(CM_UINT8 ID);
ENUM_AREA_STATE AreaArb_GetState_byID(CM_UINT8 ID);
/**
* @brief 通过ID设置对应板卡区域状态
* @brief 仲裁模式下使用,通过ID设置对应板卡区域状态
*/
void Area_SetState_byID(CM_UINT8 ID, ENUM_AREA_STATE state);
void AreaArb_SetState_byID(CM_UINT8 ID, ENUM_AREA_STATE state);
/**
* @brief 通过ID获取对应板卡2x状态
* @brief 仲裁模式下使用,通过ID获取对应板卡2x状态
*/
ENUM_2x2_STATE_T Area_Get2xState_byID(CM_UINT8 ID);
ENUM_2x2_STATE_T AreaArb_Get2xState_byID(CM_UINT8 ID);
/**
* @brief 通过ID设置对应板卡2x状态
* @brief 仲裁模式下使用,通过ID设置对应板卡2x状态
*/
void Area_Set2xState_byID(CM_UINT8 ID, ENUM_2x2_STATE_T state);
void AreaArb_Set2xState_byID(CM_UINT8 ID, ENUM_2x2_STATE_T state);
/**
* @brief 通过状态获取某个板卡ID
* @brief 仲裁模式下使用,通过状态获取某个板卡ID
* @return 0表示无该板卡
*/
CM_UINT8 Area_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 仲裁模式下使用,获取所有区域状态
*/
void AreaArb_Get_All_State(STR_Area_State *p_all_State);
#endif
+83 -13
View File
@@ -1,4 +1,5 @@
#include "Arb_State_Vote.h"
#include "Arb_State.h"
/**仅在状态表决时使用,简化宏,只包含区域状态 */
#define VOTE_STATE_CTRL (&(AREA_STATE_CTRL_PTR->StateArea))
@@ -65,7 +66,7 @@ void s_Unknown_vote(void)
ENUM_AREA_STATE Area_A_State = VOTE_STATE_CTRL->Partner_Area_A_state;
ENUM_AREA_STATE Area_B_State = VOTE_STATE_CTRL->Partner_Area_B_state;
/**初始化未知地计数 */
static CM_UINT32 unkown_cnt = 0u;
static CM_UINT32 s_unkown_cnt = 0u;
/**状态转换部分 */
if(0x55u == AREA_ARB_CTRL_PTR->Arb_Ack)
{
@@ -96,25 +97,25 @@ void s_Unknown_vote(void)
VOTE_STATE_CTRL->Local_state = ENUM_AREA_OFFLINE;
}
else if((MSCP_AREA_ID_A == AREA_BASIC_CFG_PTR->AreaID)
&& (ENUM_AREA_UNKNOW == Area_A_State || ENUM_AREA_SHUTDOWN == Area_A_State || ENUM_AREA_OFFLINE == Area_A_State)
&& (ENUM_AREA_UNKNOW == Area_B_State || ENUM_AREA_SHUTDOWN == Area_B_State || ENUM_AREA_OFFLINE == Area_B_State))
&& (ENUM_AREA_UNKNOW == Area_A_State || ENUM_AREA_OFFLINE == Area_A_State)
&& (ENUM_AREA_UNKNOW == Area_B_State || ENUM_AREA_OFFLINE == Area_B_State))
{
/**另一地为未知地/离线地/宕机,本地是A地,维持10周期升主 */
unkown_cnt++;
if(unkown_cnt > MSCP_AREA_UNKNOW_COUNT_MAX)
/**另一地为未知地/离线地,本地是A地,维持10周期升主(另一地是宕机时等待仲裁回复) */
s_unkown_cnt++;
if(s_unkown_cnt > MSCP_AREA_UNKNOW_COUNT_MAX)
{
VOTE_STATE_CTRL->Local_state = ENUM_AREA_MASTER;
unkown_cnt = 0u;
s_unkown_cnt = 0u;
}
}
else
{
/**维持未知地 */
}
/**离开未知地,清空计数 */
if(ENUM_AREA_UNKNOW == VOTE_STATE_CTRL->Local_state)
{
unkown_cnt = 0u;
s_unkown_cnt = 0u;
}
}
/**
@@ -122,9 +123,34 @@ void s_Unknown_vote(void)
*/
void s_Offline_vote(void)
{
CM_BOOL Sync_Fail_Flag = AREA_FLAGS_CTRL_PTR->Sync_Fail_Flag;
CM_BOOL Sync_Health_Flag = AREA_FLAGS_CTRL_PTR->Sync_Health_Flag;
if()
CM_BOOL Sync_Health_Flag = AREA_FLAGS_CTRL_PTR->Sync_Health_Flag; /**同步成功标志 */
CM_UINT8 id_mm = AreaArb_GetID_byState(ENUM_AREA_MASTER, ENUM_2x2_MASTER); /**主地主的ID */
/**状态转换 */
if(CM_TRUE == Sync_Health_Flag)
{
/**同步成功 */
if(ENUM_AREA_MASTER == VOTE_STATE_CTRL->Partner_state)
{
/**主地在本地,升主地 */
VOTE_STATE_CTRL->Local_state = ENUM_AREA_MASTER;
}
else if(ENUM_AREA_MASTER == VOTE_STATE_CTRL->Partner_Area_A_state ||
ENUM_AREA_MASTER == VOTE_STATE_CTRL->Partner_Area_B_state)
{
/**主地在另一地,升备地 */
VOTE_STATE_CTRL->Local_state = ENUM_AREA_SLAVE;
}
else
{
}
}
else if(0u == id_mm && 0)
{
/**(预留)主地主ID不存在,认为主地主宕机,离线地降未知地 */
VOTE_STATE_CTRL->Local_state = ENUM_AREA_UNKNOW;
}
else
{
}
@@ -135,12 +161,56 @@ void s_Offline_vote(void)
*/
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)
{
/**双主宕机 */
CM_ASSERT(0, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_2, TSCP_DARK_ASSERT_1);
}
}
/**
* @brief 备地状态转换
*/
void s_Slave_vote(void)
{
static CM_UINT32 s_slave_cnt = 0u; /**备系降离线容忍计数 */
CM_UINT8 id_mm = AreaArb_GetID_byState(ENUM_AREA_MASTER, ENUM_2x2_MASTER); /**主地主的ID */
CM_BOOL Sync_Fail_Flag = AREA_FLAGS_CTRL_PTR->Sync_Fail_Flag; /**同步失败标志 */
if(0x55u == AREA_ARB_CTRL_PTR->Arb_Ack)
{
/**收到仲裁升主回复 */
VOTE_STATE_CTRL->Local_state = ENUM_AREA_MASTER;
}
else if(CM_FALSE == Sync_Fail_Flag)
{
/**同步失败 */
if(0u != id_mm)
{
/**主地主存活,降离线 */
VOTE_STATE_CTRL->Local_state = ENUM_AREA_OFFLINE;
}
else
{
/**主地主ID不存在,认为主地主宕机,容忍一周期降离线 */
s_slave_cnt++;
if(s_slave_cnt > MSCP_AREA_SLAVE_TOLERATE_COUNT)
{
s_slave_cnt = 0u;
VOTE_STATE_CTRL->Local_state = ENUM_AREA_OFFLINE;
}
}
}
else if(ENUM_AREA_MASTER == VOTE_STATE_CTRL->Partner_state)
{
/**对系是主地,升主地(备地主升主地主后,备地备通过这条逻辑升主地) */
VOTE_STATE_CTRL->Local_state = ENUM_AREA_MASTER;
}
else
{
}
/**离开备地,清空计数 */
if(ENUM_AREA_SLAVE != VOTE_STATE_CTRL->Local_state)
{
s_slave_cnt = 0u;
}
}
+4
View File
@@ -1,3 +1,5 @@
#ifndef AREA_NET_H_
#define AREA_NET_H_
#include "CM_Types.h"
#include "CFM_Net.h"
#include "CM_MQ.h"
@@ -36,4 +38,6 @@
void Area_LOG_MSG(IN const CM_CHAR *filename, IN CM_INT32 line, IN const CM_CHAR* fmt, ...);
#define AREA_LOG_MSG(fmt, ...) (Area_LOG_MSG(FILENAME(__FILE__),(CM_INT32)__LINE__,(fmt), ##__VA_ARGS__))
#endif
+1
View File
@@ -26,6 +26,7 @@
#define MSCP_AREA_B_BOARD_ID_B 0x04
#define MSCP_AREA_UNKNOW_COUNT_MAX 0x0au
#define MSCP_AREA_SLAVE_TOLERATE_COUNT (1u) /**< 备地降离线容忍次数 */
#define MSCP_MSG_BUF_MAX 1024u /**< 区域通信消息最大缓冲区大小 */
+6 -2
View File
@@ -446,7 +446,11 @@ static CM_THREAD_FUNC_T MSCP_CycBase(void)
/*TODO 发送2x状态起始信号量*/
SFM_2x2_Thread_PostStart();
/* 发送区域线程开始信号*/
Area_Start();
if(0x55 != g_PFM_Cfg.M_Arb_Enable)
{
Area_Start();
}
PFM_CFC_Check(24);
/*- 发起校时请求*/
CFM_SendLocalARQ();
@@ -629,7 +633,7 @@ static void SelfCheckInit(void)
{
#ifdef QNX
/*- 文件自检初始化 */
PFM_FileInit();
//PFM_FileInit();
/*- 内存自检初始化*/
PFM_MemCheck_Init();
/*- CPU自检初始化*/
+30 -3
View File
@@ -33,6 +33,7 @@
#include "CFM_Sync.h"
#include "stdarg.h"
#include "Area_state.h"
#include "Arb_State.h"
/*通信中断时间和同步超时时间可以相同,此时优先执行通信中断切系*/
@@ -1060,6 +1061,11 @@ static CM_THREAD_FUNC_T SFM_2x2_StateChange_Thread(void)
/*发送2x状态结束信号量*/
CM_Sem_Post(s_2x2_thread_Ctrl.m_Stop);
if(0x55u == g_PFM_Cfg.M_Arb_Enable)
{
Area_Arb_Start();
}
}
return NULL;
@@ -1160,7 +1166,15 @@ void SFM_4x2_ChangeState(void)
/*- 等待2x结束信号量*/
CM_Sem_Wait(s_2x2_thread_Ctrl.m_Stop);
/*- 等待Area结束信号量*/
Area_Wait_Stop();
if(0x55u == g_PFM_Cfg.M_Arb_Enable)
{
Area_Arb_Stop();
}
else
{
Area_Wait_Stop();
}
Area_LOG_Transition();
MSCP_LOG_MSG("SFM_4x2_ChangeState start\n");
/*- 执行最后的切系逻辑*/
@@ -1169,7 +1183,15 @@ void SFM_4x2_ChangeState(void)
s_2x2_Ctrl.MineExtendState = MSCP_Get_2X_VagueCom_State(&s_2x2_state_Ctrl.MineExtendOKCount[0]); /**< 本机串口通信状态,2oo2交换 */
s_2x2_Ctrl.PeerExtendState = MSCP_Get_2X_VagueCom_State(&s_2x2_state_Ctrl.PeerExtendOKCount[0]); /**< 邻机串口通信状态,2oo2交换 */
/**获取区域状态 */
Area_Get_All_State(&Area_State);
if(0x55u == g_PFM_Cfg.M_Arb_Enable)
{
AreaArb_Get_All_State(&Area_State);
}
else
{
Area_Get_All_State(&Area_State);
}
/*- 切系完成*/
if(ENUM_2x2_AIDSWITCH_OVER == s_2x2_state_Ctrl.LocalAIDSwitchState)
{
@@ -1252,13 +1274,14 @@ void SFM_4x2_ChangeState(void)
/**< 本系区域状态 */
s_2x2_state_Ctrl.LocalAreaState = Area_State.Local_state;
MSCP_LOG_MSG("s_2x2_state_Ctrl.LocalAreaState = %d 2x2 = %d\n",Area_State.Local_state, s_2x2_state_Ctrl.LocalState);
printf("AreaState = %d 2x2 = %d\n",Area_State.Local_state, s_2x2_state_Ctrl.LocalState);
/**<是否存在区域备地*/
s_2x2_state_Ctrl.Area_Slave_Is_Exist = Area_Slave_Is_Exist();
/*- 2x线程->更新主线程热备状态*/
s_2x2_Ctrl.LocalState = SFM_2x2_StateDecision(s_2x2_state_Ctrl.LocalAreaState,s_2x2_state_Ctrl.LocalState);
/* 判断3乘是离线则将地状态设置为离线,
* (通控健康度2乘、数据同步失败导致离线需要将地的状态拉下来) */
if ((ENUM_2x2_OFFLINE == s_2x2_state_Ctrl.LocalState) && ((ENUM_AREA_MASTER == s_2x2_state_Ctrl.LocalAreaState) || (ENUM_AREA_SLAVE == s_2x2_state_Ctrl.LocalAreaState)))
if ((0x55u != g_PFM_Cfg.M_Arb_Enable) && (ENUM_2x2_OFFLINE == s_2x2_state_Ctrl.LocalState) && ((ENUM_AREA_MASTER == s_2x2_state_Ctrl.LocalAreaState) || (ENUM_AREA_SLAVE == s_2x2_state_Ctrl.LocalAreaState)))
{
Area_Set_State(ENUM_AREA_OFFLINE);
MSCP_LOG_MSG("2x state is %d set area offline\n",s_2x2_state_Ctrl.LocalAreaState);
@@ -1550,6 +1573,10 @@ void SFM_2x2_Init(IN const CM_UINT8 *VitalBuf, IN CM_UINT16 VitalLen, INOUT CM_U
/*独立线程参数初始化*/
s_2x2_thread_Ctrl.number_Cyc = (g_PFM_Cfg.CYC_TIME - 60U) / MSCP_2X2_THREAD_TIME;/*根据周期计算,预留60ms*/
(s_2x2_thread_Ctrl.number_Cyc > 1u)?(s_2x2_thread_Ctrl.number_Cyc) : (s_2x2_thread_Ctrl.number_Cyc = 1u);
if(0x55u == g_PFM_Cfg.M_Arb_Enable && 2u < s_2x2_thread_Ctrl.number_Cyc)
{
s_2x2_thread_Ctrl.number_Cyc -= 2u;
}
CM_Sem_Init(&s_2x2_thread_Ctrl.m_Start);
CM_Sem_Init(&s_2x2_thread_Ctrl.m_Stop);