zoukankan      html  css  js  c++  java
  • linux 精确延时

    void HeartBeat_Check_TASK(void *pdata)
    {
    struct timeval tv;
    struct timespec ts;
    int err;
    U32 dwcount=0;
    INT32U pend_time,coll_time_now,check_time,check_time_past;;
    INT32S timeout;
    struct tm *p=NULL;
    TIME_STRUC rtime={0};

    coll_time_now = NOW_TIME_MS;

    while(1)
    {
    pend_time = NOW_TIME_MS;

    //printf(" pend_time %d,coll_time_now %d ",pend_time,coll_time_now);

    timeout = ALARM_COLLECT_0P2SEC - (pend_time - coll_time_now); // - MCP_PROCESS_TIME_MAX;


    //这OSSemPend函数pend 时间是以tick为单位,timeout原本是毫秒,但是在调用这个函数时被变成了TICK
    //OSSemPend(mLDARecvSem, timeout, &err);
    if(timeout <= 0)
    {
    timeout = 1;
    }

    gettimeofday(&tv, NULL); /* 获取当前时间 */
    timeraddMS(&tv,timeout);
    ts.tv_sec = tv.tv_sec;
    ts.tv_nsec = tv.tv_usec * 1000;
    do{
    //tv.tv_sec=0;
    //tv.tv_usec=timeout*1000;
    //err=select(0,NULL,NULL,NULL,&tv);
    err=sem_timedwait(&mHeartTimeOutSem, &ts);
    }while(err<0 && errno==EINTR);

    check_time = NOW_TIME_MS;
    if(check_time-check_time_past<ALARM_COLLECT_0P2SEC)
    continue;
    check_time_past=NOW_TIME_MS;

    RPT_SendReportMessageHeartBeat();

    coll_time_now=coll_time_now+ALARM_COLLECT_0P2SEC;
    }

    }

    ALARM_COLLECT_0P2SEC是补时间用的;

    计时:

    gettimeofday(&tv, NULL); /* 获取当前时间 */
    timeraddMS(&tv,timeout);
    ts.tv_sec = tv.tv_sec;
    ts.tv_nsec = tv.tv_usec * 1000; 
    do{
    //tv.tv_sec=0;
    //tv.tv_usec=timeout*1000;
    //err=select(0,NULL,NULL,NULL,&tv); 
    err=sem_timedwait(&mHeartTimeOutSem, &ts); 
    }while(err<0 && errno==EINTR);

    注意:如果修改系统时间过快,可能会延时到来很快且多次,之后才能恢复正常;

    补充:需要加个自带时间计时,判断,防止信号量计时受系统时间修改影响。

  • 相关阅读:
    后缀自动机学习笔记
    [bzoj4516][Sdoi2016]生成魔咒——后缀自动机
    [bzoj1692][Usaco2007 Dec]队列变换——贪心+后缀数组
    BZOJ4811 [Ynoi2017]由乃的OJ
    codeforces796E Exam Cheating
    BZOJ1004 [HNOI2008]Cards
    BZOJ1798 [Ahoi2009]Seq 维护序列seq
    BZOJ4785 [Zjoi2017]树状数组
    UOJ207 共价大爷游长沙
    POJ3768 Katu Puzzle
  • 原文地址:https://www.cnblogs.com/xiaoyudian/p/8624459.html
Copyright © 2011-2022 走看看