diff --git a/TSCP/src/MSCP/CFM/CFM_Net.c b/TSCP/src/MSCP/CFM/CFM_Net.c index ea3fc26..b9b90d7 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的初始化*/ @@ -2666,6 +2681,13 @@ 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); + rt = CM_Sem_Init(&s_CFM_HeartCtrl.m_Start); + CM_RE_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_RE_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_RE_ASSERT(CM_TRUE == rtCheck, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_4, TSCP_DARK_ASSERT_16); + CM_Sleep(100u);/* 延时等待线程启动 */ } @@ -3323,8 +3345,6 @@ void CFM_NetworkCard_Init(void) * 创建本线程之前应先配置好STRU_CFM_RECV_CTRL,包括创建阻塞通信的socket * 本线程将以阻塞方式接收UDP报文并写入线程接收队列 */ -extern CM_UINT64 test_stop_tick; -extern CM_UINT32 test_recv_len, test_recv_num; static CM_THREAD_FUNC_T t_UdpRecvThread(IN CM_Thread_Arg_Struct_T* arg) { /*- 变量初始化 */ @@ -3381,12 +3401,6 @@ static CM_THREAD_FUNC_T t_UdpRecvThread(IN CM_Thread_Arg_Struct_T* arg) if (ENUM_CM_TRUE == rt) { /*成功无操作*/ - if(ENUM_THREAD_OutnetS_Rx == pCtrl->threadNumBer) - { - test_stop_tick = CM_GetTick(); - test_recv_len += len; - test_recv_num++; - } } else { @@ -4775,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 - 30u); + /*- 发送主线程热备状态的外网心跳*/ + (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 def9a60..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) @@ -692,7 +694,7 @@ static void SelfCheckInit(void) { #ifdef QNX /*- 文件自检初始化 */ - //PFM_FileInit(); + PFM_FileInit(); /*- 内存自检初始化*/ PFM_MemCheck_Init(); /*- CPU自检初始化*/ diff --git a/TSCP/src/MSCP/PFM/PFM_InputOutput.c b/TSCP/src/MSCP/PFM/PFM_InputOutput.c index 131bd32..7d1f057 100644 --- a/TSCP/src/MSCP/PFM/PFM_InputOutput.c +++ b/TSCP/src/MSCP/PFM/PFM_InputOutput.c @@ -465,8 +465,6 @@ void PFM_BufSwich(void) s_OutnetHeart_Mine_AppReadIndex = 0; s_OutnetHeart_Peer_AppReadIndex = 0; } -CM_UINT64 test_start_tick = 0u, test_stop_tick = 0u; -CM_UINT32 test_recv_len = 0u, test_recv_num = 0u; /** * @brief 输入微周期处理 * @details @@ -482,13 +480,11 @@ 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状态 */ /************************平台数据接收*************************/ /*- 外网安全数据接收 */ PFM_CFC_Check(26); g_2x2oo2_rx[g_2x2oo2_base][s_2x2oo2_OutnetSafe].mine_len = (CM_UINT32)SFM_RxOutnetSafe(g_2x2oo2_rx[g_2x2oo2_base][s_2x2oo2_OutnetSafe].p_mine_buf, (CM_UINT32)g_2x2oo2_rx[g_2x2oo2_base][s_2x2oo2_OutnetSafe].buf_size); - MSCP_LOG_MSG("TEST:CYC = %d, Recv Num %d Len %d USED %llums\n",g_MSCP_SysCount, test_recv_num, test_recv_len, (test_stop_tick - test_start_tick) / CM_UNSIGNED_MILLION); MSCP_LOG_MSG("g_2x2oo2_rx[g_2x2oo2_base][s_2x2oo2_OutnetSafe].mine_len = %d\n",g_2x2oo2_rx[g_2x2oo2_base][s_2x2oo2_OutnetSafe].mine_len); /*判断外网透传使能开关*/ if((CM_UINT32)0x55u == g_PFM_Cfg.M_OutnetRaw_Enable) @@ -519,12 +515,6 @@ void PFM_InputProc(void) } PFM_CFC_Check(30); - /*- 发送主线程热备状态的外网心跳*/ - test_start_tick = CM_GetTick(); - test_stop_tick = test_start_tick; - test_recv_len = 0u; - test_recv_num = 0u; - (void)CFM_TxOutnetHeart(localstate); PFM_CFC_Check(31); /*预留*/ /*************************本地输入数据2oo2交换和比较*************************/ MSCP_LOG_MSG("timecurr 1 Input Recv = %lld us\n", NOW_USED_TIME);