1、定时器代码
drvTimer.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/time.h>
#include <unistd.h>
#include "drvTimer.h"
volatile unsigned long long timer_ms_cnt = 0;
void sig_timeOut_handle(int tmp)
{
timer_ms_cnt++;
}
static void timerInitSigaction(void)
{
struct itimerval tick;
signal(SIGALRM,sig_timeOut_handle);
//memset(&tick,0.sizeof(struct itimerval));
tick.it_value.tv_sec = 0; //1000 微秒后启用定时器
tick.it_value.tv_usec = 1000;
tick.it_interval = tick.it_value; //定时器间隔为1000 微秒
if(setitimer(ITIMER_REAL, &tick, NULL)<0){
printf("set timer failed!\n");
}
}
void timerModuleInit(void)
{
timerInitSigaction();
}
unsigned long long timerCntValueGet(void)
{
unsigned long long tmp_cnt = 0;
tmp_cnt = timer_ms_cnt;
return tmp_cnt;
}
bool isTimeToDo(unsigned int time_ms,unsigned long long* p_period_ms)
{
if(timer_ms_cnt - *p_period_ms >= time_ms){
*p_period_ms = timer_ms_cnt;
return true;
}else{
return false;
}
}
drvTimer.h
#ifndef _DRV_TIMER_H_
#define _DRV_TIMER_H_
extern void timerModuleInit(void);
extern unsigned long long timerCntValueGet(void);
extern bool isTimeToDo(unsigned int time_ms,unsigned long long* p_period_ms);
#endif
使用demo
main.cpp
int main(int argc, char *argv[])
{
MDEBUG(1, "JT-30 Main App Enter\n");
timerModuleInit();//1ms
unsigned long long period_2000ms = 0;
while(1)
{
if(FP_sys_IN_flag){
order_dispatch();
}
if(isTimeToDo(2000,&period_2000ms)){
//uartSendHeartBeat();
}
uartRecvMsgPro();
//do_usleep(200000);
}
return 0;
}
2、sleep和usleep
#ifdef CONFIG_SELECT_SLEEP
void do_usleep(unsigned long a_ulmicrosecs)
{
struct timeval my_timeout;
UDEBUG(4, "enter <%ld>\n", a_ulmicrosecs);
my_timeout.tv_sec = a_ulmicrosecs / 1000000L;
my_timeout.tv_usec = a_ulmicrosecs - (my_timeout.tv_sec * 1000000L);
// select() is notorious for returning early. That's why I specifically check&retry
while (my_timeout.tv_sec + my_timeout.tv_usec != 0)
{
select(1, 0, 0, 0, &my_timeout);
}
}
void do_sleep(unsigned long a_ulsecs)
{
struct timeval my_timeout;
UDEBUG(4, "enter <%ld>\n", a_ulsecs);
my_timeout.tv_sec = a_ulsecs;
my_timeout.tv_usec = 0;
// select() is notorious for returning early. That's why I specifically check&retry
while (my_timeout.tv_sec + my_timeout.tv_usec != 0)
{
select(1, 0, 0, 0, &my_timeout);
}
}
#else // else of CONFIG_SELECT_SLEEP
void do_usleep(unsigned long a_ulmicrosecs)
{
UDEBUG(4, "enter <%ld>\n", a_ulmicrosecs);
usleep(a_ulmicrosecs);
}
void do_sleep(unsigned long a_ulsecs)
{
UDEBUG(4, "enter <%ld>\n", a_ulsecs);
sleep(a_ulsecs);
}
#endif // end of CONFIG_SELECT_SLEEP