📄 timer.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 + -