阻塞线程直到系统时钟发生第二次更改

时间:2017-01-04 21:19:56

标签: c time pthreads semaphore

根据我的系统时钟,我正在编写一个程序来每秒发送一次脉冲输出。重要的是,这一点和我能做到的一样准确。

我在使用XCode作为我的调试器之前,我在另一个系统上独立运行它。

我使用的是分离的pthread,它通过(不是由我编写)函数发送输出。

我知道sleep(int seconds)电话,但是时钟没有同步,我对准确性不太确定......

我搜索了一个更好的解决方案,但只遇到了C的time.h tm结构。有没有办法阻止我的线程,直到tm上的第二个更改,或任何其他更好的解决方案?

这是我的线程函数供参考。

/*One PPS*/
void *_THD_One_PPS(void *args) {
    /* Description: Send a 1 millisecond pulse every second */
    selfargs_t *self = args;
    pthread_detach(pthread_self());

    double dutyCycle = 0.001;

    long unsigned onTime = dutyCycle * 1000000000;      // Time signal high, ns

    while (self->myself->ThreadActiveStatus != THD_DONE) {
        sleep(1);   //TODO: Sync with clock as much as possible
        printf("/\\ ");
        setPinValue(BBB_GPIO_PIN_ONE_PPS, ON);
        pauseNanoSec(onTime);
        setPinValue(BBB_GPIO_PIN_ONE_PPS, OFF);
    }
    printf("Pulse Per Sec DIED");
    _T_ThreadsDied++;
    _T_ThreadsAlive--;
    self->myself->ThreadActiveStatus = THD_DONE;
    free(self->arguments);
    free(self);
    return NULL;
}

有没有简单或更好的方法来做到这一点?

1 个答案:

答案 0 :(得分:1)

您可以使用clock_nanosleep()的sleep-until-absolute-time功能来执行此操作:

const double dutyCycle = 0.001;
struct timespec deadline;

clock_gettime(CLOCK_MONOTONIC, &deadline);

while (self->myself->ThreadActiveStatus != THD_DONE) {
    /* Sleep until start of next second tick */
    deadline.tv_sec += 1;
    deadline.tv_nsec = 0;
    while (clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &deadline, NULL) != 0)
        if (errno != EINTR) return NULL;

    setPinValue(BBB_GPIO_PIN_ONE_PPS, ON);

    /* Sleep until duty cycle expired */
    deadline.tv_nsec = dutyCycle * 1000000000;
    while (clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &deadline, NULL) != 0)
        if (errno != EINTR) return NULL;

    setPinValue(BBB_GPIO_PIN_ONE_PPS, OFF);
}