From 2d49b7206a62ebabc09f1eb156ad63b470319d98 Mon Sep 17 00:00:00 2001 From: lh <3191213465@qq.com> Date: Tue, 9 Jun 2026 15:34:28 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E6=8F=90=E4=BA=A4=EF=BC=8C=E5=AD=98=E5=9C=A8=E9=97=AE=E9=A2=98?= =?UTF-8?q?=EF=BC=8C=E5=8F=8C=E7=B3=BB=E5=8F=91=E5=BF=83=E8=B7=B3=E5=8F=AF?= =?UTF-8?q?=E8=83=BD=E4=B8=8D=E5=90=8C=E6=AD=A5=EF=BC=8C=E5=8F=AF=E8=83=BD?= =?UTF-8?q?=E5=87=BA=E7=8E=B0=E5=A6=82=E5=A4=87=E7=B3=BB=E6=9C=AC=E5=91=A8?= =?UTF-8?q?=E6=9C=9F=E5=85=88=E5=8F=91=E4=BA=86=E5=BF=83=E8=B7=B3=EF=BC=8C?= =?UTF-8?q?=E8=BF=99=E6=97=B6=E9=80=9A=E6=8E=A7=E5=BC=80=E5=A7=8B=E5=9B=9E?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=EF=BC=8C=E4=B8=BB=E7=B3=BB=E6=9C=AC=E5=91=A8?= =?UTF-8?q?=E6=9C=9F=E5=8F=AF=E8=83=BD=E4=BC=9A=E6=8E=A5=E6=94=B6=E5=88=B0?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=EF=BC=8C=E7=84=B6=E5=90=8E=E6=9B=B4=E6=96=B0?= =?UTF-8?q?stoptick=EF=BC=8C=E4=BD=86starttick=E5=9C=A8=E5=8F=91=E5=BF=83?= =?UTF-8?q?=E8=B7=B3=E6=89=8D=E6=9B=B4=E6=96=B0=EF=BC=8C=E5=AF=BC=E8=87=B4?= =?UTF-8?q?=E8=80=97=E6=97=B6=E7=BB=93=E6=9E=9C=E5=81=8F=E5=B7=AE=EF=BC=8C?= =?UTF-8?q?=E5=8D=95=E8=B5=B7=E4=B8=80=E7=B3=BB=E6=B5=8B=E8=AF=95=E6=9C=80?= =?UTF-8?q?=E5=A5=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TSCP/src/MSCP/CFM/CFM_Net.c | 8 ++++++++ TSCP/src/MSCP/MSCP_main.c | 2 +- TSCP/src/MSCP/PFM/PFM_InputOutput.c | 8 +++++++- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/TSCP/src/MSCP/CFM/CFM_Net.c b/TSCP/src/MSCP/CFM/CFM_Net.c index 2f3d6bb..ea3fc26 100644 --- a/TSCP/src/MSCP/CFM/CFM_Net.c +++ b/TSCP/src/MSCP/CFM/CFM_Net.c @@ -3323,6 +3323,8 @@ 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) { /*- 变量初始化 */ @@ -3379,6 +3381,12 @@ 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 { diff --git a/TSCP/src/MSCP/MSCP_main.c b/TSCP/src/MSCP/MSCP_main.c index 09ea599..def9a60 100644 --- a/TSCP/src/MSCP/MSCP_main.c +++ b/TSCP/src/MSCP/MSCP_main.c @@ -692,7 +692,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 2c32b9b..131bd32 100644 --- a/TSCP/src/MSCP/PFM/PFM_InputOutput.c +++ b/TSCP/src/MSCP/PFM/PFM_InputOutput.c @@ -465,7 +465,8 @@ 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 @@ -487,6 +488,7 @@ void PFM_InputProc(void) /*- 外网安全数据接收 */ 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) @@ -518,6 +520,10 @@ 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交换和比较*************************/ From e14c880a887c3de02d0160c8e7b7e3e641cffd06 Mon Sep 17 00:00:00 2001 From: lh <3191213465@qq.com> Date: Wed, 10 Jun 2026 15:27:07 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=BF=83=E8=B7=B3?= =?UTF-8?q?=E5=8F=91=E9=80=81=E6=97=B6=E6=9C=BA=EF=BC=8C=E5=8D=95=E7=8B=AC?= =?UTF-8?q?=E7=BA=BF=E7=A8=8B=EF=BC=8C=E7=AD=89=E5=BE=85=E5=91=A8=E6=9C=9F?= =?UTF-8?q?=E7=BB=93=E6=9D=9F=E5=89=8D30ms=E6=97=B6=E5=8F=91=E9=80=81?= =?UTF-8?q?=E5=BF=83=E8=B7=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TSCP/src/MSCP/CFM/CFM_Net.c | 59 +++++++++++++++++++++++++---- TSCP/src/MSCP/CFM/CFM_Net.h | 4 ++ TSCP/src/MSCP/MSCP_main.c | 4 +- TSCP/src/MSCP/PFM/PFM_InputOutput.c | 10 ----- 4 files changed, 58 insertions(+), 19 deletions(-) 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); From a803ab421f849357c20599388e926d11a3b34fc8 Mon Sep 17 00:00:00 2001 From: lh <3191213465@qq.com> Date: Wed, 10 Jun 2026 15:31:27 +0800 Subject: [PATCH 3/4] =?UTF-8?q?30ms=E4=BD=BF=E7=94=A8=E5=AE=8F=E5=AE=9A?= =?UTF-8?q?=E4=B9=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TSCP/src/MSCP/CFM/CFM_Net.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TSCP/src/MSCP/CFM/CFM_Net.c b/TSCP/src/MSCP/CFM/CFM_Net.c index b9b90d7..41bb259 100644 --- a/TSCP/src/MSCP/CFM/CFM_Net.c +++ b/TSCP/src/MSCP/CFM/CFM_Net.c @@ -4812,7 +4812,7 @@ static CM_THREAD_FUNC_T t_OutNetHeartSendThread(IN CM_Thread_Arg_Struct_T* arg) { CM_Sem_Wait(pCtrl->m_Start); state_2x2 = SFM_2x2_GetLocal2x2State(); - CM_Sleep(cyc_time - 30u); + CM_Sleep(cyc_time - CFM_HEART_WAITE); /*- 发送主线程热备状态的外网心跳*/ (void)CFM_TxOutnetHeart(state_2x2); } From f16a7c94b2214bdf55f2af39574993242f073232 Mon Sep 17 00:00:00 2001 From: lh <3191213465@qq.com> Date: Thu, 11 Jun 2026 15:41:22 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=95=85=E9=9A=9C?= =?UTF-8?q?=E5=AE=95=E6=9C=BA=E4=B8=8D=E5=8F=AF=E8=87=AA=E5=8A=A8=E9=87=8D?= =?UTF-8?q?=E5=90=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TSCP/src/MSCP/CFM/CFM_Net.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/TSCP/src/MSCP/CFM/CFM_Net.c b/TSCP/src/MSCP/CFM/CFM_Net.c index 41bb259..84d073b 100644 --- a/TSCP/src/MSCP/CFM/CFM_Net.c +++ b/TSCP/src/MSCP/CFM/CFM_Net.c @@ -2679,14 +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_RE_ASSERT(ENUM_CM_TRUE == rt, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_4, TSCP_DARK_ASSERT_14); + 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_RE_ASSERT(ENUM_CM_TRUE == rt, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_4, TSCP_DARK_ASSERT_15); + 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_RE_ASSERT(CM_TRUE == rtCheck, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_4, TSCP_DARK_ASSERT_16); + CM_ASSERT(CM_TRUE == rtCheck, NET_MODE, DARK_FAULT_CODE_FUN_ORDER_4, TSCP_DARK_ASSERT_16); CM_Sleep(100u);/* 延时等待线程启动 */ }