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);

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

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

  • 相关阅读:
    Linq to DataTable 左连接
    关于值类型和引用类型
    静态页生成
    技术是什么?
    关于GC垃圾回收的原理
    ADO.NET编程之美----数据访问方式(面向连接与面向无连接)
    Unity3d连接SQL Server数据库出现SocketException: 使用了与请求的协议不兼容的地址错误
    JAVA/GUI程序之记事本
    面试常见题
    unsafe
  • 原文地址:https://www.cnblogs.com/xiaoyudian/p/8624459.html
Copyright © 2011-2022 走看看