修改心跳发送时机,单独线程,等待周期结束前30ms时发送心跳
This commit is contained in:
@@ -36,6 +36,7 @@
|
|||||||
#include "MSCP_APP_Interface.h"
|
#include "MSCP_APP_Interface.h"
|
||||||
#include "PFM_RemoteUpdate.h"
|
#include "PFM_RemoteUpdate.h"
|
||||||
#include "MSCP_Define.h"
|
#include "MSCP_Define.h"
|
||||||
|
#include "CFM_Raw.h"
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
|
|
||||||
#define CFM_2oo2_MSG_NUM_MAX (200u)
|
#define CFM_2oo2_MSG_NUM_MAX (200u)
|
||||||
@@ -58,6 +59,18 @@
|
|||||||
/*日志攒包发送 攒包大小*/
|
/*日志攒包发送 攒包大小*/
|
||||||
#define LOG_MAX (5120u)
|
#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
|
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_RemoteUpdateThread(IN CM_Thread_Arg_Struct_T* arg);
|
||||||
|
|
||||||
static CM_THREAD_FUNC_T t_ClearArpThread(void);
|
static CM_THREAD_FUNC_T t_ClearArpThread(void);
|
||||||
|
/* 单独的心跳发送线程 */
|
||||||
|
static CM_THREAD_FUNC_T t_OutNetHeartSendThread(IN CM_Thread_Arg_Struct_T* arg);
|
||||||
|
|
||||||
|
|
||||||
/* 2取使用socket的初始化*/
|
/* 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);
|
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_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);/* 延时等待线程启动 */
|
CM_Sleep(100u);/* 延时等待线程启动 */
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3323,8 +3345,6 @@ void CFM_NetworkCard_Init(void)
|
|||||||
* 创建本线程之前应先配置好STRU_CFM_RECV_CTRL,包括创建阻塞通信的socket
|
* 创建本线程之前应先配置好STRU_CFM_RECV_CTRL,包括创建阻塞通信的socket
|
||||||
* 本线程将以阻塞方式接收UDP报文并写入线程接收队列
|
* 本线程将以阻塞方式接收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)
|
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_CM_TRUE == rt)
|
||||||
{
|
{
|
||||||
/*成功无操作*/
|
/*成功无操作*/
|
||||||
if(ENUM_THREAD_OutnetS_Rx == pCtrl->threadNumBer)
|
|
||||||
{
|
|
||||||
test_stop_tick = CM_GetTick();
|
|
||||||
test_recv_len += len;
|
|
||||||
test_recv_num++;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -4775,7 +4789,36 @@ void CFM_AssertRecved(void)
|
|||||||
assertMsgNum = CM_MQ_Get_Msg_Num(&s_CFM_Rx2oo2_Assert.MsgQ);
|
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);
|
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字节
|
MAC层:14字节
|
||||||
dst MAC [6] src MAC [6] type [2]
|
dst MAC [6] src MAC [6] type [2]
|
||||||
|
|||||||
@@ -759,6 +759,10 @@ extern "C"
|
|||||||
* @brief 判断收到宕机后的2取,立即执行宕机操作
|
* @brief 判断收到宕机后的2取,立即执行宕机操作
|
||||||
*/
|
*/
|
||||||
void CFM_AssertRecved(void);
|
void CFM_AssertRecved(void);
|
||||||
|
/**
|
||||||
|
* @brief 发送心跳线程的启动信号量,需要在平台周期开始时发送
|
||||||
|
*/
|
||||||
|
void CFM_Heart_Thread_PostStart(void);
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -478,6 +478,8 @@ static CM_THREAD_FUNC_T MSCP_CycBase(void)
|
|||||||
/*TODO 发送2x状态起始信号量*/
|
/*TODO 发送2x状态起始信号量*/
|
||||||
SFM_2x2_Thread_PostStart();
|
SFM_2x2_Thread_PostStart();
|
||||||
SFM_AREA_Thread_PostStart();
|
SFM_AREA_Thread_PostStart();
|
||||||
|
/* 发送心跳线程起始信号量 */
|
||||||
|
CFM_Heart_Thread_PostStart();
|
||||||
PFM_CFC_Check(24);
|
PFM_CFC_Check(24);
|
||||||
/*- @alias 2oo2周期校时 */
|
/*- @alias 2oo2周期校时 */
|
||||||
if (0x55u == g_PFM_Cfg.M_2oo2_Enable)
|
if (0x55u == g_PFM_Cfg.M_2oo2_Enable)
|
||||||
@@ -692,7 +694,7 @@ static void SelfCheckInit(void)
|
|||||||
{
|
{
|
||||||
#ifdef QNX
|
#ifdef QNX
|
||||||
/*- 文件自检初始化 */
|
/*- 文件自检初始化 */
|
||||||
//PFM_FileInit();
|
PFM_FileInit();
|
||||||
/*- 内存自检初始化*/
|
/*- 内存自检初始化*/
|
||||||
PFM_MemCheck_Init();
|
PFM_MemCheck_Init();
|
||||||
/*- CPU自检初始化*/
|
/*- CPU自检初始化*/
|
||||||
|
|||||||
@@ -465,8 +465,6 @@ void PFM_BufSwich(void)
|
|||||||
s_OutnetHeart_Mine_AppReadIndex = 0;
|
s_OutnetHeart_Mine_AppReadIndex = 0;
|
||||||
s_OutnetHeart_Peer_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 输入微周期处理
|
* @brief 输入微周期处理
|
||||||
* @details
|
* @details
|
||||||
@@ -482,13 +480,11 @@ void PFM_InputProc(void)
|
|||||||
/*- 变量初始化 */
|
/*- 变量初始化 */
|
||||||
CM_INT32 i = 0;
|
CM_INT32 i = 0;
|
||||||
ENUM_2x2_STATE_T p_state_2x2 = ENUM_2x2_SHUTDOWN; /* 对系热备状态 */
|
ENUM_2x2_STATE_T p_state_2x2 = ENUM_2x2_SHUTDOWN; /* 对系热备状态 */
|
||||||
ENUM_2x2_STATE_T localstate = SFM_2x2_GetLocal2x2State(); /* 本机2x2状态 */
|
|
||||||
|
|
||||||
/************************平台数据接收*************************/
|
/************************平台数据接收*************************/
|
||||||
/*- 外网安全数据接收 */
|
/*- 外网安全数据接收 */
|
||||||
PFM_CFC_Check(26);
|
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);
|
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);
|
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)
|
if((CM_UINT32)0x55u == g_PFM_Cfg.M_OutnetRaw_Enable)
|
||||||
@@ -519,12 +515,6 @@ void PFM_InputProc(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
PFM_CFC_Check(30);
|
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); /*预留*/
|
PFM_CFC_Check(31); /*预留*/
|
||||||
/*************************本地输入数据2oo2交换和比较*************************/
|
/*************************本地输入数据2oo2交换和比较*************************/
|
||||||
MSCP_LOG_MSG("timecurr 1 Input Recv = %lld us\n", NOW_USED_TIME);
|
MSCP_LOG_MSG("timecurr 1 Input Recv = %lld us\n", NOW_USED_TIME);
|
||||||
|
|||||||
Reference in New Issue
Block a user