linux系统下定时器,延时函数

本文详细介绍了基于信号处理的定时器模块实现方法,包括定时器初始化、计数值获取及时间判断函数。同时,提供了sleep和usleep函数的两种实现方式,适用于不同配置环境下精确延时的需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值