gpt4 book ai didi

c - 阻塞线程直到系统时钟发生第二次变化

转载 作者:行者123 更新时间:2023-11-30 15:01:22 24 4
gpt4 key购买 nike

我正在编写一个程序,根据我的系统时钟每秒发送脉冲输出。重要的是,这要尽可能准确。

在我在不同的系统上独立运行它之前,我目前正在使用 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;
}

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

最佳答案

您可以使用 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);
}

关于c - 阻塞线程直到系统时钟发生第二次变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41473422/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com