diff --git a/TSCP/src/MSCP/CFM/CFM_Net.c b/TSCP/src/MSCP/CFM/CFM_Net.c index 2f3d6bb..84d073b 100644 --- a/TSCP/src/MSCP/CFM/CFM_Net.c +++ b/TSCP/src/MSCP/CFM/CFM_Net.c @@ -36,6 +36,7 @@ #include "MSCP_APP_Interface.h" #include "PFM_RemoteUpdate.h" #include "MSCP_Define.h" +#include "CFM_Raw.h" #include #define CFM_2oo2_MSG_NUM_MAX (200u) @@ -58,6 +59,18 @@ /*日志攒包发送 攒包大小*/ #define LOG_MAX (5120u) +/* 心跳在周期结束前30ms执行发送 */ +#define CFM_HEART_WAITE (30u) + +/* 心跳发送线程控制结构体 */ +typedef struct +{ + CM_SEM_T m_Start; /* 心跳线程开始信号量 */ + CM_SEM_T m_Stop; /* 心跳线程结束信号量 */ +} STRU_CFM_HEART_CTRL_T; + +static STRU_CFM_HEART_CTRL_T s_CFM_HeartCtrl; + /** 接收线程控制 */ typedef struct { @@ -351,6 +364,8 @@ static CM_THREAD_FUNC_T t_TimeThread_Area(IN CM_Thread_Arg_Struct_T* arg); static CM_THREAD_FUNC_T t_RemoteUpdateThread(IN CM_Thread_Arg_Struct_T* arg); static CM_THREAD_FUNC_T t_ClearArpThread(void); +/* 单独的心跳发送线程 */ +static CM_THREAD_FUNC_T t_OutNetHeartSendThread(IN CM_Thread_Arg_Struct_T* arg); /* 2取使用socket的初始化*/ @@ -2664,7 +2679,14 @@ static void s_NetInit_Outnet(void) } rtCheck = CM_Thread_Create((CM_THREAD_T*) NULL, (CM_THREAD_FUNC_T) t_ClearArpThread,"Clear_Arp", 0, CM_TASK_PRIORITY_94, NULL); - CM_RE_ASSERT(CM_TRUE == rtCheck, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_4, TSCP_DARK_ASSERT_13); + CM_ASSERT(CM_TRUE == rtCheck, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_4, TSCP_DARK_ASSERT_13); + + rt = CM_Sem_Init(&s_CFM_HeartCtrl.m_Start); + CM_ASSERT(ENUM_CM_TRUE == rt, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_4, TSCP_DARK_ASSERT_14); + rt = CM_Sem_Init(&s_CFM_HeartCtrl.m_Stop); + CM_ASSERT(ENUM_CM_TRUE == rt, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_4, TSCP_DARK_ASSERT_15); + rtCheck = CM_Thread_Create((CM_THREAD_T*) NULL, (CM_THREAD_FUNC_T) t_OutNetHeartSendThread,"heart_send", 0, CM_TASK_PRIORITY_82, (CM_Thread_Arg_Struct_T*)&s_CFM_HeartCtrl); + CM_ASSERT(CM_TRUE == rtCheck, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_4, TSCP_DARK_ASSERT_16); CM_Sleep(100u);/* 延时等待线程启动 */ } @@ -4767,7 +4789,36 @@ void CFM_AssertRecved(void) assertMsgNum = CM_MQ_Get_Msg_Num(&s_CFM_Rx2oo2_Assert.MsgQ); CM_ASSERT((0u == assertMsgNum),NET_MODE,DARK_FAULT_CODE_FUN_ORDER_41,TSCP_DARK_ASSERT_1); } +/** + * @brief 发送心跳线程的启动信号量,需要在平台周期开始时发送 + */ +void CFM_Heart_Thread_PostStart(void) +{ + (void)CM_Sem_Post(s_CFM_HeartCtrl.m_Start); +} +/* 单独的心跳发送线程 */ +static CM_THREAD_FUNC_T t_OutNetHeartSendThread(IN CM_Thread_Arg_Struct_T* arg) +{ + STRU_CFM_HEART_CTRL_T *pCtrl = (STRU_CFM_HEART_CTRL_T*)arg; + CM_UINT32 cyc_time = g_PFM_Cfg.CYC_TIME; + ENUM_2x2_STATE_T state_2x2 = ENUM_2x2_SHUTDOWN; +#if QNX + void* pmask = NULL; + /*- 本线程锁定在 A53 core 1 */ + pmask = (void*)(0x01u|0x02u); + (void)ThreadCtl(_NTO_TCTL_RUNMASK, pmask); +#endif + while(1) + { + CM_Sem_Wait(pCtrl->m_Start); + state_2x2 = SFM_2x2_GetLocal2x2State(); + CM_Sleep(cyc_time - CFM_HEART_WAITE); + /*- 发送主线程热备状态的外网心跳*/ + (void)CFM_TxOutnetHeart(state_2x2); + } + return NULL; +} /* MAC层:14字节 dst MAC [6] src MAC [6] type [2] diff --git a/TSCP/src/MSCP/CFM/CFM_Net.h b/TSCP/src/MSCP/CFM/CFM_Net.h index de93934..879e7f1 100644 --- a/TSCP/src/MSCP/CFM/CFM_Net.h +++ b/TSCP/src/MSCP/CFM/CFM_Net.h @@ -759,6 +759,10 @@ extern "C" * @brief 判断收到宕机后的2取,立即执行宕机操作 */ void CFM_AssertRecved(void); + /** + * @brief 发送心跳线程的启动信号量,需要在平台周期开始时发送 + */ + void CFM_Heart_Thread_PostStart(void); #ifdef __cplusplus } #endif diff --git a/TSCP/src/MSCP/MSCP_main.c b/TSCP/src/MSCP/MSCP_main.c index 09ea599..b58a126 100644 --- a/TSCP/src/MSCP/MSCP_main.c +++ b/TSCP/src/MSCP/MSCP_main.c @@ -478,6 +478,8 @@ static CM_THREAD_FUNC_T MSCP_CycBase(void) /*TODO 发送2x状态起始信号量*/ SFM_2x2_Thread_PostStart(); SFM_AREA_Thread_PostStart(); + /* 发送心跳线程起始信号量 */ + CFM_Heart_Thread_PostStart(); PFM_CFC_Check(24); /*- @alias 2oo2周期校时 */ if (0x55u == g_PFM_Cfg.M_2oo2_Enable) diff --git a/TSCP/src/MSCP/PFM/PFM_InputOutput.c b/TSCP/src/MSCP/PFM/PFM_InputOutput.c index 2c32b9b..7d1f057 100644 --- a/TSCP/src/MSCP/PFM/PFM_InputOutput.c +++ b/TSCP/src/MSCP/PFM/PFM_InputOutput.c @@ -465,7 +465,6 @@ void PFM_BufSwich(void) s_OutnetHeart_Mine_AppReadIndex = 0; s_OutnetHeart_Peer_AppReadIndex = 0; } - /** * @brief 输入微周期处理 * @details @@ -481,7 +480,6 @@ void PFM_InputProc(void) /*- 变量初始化 */ CM_INT32 i = 0; ENUM_2x2_STATE_T p_state_2x2 = ENUM_2x2_SHUTDOWN; /* 对系热备状态 */ - ENUM_2x2_STATE_T localstate = SFM_2x2_GetLocal2x2State(); /* 本机2x2状态 */ /************************平台数据接收*************************/ /*- 外网安全数据接收 */ @@ -517,8 +515,6 @@ void PFM_InputProc(void) } PFM_CFC_Check(30); - /*- 发送主线程热备状态的外网心跳*/ - (void)CFM_TxOutnetHeart(localstate); PFM_CFC_Check(31); /*预留*/ /*************************本地输入数据2oo2交换和比较*************************/ MSCP_LOG_MSG("timecurr 1 Input Recv = %lld us\n", NOW_USED_TIME);