⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 timer.c

📁 泵站系统屏与屏之间的通信
💻 C
字号:
#include 	<stdio.h>#include 	<string.h>#include 	<stdlib.h>#include 	<fcntl.h>#include 	<time.h>#include 	<unistd.h>#include 	<errno.h>#include 	<signal.h>#include 	<sys/types.h>  #include 	<sys/stat.h>#include 	<sys/time.h>#include 	<sys/select.h>#include 	<linux/types.h>#include 	<linux/watchdog.h>#include 	"include/Timer.h" #include 	"include/libeeprom.h"#define		AP_CRC				"/tmp/crcfile"#define		MAX_AP_NAME		10extern  int main();extern  int Read_104Data_From_Memory(int iPort,unsigned char *pRead);void SetTime(CurrentTime NowTime){	struct tm p;	time_t timep;//	CurrentTime nowtime;	if(NowTime.year<38)	{		p.tm_year 	= NowTime.year + 100;		p.tm_mon 	= NowTime.month - 1;		p.tm_mday 	= NowTime.day;		p.tm_hour 	= NowTime.hour;		p.tm_min 	= NowTime.minute;		p.tm_sec 	= NowTime.second;  		timep		= mktime(&p);		stime(&timep);	}//	printf("set %04d %02d %02d %02d %02d %02d \n",NowTime.year+2000, NowTime.month, NowTime.day, NowTime.hour, NowTime.minute, NowTime.second);//	nowtime = GetTime();//	printf("get %04d %02d %02d %02d %02d %02d %d\n",nowtime.year+2000, nowtime.month, nowtime.day, nowtime.hour, nowtime.minute, nowtime.second, nowtime.mSecond);}	CurrentTime GetTime(void){	time_t timep;	struct tm *p;	struct timeval TV;	CurrentTime	NowTime;	time(&timep);	p = localtime(&timep);	NowTime.year		= (1900 + p->tm_year)%100;	NowTime.month		= 1 + p->tm_mon;	NowTime.day		= p->tm_mday;	NowTime.hour		= p->tm_hour;	NowTime.minute		= p->tm_min;	NowTime.second		= p->tm_sec;  	gettimeofday(&TV, NULL);	NowTime.mSecond 	= (p->tm_sec)*1000 + (TV.tv_usec)/1000;	return NowTime;}void SYS_Delay(int Msec){	struct timeval tv;                                                                  	unsigned long iDelay = Msec*1000;	tv.tv_sec = iDelay/1000000;	tv.tv_usec = iDelay%1000000; 	while(select(0, NULL, NULL, NULL, &tv) != 0);}int InitWatchDogFd(void){	int watchdog_fd;	int watchdog_timeout = 30; //设置看门狗启动时间,单位(秒)	do	{		SYS_Delay(50);		watchdog_fd = open("/dev/misc/watchdog", O_RDWR);	} while(watchdog_fd < 0);	ioctl(watchdog_fd, WDIOC_SETTIMEOUT, &watchdog_timeout);	fcntl(watchdog_fd, F_SETFL, fcntl(watchdog_fd, F_GETFL, 0) | O_NONBLOCK); 	return watchdog_fd;}void RefreshWatchDogFd(int WatchDogFd){	unsigned char watchdog_data = 1;	write(WatchDogFd, &watchdog_data, 1);}void Prompt_Info(int signo) { 	SysTickCount ++;	//printf("CurNetA=%d OldNetA=%d \nCurNetB=%d OldNetB=%d \n",CurNetA, OldNetA, CurNetB, OldNetB);	if(CurNetA != OldNetA)	//每 TimerDelay 毫秒检测一次,看A网线程是否死掉		OldNetA = CurNetA ; 	else		AllActive = 0 ;	if(CurNetB != OldNetB)	//每 TimerDelay 毫秒检测一次,看B网线程是否死掉		OldNetB = CurNetB ; 	else		AllActive = 0 ;			 if(AllActive)	//如果A, B网线程都处于运行状态,刷新看门狗	{//		printf("%dms Passed, A and B all Active, Refresh  Watchdog! \n",TimerDelay);		RefreshWatchDogFd(DogFd);	 }}void Init_Timer(void) { 	struct itimerval value; 	struct sigaction act; 	/*ITIMER_REAL:减少实际时间.到时的时候发出SIGALRM信号. ITIMER_VIRTUAL:减少有效时间(进程执行的时间).产生SIGVTALRM信号. ITIMER_PROF:减少进程的有效时间和系统时间(为进程调度用的时间).这个经常和上面一 个使用用来计算系统内核时间和用户时间.产生SIGPROF信号.*/	SysTickCount = 0;	unsigned long lDelay = TimerDelay*1000;	DogFd = InitWatchDogFd();	AllActive = 1 ;	CurNetA = CurNetB = 0 ;	OldNetA = OldNetB = 0 ;		act.sa_handler	= Prompt_Info; 	act.sa_flags		= 0; 	sigemptyset(&act.sa_mask); 	sigaction(SIGALRM, &act, NULL); 		value.it_value.tv_sec 		= lDelay/1000000 ; 	value.it_value.tv_usec	= lDelay/1000000 ;	value.it_interval			= value.it_value ; 	setitimer(ITIMER_REAL, &value, NULL); }unsigned short SYS_GetCRC(unsigned char *pCRC){	int i;	unsigned char *pStart = (unsigned char *)main;	unsigned char *pEnd = (unsigned char *)Read_104Data_From_Memory;	unsigned short crc=0;	unsigned char ucCode;	unsigned long ulLen;	if(pEnd<pStart)		ulLen=(unsigned long)(pStart-pEnd);	else		ulLen=(unsigned long)(pEnd-pStart);	while(ulLen--)	{		crc =crc ^ ((unsigned int)*pStart++ << 8);		for (i=0 ; i< 8 ; i++)		{			if (crc & 0x8000)			{				crc =crc <<1 ^ 0x1021;			}			else			{				crc =crc << 1;			}		}	}	for (i=0; i<4; i++)	{		ucCode =crc & 0xf;		crc =(crc>>4);		if (ucCode<=9)		{			*(pCRC+i)	=ucCode+'0';		}		else		{			*(pCRC+i)	=(ucCode-10)+'A';		}			}	return 4;}void SetApSerialNo(unsigned char *APVersion,int nLen){	int fd;	int bytes_left=nLen; 	int written_bytes; 	unsigned char *ptr  = APVersion;	if( (fd=open(AP_CRC,O_RDWR)) < 0 )	{		fd=open(AP_CRC,O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR);		if(fd<0)		{			fprintf(stderr,"Creat file Error:%s\n",strerror(errno));			return ;		}	}	while(bytes_left>0) 	{ 		written_bytes=write(fd,ptr,bytes_left); 		if(written_bytes<=0) 		{ 			if(errno == EINTR) /*中断错误,我们继续写*/ 				written_bytes=0; 			else				return ; 		} 		bytes_left -= written_bytes; 		ptr += written_bytes;	}	close(fd);}void	SYS_SetVersion(unsigned char *pApName,int verMajor,int verMinor){	int i;	unsigned char cCRC[MAX_AP_NAME+15];	for (i=0; i< MAX_AP_NAME; i++)	{		if (i<strlen(pApName))		{			cCRC[i]	=*(pApName+i);		}		else		{			cCRC[i]	=' ';		}	}	if (verMajor > 9)	{		cCRC[MAX_AP_NAME]=(verMajor/10)%10;	}	else	{		cCRC[MAX_AP_NAME]=' ';	}	cCRC[MAX_AP_NAME+1] = (verMajor%10)+'0';	cCRC[MAX_AP_NAME+2] = '.';	cCRC[MAX_AP_NAME+3] = (verMinor / 10) + '0';	cCRC[MAX_AP_NAME+4] = (verMinor % 10) + '0';	cCRC[MAX_AP_NAME+5] = ' ';	cCRC[MAX_AP_NAME+6] = 'C';	cCRC[MAX_AP_NAME+7] = 'R';	cCRC[MAX_AP_NAME+8] = 'C';	cCRC[MAX_AP_NAME+9] = '=';	SYS_GetCRC(&cCRC[MAX_AP_NAME+10]);		cCRC[MAX_AP_NAME+14] = 0;	SetApSerialNo(cCRC,MAX_AP_NAME+15);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -