1.4线模式和仲裁模式的通用接口封装

2.离线系拉低主地/备地为离线地
3.修复仲裁IP配置错误
This commit is contained in:
lh
2026-08-27 14:46:23 +08:00
parent ca6366a59b
commit 2b9c6c8c83
11 changed files with 181 additions and 51 deletions
+15 -1
View File
@@ -524,7 +524,7 @@ static void s_Area_Arb_Send_Process(void)
tolerate_arb++;
}
}
else if(ENUM_AREA_UNKNOW == local_area_state && CM_FALSE == flag_comm_all_down)
else if(ENUM_AREA_UNKNOW == local_area_state && CM_FALSE == flag_comm_all_up)
{
/**未知地主系,与另一地通信持续中断10周期,发送仲裁请求 */
if(tolerate_arb >= 10u)
@@ -1093,3 +1093,17 @@ static void s_Area_DoubleCRC_Get(IN const CM_UINT8* buf, IN CM_UINT32 len,
*crc1 = local_crc[0];
*crc2 = local_crc[1];
}
/**
* @brief 获取另一地A系的ID
*/
CM_UINT8 AreaArb_GetArea_A_ID(void)
{
return AREA_BASIC_CFG_PTR->Partner_Area_A_BoardID;
}
/**
* @brief 获取另一地B系的ID
*/
CM_UINT8 AreaArb_GetArea_B_ID(void)
{
return AREA_BASIC_CFG_PTR->Partner_Area_B_BoardID;
}
+8 -1
View File
@@ -131,5 +131,12 @@ void AreaArb_SetCommStatus_byID(CM_UINT8 ID, CM_UINT32 sn, CM_BOOL rcv_flag);
* @brief 根据ID获取接收状态
*/
void AreaArb_GetCommStatus_byID(CM_UINT8 ID, CM_UINT32* SN, CM_BOOL* rcv_flag);
/**
* @brief 获取另一地A系的ID
*/
CM_UINT8 AreaArb_GetArea_A_ID(void);
/**
* @brief 获取另一地B系的ID
*/
CM_UINT8 AreaArb_GetArea_B_ID(void);
#endif
+1 -1
View File
@@ -509,7 +509,7 @@ static void s_Area_Arb_IP_Init(void)
g_PFM_Cfg.Partner_Area_A_Cfg.IP_4x2, g_PFM_Cfg.Partner_Area_B_Cfg.IP_4x2);
/*获取仲裁网络配置*/
rt = CM_Memcpy(ARB_COMM_CFG_PTR->IP_Local, 32, g_PFM_Cfg.Local_Cfg.IP_4x2,32);/**< 对地通信IP */
rt = CM_Memcpy(ARB_COMM_CFG_PTR->IP_Local, 32, g_PFM_Cfg.Local_Cfg.IP_Area,32);/**< 对地通信IP */
CM_ASSERT(ENUM_CM_TRUE == rt, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_2, TSCP_DARK_ASSERT_1);
rt = CM_Memcpy(ARB_COMM_CFG_PTR->IP_Arb, 32, g_PFM_Cfg.Arb_CFG.IP_Arb,32);/**< 对地通信IP */
+17
View File
@@ -169,3 +169,20 @@ void AreaArb_Get_All_State(STR_Area_State *p_all_State)
p_all_State->Partner_Area_B_state = AREA_STATE_CTRL_PTR->StateArea.Partner_Area_B_state;
}
}
/**
* @brief 判断是否存在备地
*/
CM_BOOL AreaArb_Slave_Is_Exist()
{
CM_BOOL rt = CM_FALSE;
if((ENUM_AREA_SLAVE == AREA_STATE_CTRL_PTR->StateArea.Local_state) || (ENUM_AREA_SLAVE == AREA_STATE_CTRL_PTR->StateArea.Partner_state)
|| (ENUM_AREA_SLAVE == AREA_STATE_CTRL_PTR->StateArea.Partner_Area_A_state) || (ENUM_AREA_SLAVE == AREA_STATE_CTRL_PTR->StateArea.Partner_Area_B_state))
{
rt = CM_TRUE;
}
else
{
}
return rt;
}
+4
View File
@@ -33,5 +33,9 @@ CM_UINT8 AreaArb_GetID_byState(ENUM_AREA_STATE state_area, ENUM_2x2_STATE_T stat
* @brief 仲裁模式下使用,获取所有区域状态
*/
void AreaArb_Get_All_State(STR_Area_State *p_all_State);
/**
* @brief 判断是否存在备地
*/
CM_BOOL AreaArb_Slave_Is_Exist();
#endif
+15 -23
View File
@@ -182,6 +182,8 @@ void s_Offline_vote(void)
*/
void s_Master_vote(void)
{
ENUM_2x2_STATE_T state2x = AREA_STATE_CTRL_PTR->State2x.LocalState;
if(ENUM_AREA_MASTER == VOTE_STATE_CTRL->Partner_Area_A_state || ENUM_AREA_MASTER == VOTE_STATE_CTRL->Partner_Area_B_state)
{
/**双主宕机 */
@@ -189,6 +191,16 @@ void s_Master_vote(void)
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);
}
else if(ENUM_2x2_OFFLINE == state2x)
{
/**与主地主同步失败 */
VOTE_STATE_CTRL->Local_state = ENUM_AREA_OFFLINE;
AREA_LOG_MSG("AREA_STATE_VOTE:Master>>>>>Offline, Sync failed\n");
}
else
{
}
}
/**
* @brief 备地状态转换
@@ -196,39 +208,24 @@ void s_Master_vote(void)
void s_Slave_vote(void)
{
CM_BOOL flag_comm_mm_status = CM_FALSE; /**与主地主的通信状态 */
static CM_UINT32 s_slave_cnt = 0u; /**备系降离线容忍计数 */
CM_UINT8 id_mm = AreaArb_GetID_byState(ENUM_AREA_MASTER, ENUM_2x2_MASTER); /**主地主的ID */
AreaArb_GetCommStatus_byID(id_mm, NULL, &flag_comm_mm_status);
CM_BOOL Sync_Fail_Flag = AREA_FLAGS_CTRL_PTR->Sync_Fail_Flag; /**同步失败标志 */
ENUM_2x2_STATE_T state2x = AREA_STATE_CTRL_PTR->State2x.LocalState;
if(0x55u == AREA_ARB_CTRL_PTR->Arb_Ack)
{
/**收到仲裁升主回复 */
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(ENUM_2x2_OFFLINE == state2x)
{
/**同步失败 */
if(CM_TRUE == flag_comm_mm_status)
{
/**主地主存活,降离线 */
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
{
/**与主地主通信中断,认为主地主宕机,容忍一周期降离线 */
s_slave_cnt++;
if(s_slave_cnt > MSCP_AREA_SLAVE_TOLERATE_COUNT)
{
s_slave_cnt = 0u;
VOTE_STATE_CTRL->Local_state = ENUM_AREA_OFFLINE;
AREA_LOG_MSG("AREA_STATE_VOTE:Slave>>>>>Offline, Sync failed and Master is lost\n");
}
}
}
else if(ENUM_AREA_MASTER == VOTE_STATE_CTRL->Partner_state)
{
/**对系是主地,升主地(备地主升主地主后,备地备通过这条逻辑升主地) */
@@ -239,9 +236,4 @@ void s_Slave_vote(void)
{
}
/**离开备地,清空计数 */
if(ENUM_AREA_SLAVE != VOTE_STATE_CTRL->Local_state)
{
s_slave_cnt = 0u;
}
}
+78
View File
@@ -0,0 +1,78 @@
#include "Area_Arb_Common.h"
/**
* @brief 执行初始化,4线与仲裁模式根据配置区分
*/
void Area_Arb_Common_Init(void)
{
if(0x55u == g_PFM_Cfg.M_Arb_Enable)
{
Area_With_Arb_Init();
}
else
{
Area_init();//区域初始化
}
}
/**
* @brief 获取所有板卡区域状态,4线与仲裁模式根据配置开关从不同结构体获取
*/
void Area_Arb_Common_Get_All_State(STR_Area_State *p_all_State)
{
if(0x55u == g_PFM_Cfg.M_Arb_Enable)
{
AreaArb_Get_All_State(p_all_State);
}
else
{
Area_Get_All_State(p_all_State);
}
}
/**
* @brief 获取另一地A系的ID
*/
CM_UINT32 Area_Arb_Common_GetArea_A_ID(void)
{
CM_UINT32 id = 0u;
if(0x55u == g_PFM_Cfg.M_Arb_Enable)
{
id = (CM_UINT32)AreaArb_GetArea_A_ID();
}
else
{
id = Area_GetArea_A_ID();
}
return id;
}
/**
* @brief 获取另一地B系的ID
*/
CM_UINT32 Area_Arb_Common_GetArea_B_ID(void)
{
CM_UINT32 id = 0u;
if(0x55u == g_PFM_Cfg.M_Arb_Enable)
{
id = (CM_UINT32)AreaArb_GetArea_B_ID();
}
else
{
id = Area_GetArea_B_ID();
}
return id;
}
/**
* @brief 判断是否存在备地
*/
CM_BOOL Area_Arb_Common_Slave_Is_Exist(void)
{
CM_BOOL rt = ENUM_CM_FALSE;
if(0x55u == g_PFM_Cfg.M_Arb_Enable)
{
rt = Area_Slave_Is_Exist();
}
else
{
rt = AreaArb_Slave_Is_Exist();
}
return rt;
}
+31
View File
@@ -0,0 +1,31 @@
#ifndef AREA_ARB_H_
#define AREA_ARB_H_
#include "Area.h"
#include "Arb.h"
#include "Arb_State.h"
/**
* 该文件为4线模式和仲裁模式的共用头文件,用于对其他模块的通用接口
*/
/**
* @brief 执行初始化,4线与仲裁模式根据配置区分
*/
void Area_Arb_Common_Init(void);
/**
* @brief 获取所有板卡区域状态,4线与仲裁模式根据配置开关从不同结构体获取
*/
void Area_Arb_Common_Get_All_State(STR_Area_State *p_all_State);
/**
* @brief 获取另一地A系的ID,执行初始化,4线与仲裁模式根据配置区分
*/
CM_UINT32 Area_Arb_Common_GetArea_A_ID(void);
/**
* @brief 获取另一地B系的ID,执行初始化,4线与仲裁模式根据配置区分
*/
CM_UINT32 Area_Arb_Common_GetArea_B_ID(void);
/**
* @brief 判断是否存在备地
*/
CM_BOOL Area_Arb_Common_Slave_Is_Exist(void);
#endif
-1
View File
@@ -26,7 +26,6 @@
#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 /**< 区域通信消息最大缓冲区大小 */
+3 -9
View File
@@ -41,6 +41,7 @@
#include "PFM_RemoteUpdate.h"
#include "CFM_Sync.h"
#include "Arb.h"
#include "Area_Arb_Common.h"
#if QNX
#include <sys/neutrino.h>
#include <sys/trace.h>
@@ -243,15 +244,8 @@ static void MSCP_Init(void)
PFM_LOG_SET_INIT_STAGE(ENUM_INIT_APP_CTRL);
PFM_LOG_SET_INIT_STAGE(ENUM_INIT_2X2USART);
CFM_TimeSync_Init(2);//时间同步初始化
if(0x55u == g_PFM_Cfg.M_Arb_Enable)
{
Area_With_Arb_Init();
}
else
{
Area_init();//区域初始化
}
/* 区域初始化*/
Area_Arb_Common_Init();
/*- 是否开启2oo2功能 */
if (0x55u == g_PFM_Cfg.M_2oo2_Enable)
+5 -11
View File
@@ -35,6 +35,7 @@
#include "Area_state.h"
#include "Arb_State.h"
#include "Arb.h"
#include "Area_Arb_Common.h"
/*通信中断时间和同步超时时间可以相同,此时优先执行通信中断切系*/
@@ -1183,14 +1184,7 @@ 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交换 */
/**获取区域状态 */
if(0x55u == g_PFM_Cfg.M_Arb_Enable)
{
AreaArb_Get_All_State(&Area_State);
}
else
{
Area_Get_All_State(&Area_State);
}
Area_Arb_Common_Get_All_State(&Area_State);
/*- 切系完成*/
if(ENUM_2x2_AIDSWITCH_OVER == s_2x2_state_Ctrl.LocalAIDSwitchState)
@@ -1276,7 +1270,7 @@ void SFM_4x2_ChangeState(void)
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();
s_2x2_state_Ctrl.Area_Slave_Is_Exist = Area_Arb_Common_Slave_Is_Exist();
/*- 2x线程->更新主线程热备状态*/
s_2x2_Ctrl.LocalState = SFM_2x2_StateDecision(s_2x2_state_Ctrl.LocalAreaState,s_2x2_state_Ctrl.LocalState);
/* 判断3乘是离线则将地状态设置为离线,
@@ -1417,12 +1411,12 @@ ENUM_4x2_STATE_T SFM_2x2_AreaDecision(ENUM_AREA_STATE PartnerAreaState,CM_BOOL i
if (isA == CM_TRUE)
{
// A系主备配对:0x01<->0x03
rtn_state = (masterHighByte == Area_GetArea_A_ID())? ENUM_4x2_MASTER : ENUM_4x2_SLAVE;
rtn_state = (masterHighByte == Area_Arb_Common_GetArea_A_ID())? ENUM_4x2_MASTER : ENUM_4x2_SLAVE;
}
else
{
// B系主备配对:0x02<->0x04
rtn_state = (masterHighByte == Area_GetArea_B_ID())? ENUM_4x2_MASTER : ENUM_4x2_SLAVE;
rtn_state = (masterHighByte == Area_Arb_Common_GetArea_B_ID())? ENUM_4x2_MASTER : ENUM_4x2_SLAVE;
}
break;
default: