【发布时间】:2017-05-19 07:27:40
【问题描述】:
我正在编写一个程序,根据我的系统时钟每秒发送脉冲输出。重要的是,这要尽可能准确。
在我在不同的系统上独立运行它之前,我正在使用 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;
}
有没有简单或更好的方法来做到这一点?
【问题讨论】:
-
信号与系统时钟的对应关系真的很重要,还是信号之间的interval准确一致就足够了?
-
“但是这会导致运行时错误”。究竟是什么错误?
-
@JohnBollinger 我会说后者多于前者,但如果可能的话,前者将是一个很好的补充与前者。
-
这不是错误。这是预期的行为。任何信号都会中断
sleep。如果您没有附加调试器,您甚至不会看到它(sleep将提前终止)。所以我不确定这是否真的是一个需要寻找另一种解决方案的问题。问题是,您在 SIGKILL 上需要什么替代行为?