/*************************************************************** Copyright © huijue Network Co., Ltd. 1998-2129. All rights reserved. Copyright © 上海汇珏网络通信设备股份有限公司 1998-2129. All rights reserved. 文件名 : SystemTimeFunc.c 作者 : kooloo 版本 : V1.0 描述 : 动环监控/边缘网关FSU 进程是否运行判断 kooloo add 202310 硬件平台 : iMX6ULL 内核版本 : linux-imx-4.1.15-2.1.0-g3dc0a4b-v2.7 编译器版本 :gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf 日志 : 初版V1.0 2023/7/15 kooloo创建 ***************************************************************/ #define _GNU_SOURCE //在源文件开头定义_GNU_SOURCE宏 加此宏则不会有错误 kooloo add 202401 #include #include #include //signal() #include #include #include #include //struct itimerval, setitimer() #include "public.h" //公共函数头文件 #include "mslog.h" #include "SystemTimeFunc.h" /*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ** 函数名称: TimerTicks_sig_handler ** 功能描述: 滴答时钟 SIGALRM信号 ** 参数描述:无 ** 日  期: 2023年9月02日 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/ static void TimerTicks_sig_handler(int sig) { SystemTicktimer_isr(); } /*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ** 函数名称: Systemtimer_Iint ** 功能描述: 滴答时钟初始化 ** 参数描述:无 ** 日  期: 2023年9月02日 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/ void Systemtimer_Iint(void) { struct sigaction sig = { 0 }; struct itimerval tick; pSysPara->g_SystemTicksCounter = 0; //起始设置为0,不需要回滚时间所以设置为0 kooloo add 202311 /* 为 SIGALRM 信号绑定处理函数 */ sig.sa_handler = TimerTicks_sig_handler; sig.sa_flags = 0; if (-1 == sigaction(SIGALRM, &sig, NULL)) { ms_error1("sigaction error!\n"); exit(-1); } //间隔定时器 //Timeout to run first time tick.it_value.tv_sec = C_SYSTEMTIME_COUNTER_BASE; tick.it_value.tv_usec = 0; //After first, the Interval time for clock tick.it_interval.tv_sec = C_SYSTEMTIME_COUNTER_BASE; tick.it_interval.tv_usec = 0; if (setitimer(ITIMER_REAL, &tick, NULL) < 0) { ms_error1("Set timer failed!\n"); exit(-1); } } /*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ** 函数名称: SystemTicktimer_isr ** 功能描述: 滴答时钟更新 ** 参数描述:无 ** 日  期: 2023年9月02日 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/ void SystemTicktimer_isr(void) { if (pSysPara->g_SystemTicksCounter < C_SYSTEMTIME_COUNTER_MAX) { pSysPara->g_SystemTicksCounter++; } else //时间值超出 这里直接将其初始化为 0 并没有做对齐处理 一般不会连续使用不会超过20天,另外 直接清0 并没有过多问题 kooloo add 20190411 { pSysPara->g_SystemTicksCounter = 0; } } /*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ** 函数名称: Timer_getNowTicks ** 功能描述: 获取滴答时钟 ** 参数描述:无 ** 日  期: 2023年9月02日 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/ int Timer_getNowTicks(void) { return pSysPara->g_SystemTicksCounter; } /*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ** 函数名称: Timer_getDiffValueTicks ** 功能描述: 获取当前Ticks差值 kooloo add 20190114 ** 参数描述:无 ** 日  期: 2023年9月02日 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/ int Timer_getDiffValueTicks(int StartTimeTicks) { int Tempi = Timer_getNowTicks(); if (Tempi < StartTimeTicks) //如果小于 实际不会有小于此种情况,但考虑程序的健壮性 增加此处代码 kooloo add 20190114 { return 0; //直接返回0 kooloo add 20190114 } else { return (Tempi - StartTimeTicks); //返回差值 kooloo add 20190114 } } /*::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ** 函数名称: SystemInterval_Iint ** 功能描述: 系统变量初始化 ** 参数描述:无 ** 日  期: 2023年9月02日 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/ void SystemInterval_Iint(void) { pSysPara->SystemUpTime = Timer_getNowTicks(); //时间更新判断计时变量 kooloo add 202311 pSysPara->g_TimeUpdateCounter = Timer_getNowTicks(); //时间更新判断计时变量 kooloo add 202311 pSysPara->g_ExeIsRunningCounter = Timer_getNowTicks(); //时间更新判断计时变量 kooloo add 202311 pSysPara->g_ExeIndex = C_SUBPRCESS_DevicePortGetApp; //Device 数据采集相关变量 pSysPara->g_GetApp_TimeCounter = Timer_getNowTicks(); //DevicePortGetApp 时间计数 kooloo add 202312 pSysPara->g_SendSubDevData_TimeCnt = Timer_getNowTicks(); //DevicePortGetApp 数据发送时间计数 kooloo add 202312 }