2017-01-04 9 views
0

Я пишу программу для отправки импульсных выходов каждую секунду, согласно моим системным часам. Важно, чтобы это было так же точно, как я могу это сделать.Блокировать нить до тех пор, пока не будут внесены изменения в системные часы

Я использую XCode в качестве моего отладчика в настоящий момент, прежде чем я буду самостоятельно запускать его в другой системе.

Я использую отдельный pthread, который отправляет результат через функцию (не написанную мной).

Я знаю о sleep(int seconds) вызова, однако это не синхронизируется по часам, и я не слишком уверен в точности ...

Я искал вокруг для лучшего решения, но только попадались C's time.htm struct. Есть ли способ заблокировать мой поток, пока второй на 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; 
} 

Есть ли простой или лучший способ сделать это?

+0

Является ли это на самом деле, что соответствие сигналов, с системными часами важно, или было бы достаточно для того, * Интервал * между сигналами должен быть точным и последовательным? –

+0

"однако это приводит к ошибке выполнения". Какая ошибка в точности? – kaylum

+0

@JohnBollinger Я бы сказал, что последний, что бывший, но первый будет отличным дополнением, если это возможно * с * первым. –

ответ

1

Вы можете использовать функции сна до-абсолютного времени в clock_nanosleep() сделать это:

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